当配置审计发现资源配置有变更且不合规时,以事件通知的形式将告警推送到您指定的轻量消息队列(原 MNS)主题。当您收到不合规告警时,通过函数计算实现不合规资源的自动修复。
前提条件
请确保您已开通轻量消息队列(原 MNS)服务。具体操作,请参见开通轻量消息队列(原 MNS)并授权。
请确保您已开通对象存储OSS服务,且已新建存储空间(Bucket)。具体操作,请参见开通OSS服务和控制台创建存储空间。
请确保您已开通函数计算服务。具体操作,请参见通过控制台创建函数应用。
应用场景
您在配置审计控制台通过规则模板“test-oss-bucket-public-read-prohibited”创建一条资源类型为“OSS存储空间”的规则,配置审计自动审计当前账号下所有OSS存储空间的资源,其中一条资源的合规结果为不合规,如下图所示。
数据规划
本文以修复对象存储OSS的存储空间的读写权限为例,为您介绍通过配置审计的MNS通知机制实现不合规资源自动修复的操作方法。相关数据规划如下表所示。
云服务 | 参数 | 示例 |
配置审计 | 规则模板 | oss-bucket-public-read-prohibited |
规则名称 | test-oss-bucket-public-read-prohibited | |
轻量消息队列(原 MNS) | 主题名称 | MNSTestConfig |
主题地域 | 华东2(上海) | |
对象存储OSS | OSS Bucket | config-snapshot |
Bucket ACL | 公共读 | |
函数计算 | 服务 | resource_repair |
服务的系统模板权限 | AliyunOSSFullAccess | |
函数 | oss_repair_acl_trigger | |
触发器 | ConfigRuleNonComplianceMNSTrigger |
由于配置审计部署在华东2(上海),为了减少网络损耗,建议轻量消息队列(原 MNS)的主题地域选择华东2(上海)。
操作流程
通过配置审计的MNS通知机制实现不合规资源自动修复的操作流程如下图所示。
操作步骤
登录配置审计控制台,设置资源合规事件投递到轻量消息队列(原 MNS)的指定主题(Topic),例如:MNSTestConfig。
具体操作,请参见设置投递数据到轻量消息队列(原 MNS)。
新建服务。
登录函数计算控制台。
在左侧导航栏,单击服务及函数。
在顶部菜单栏,选择地域,例如:华东2(上海)。
在服务列表页面,单击创建服务。
在创建服务面板,名称输入resource_repair。
单击确定。
授权目标服务修改OSS存储空间的权限。
在服务resource_repair的左侧导航栏,单击服务详情。
在角色配置区域,单击编辑。
选择一个包含权限策略AliyunOSSFullAccess的服务角色。
如果您没有符合要求的服务角色,请单击创建新的服务角色,在访问控制RAM控制台创建角色,该角色的可信实体类型必须选择阿里云服务、授信服务必须选择函数计算,权限策略必须选择AliyunOSSFullAccess。具体操作,请参见创建可信实体为阿里云服务的RAM角色。
单击保存。
新建函数。
在服务resource_repair的左侧导航栏,单击函数管理。
单击创建函数。
在创建函数页面,函数名称输入oss_repair_acl_trigger,运行环境选择Python 3.6,其他参数保持默认值。
单击创建。
配置函数的环境变量。
在函数oss_repair_acl_trigger的函数代码页签,单击函数配置页签。
在环境变量区域,单击编辑。
单击添加变量,输入该环境变量的变量名称和变量值。
变量为prepareRuleName。
prepareRuleName与函数计算自动修复代码中参数ENV_RULE_NAME的取值保持一致。
值为test-oss-bucket-public-read-prohibited。
test-oss-bucket-public-read-prohibited为配置审计中的规则名称。
单击确定。
新建触发器。
在函数oss_repair_acl_trigger的函数配置页签,单击触发器管理页签。
单击创建触发器。
选择触发器类型为轻量消息队列。
设置轻量消息队列(原 MNS)触发器的相关参数。
参数设置如下:
名称输入ConfigRuleNonComplianceMNSTrigger。
MNS地域选择华东2(上海)。
主题选择MNSTestConfig。
Event格式选择STREAM。
角色名称选择AliyunMNSNotificationRole。
单击确定。
新建触发器完成后,当配置审计对目标资源进行评估时,您会接收到该资源的不合规事件通知。
配置自动修复代码。
在函数oss_repair_acl_trigger的触发器管理页签,单击函数代码页签。
单击文件index.py。
拷贝并粘贴如下代码至文件index.py。
# -*- coding: utf-8 -*- import logging import json import os import base64 import binascii import oss2 from aliyunsdkcore.acs_exception.exceptions import ClientException, ServerException IDENTIFIER = 'evaluationResultIdentifier' QUALIFIER = 'evaluationResultQualifier' RULE_NAME = 'configRuleName' ENV_RULE_NAME = 'prepareRuleName' RESOURCE_ID = 'resourceId' REGION_ID = 'regionId' FAIL = 'fail' SUCC = 'success' logger = logging.getLogger() def handler(event, context): logger.info("mns_topic trigger event = {}".format(event)) decoded = None if event: try: decoded = base64.b64decode(event) except binascii.Error as ex: logger.exception('mns_topic trigger event malformed!') return FAIL if not decoded: return FAIL notify_json = json.loads(decoded) if notify_json and IDENTIFIER in notify_json: evaluationResultIdentifier = notify_json.get(IDENTIFIER) if QUALIFIER in evaluationResultIdentifier and RULE_NAME in evaluationResultIdentifier.get(QUALIFIER): evaluationResultQualifier = evaluationResultIdentifier.get(QUALIFIER) configRuleName = evaluationResultQualifier.get(RULE_NAME) # os.environ.get(ENV_RULE_NAME) 获取您设置的规则名称,例如:test-oss-bucket-public-read-prohibited。 if configRuleName == os.environ.get(ENV_RULE_NAME): if RESOURCE_ID in evaluationResultQualifier and REGION_ID in evaluationResultQualifier: bucket_name = evaluationResultQualifier.get(RESOURCE_ID) region = evaluationResultQualifier.get(REGION_ID) if region and bucket_name: try: remedy_by_fc_assume(context, region, bucket_name) except Exception as ex: logger.exception('remedy fail!') return FAIL def remedy_by_fc_assume(context, region, bucket_name): creds = context.credentials auth = oss2.StsAuth(creds.access_key_id, creds.access_key_secret, creds.security_token) bucket = oss2.Bucket(auth, 'http://oss-' + region + '.aliyuncs.com', bucket_name) bucket.put_bucket_acl(oss2.BUCKET_ACL_PRIVATE) logger.info('bucket {bucket_name} in {region} acl remedy succ.'.format(bucket_name=bucket_name, region=region))
说明本段代码以规则名称prepareRuleName为例,为您介绍不合规资源的自动修复方法。如需通过其他参数修复,请参见资源不合规事件内容示例。
单击左上角的部署代码 。
十分钟后,查看修复结果。
说明当资源配置无变更,且审计结果为不合规时,您还需要手动执行审计,然后再执行此步骤。手动执行审计的操作方法,请参见手动执行审计。
通过配置审计控制台查看
通过OSS控制台查看