本文為您介紹在多賬號的場景下,如何利用資源目錄提供的跨賬號管理能力以及配置審計的賬號組管理能力,實現跨賬號不合規資源自動修正。
前提條件
背景信息
配置審計可以通過運行規則檢測不合規資源,并且設置自定義修正將不合規資源進行修正。當企業在多賬號場景下需要跨賬號的對不合規資源進行修正時,可以結合資源目錄提供多級賬號和資源關系管理能力來實現。本文以ECS實例是否安裝云監控插件為例,實現跨賬號的不合規資源檢測并自動修正,假設賬號A(賬號ID:100931896542****)在資源目錄中擁有管理員權限(或配置審計委派管理員賬號),賬號B(賬號ID:178366182654****)與賬號A為相同資源目錄的下成員賬號,是待修正不合規資源的所屬者。以下步驟介紹如何在賬號A中對賬號B進行不合規資源檢測并修正。
步驟一:資源目錄管理員創建角色并添加授權策略
登錄RAM控制臺。
創建角色。
在左側導航欄,單擊身份管理 > 角色。
單擊創建角色,在創建角色面板中配置角色創建相關參數。
選擇可信實體類型為阿里云賬號,單擊下一步。
輸入角色名稱,例如:
ConfigCustomRemediationRole
,選擇信任的云賬號為當前云賬號。單擊完成。
單擊關閉。
創建權限策略。
在左側導航欄,單擊權限管理 > 權限策略。
單擊創建權限策略,進入創建權限策略編輯頁面。
切換至腳本編輯頁簽,輸入以下權限策略腳本。
// 扮演該角色實體擁有安裝云監控插件權限 { "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "cms:InstallMonitoringAgent", "Resource": "*" }, { "Action": "sts:AssumeRole", "Effect": "Allow", "Resource": "*" } ] }
單擊確認,填寫權限策略名稱,例如
ConfigCustomRemediationPolicy
。單擊保存。
為角色添加授權。
在左側導航欄,單擊權限管理 > 授權。
單擊新增授權,在面板中為角色添加新的授權。
授權范圍選擇整個云賬號。
在授權主體輸入框中輸入
ConfigCustomRemediationRole
,并進行選中。選擇權限中切換至自定義策略頁簽,在對話框中輸入
ConfigCustomRemediationPolicy
,并進行選中。單擊確定。
為角色添加信任策略。
在左側導航欄,單擊身份管理 > 角色。
在角色列表頁面搜索角色名稱
ConfigCustomRemediationRole
,單擊搜索目標角色名稱進入角色配置詳情頁面。切換至信任策略管理頁簽,單擊修改信任策略,將修改策略調整成以下內容。
// 允許函數計算服務扮演該角色 { "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "RAM": [ "acs:ram::100931896542****:root" ] } }, { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "fc.aliyuncs.com" ] } } ], "Version": "1" }
單擊確認。
步驟二:資源目錄成員賬號創建角色并添加授權策略
創建角色并為角色進行授權。
具體操作,請參見步驟一中的子步驟1~4。
為角色添加信任策略。
具體操作,請參見步驟一中子步驟5,并將信任策略調整成以下內容。
// 允許資源目錄管理員100931896542****扮演該角色 { "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "RAM": [ "acs:ram::178366182654****:root" ] } }, { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "RAM": [ "acs:ram::100931896542****:role/configcustomremediationrole" ] } } ], "Version": "1" }
步驟三:創建自定義修正函數
登錄函數計算控制臺。
創建服務。
在左側導航欄,單擊服務及函數。
單擊創建服務,喚出創建服務面板。
填寫服務名稱,例如:
ConfigRemediationService
。選擇服務角色為
ConfigCustomRemediationRole
。單擊確定。
創建自定義修正函數。
在函數管理頁面左側導航欄選擇函數管理。
單擊創建函數,進入創建函數配置頁面。
函數創建方式使用內置運行時創建。
基本設置中填寫函數名稱,例如:
ConfigRemediationFunction
,請求處理程序類型選擇處理事件請求。函數代碼配置中運行環境選擇Python 3.9,代碼上傳方式選擇使用示例代碼。
單擊創建,進入函數詳情頁。
在函數代碼頁簽中輸入以下資源修正函數代碼。
#!/usr/bin/env python # -*- encoding: utf-8 -*- import json from aliyunsdkcore.client import AcsClient from aliyunsdkcore.acs_exception.exceptions import ClientException from aliyunsdkcore.acs_exception.exceptions import ServerException from aliyunsdkcore.request import CommonRequest from aliyunsdkcore.auth.credentials import StsTokenCredential from aliyunsdksts.request.v20150401.AssumeRoleRequest import AssumeRoleRequest import logging logger = logging.getLogger() # 此處示例代碼針對ECS實例未開啟云監控插件進行修正,對于不同的業務場景用戶可以自定義修正邏輯 def handler(event, context): get_resources_non_compliant(event, context) def get_resources_non_compliant(event, context): resources = parse_json(event) for resource in resources: remediation(resource, context) def parse_json(content): """ Parse string to json object :param content: json string content :return: Json object """ try: return json.loads(content) except Exception as e: logger.error('Parse content:{} to json error:{}.'.format(content, e)) return None def remediation(resource, context): logger.info(resource) region_id = resource['regionId'] account_id = resource['accountId'] resource_id = resource['resourceId'] resource_type = resource['resourceType'] config_rule_id = resource['configRuleId'] if resource_type == 'ACS::ECS::Instance': logger.info("process account_id: {}, resource_id: {}, config_rule_id: {}".format( account_id, resource_id, config_rule_id)) install_monitoring_agent(context, account_id, region_id, resource_id) def install_monitoring_agent(context, account_id, resource_region_id, resource_id): logger.info("start install agent {}: {}".format(resource_region_id, resource_id)) token = assume_role_and_get_token(context, account_id, resource_region_id) client = AcsClient(token['Credentials']['AccessKeyId'], token['Credentials']['AccessKeySecret'], region_id=resource_region_id) request = CommonRequest() request.set_accept_format('json') request.set_domain(f'metrics.{resource_region_id}.aliyuncs.com') request.set_method('POST') request.set_protocol_type('https') # https | http request.set_version('2019-01-01') request.set_action_name('InstallMonitoringAgent') request.add_query_param('InstanceIds.1', resource_id) request.add_query_param('Force', "true") request.add_query_param('SecurityToken', token['Credentials']['SecurityToken']) response = client.do_action_with_exception(request) logger.info(response) # 通過扮演獲取臨時token,注意該方法一般只需替換為實際需要扮演的角色名稱即可 def assume_role_and_get_token(context, account_id, region_id): creds = context.credentials logger.info('assume_role_and_get_token begin.') credentials = StsTokenCredential(creds.access_key_id, creds.access_key_secret, creds.security_token) client = AcsClient(credential=credentials) request = AssumeRoleRequest() request.set_domain(f'sts-vpc.{region_id}.aliyuncs.com') request.set_accept_format('json') request.set_RoleArn(f'acs:ram::{account_id}:role/configcustomremediationrole') request.set_RoleSessionName("ConfigCustomRemediationRole") response = client.do_action_with_exception(request) logger.info('assume_role_and_get_token response : {}.'.format(response)) token = json.loads(response) logger.info('assume_role_and_get_token: {}, assume role: {}.'.format(context.credentials, token)) return token
步驟四:創建規則并配置自定義修正
登錄配置審計控制臺。
創建賬號組,將賬號A和賬號B加入至相同賬號組中。
具體操作,請參見創建賬號組。
在配置審計控制臺左上角切換賬號組至上一步創建的賬號組。
創建規則,具體創建過程可參考基于模板創建規則。
在選擇創建方式頁面,先選擇基于模板創建,搜索運行中的ECS實例安裝了云監控插件規則并且選中,單擊下一步。
在設置基本屬性頁面,填寫規則名稱、風險等級、觸發機制和描述信息,然后單擊下一步。
在設置生效范圍頁面,保持默認配置,單擊下一步。
在設置修正頁面,打開設置修正開關,選擇自定義修正,選擇觸發方式為自動觸發,然后選擇函數ARN為步驟三所創建的函數,最后單擊提交。
說明如果自定義修正函數還在測試過程中,可以暫時將觸發方式調整為手動觸發,以便于調試觀察,當調試完成之后可以將觸發方式切換為自動觸發。
步驟五:執行自定義修正并校驗修正結果
在規則頁面,單擊目標規則對應修正模板列的修正詳情。
在修正詳情頁簽,單擊修正詳情正后方的執行手動修正。
在執行結果列表區域,您可以查看修正執行結果。對于修正失敗的資源,您還可以查看失敗原因。
說明在修正詳情頁簽,單擊修正模板正后方的函數ARN,進入函數計算控制臺的目標函數的函數代碼頁簽。