當配置審計發現資源配置有變更且不合規時,以事件通知的形式將告警推送到您指定的輕量消息隊列(原 MNS)主題。當您收到不合規告警時,通過函數計算2.0實現不合規資源的自動修復。
前提條件
請確保您已開通輕量消息隊列(原 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控制臺查看