企業(yè)多賬號場景下實現(xiàn)不合規(guī)資源自動修正
本文為您介紹在多賬號的場景下,如何利用資源目錄提供的跨賬號管理能力以及配置審計的賬號組管理能力,實現(xiàn)跨賬號不合規(guī)資源自動修正。
前提條件
請確保您已開通資源目錄。具體操作,請參見開通資源目錄。
請確保您已開通函數(shù)計算。具體操作,請參見開通函數(shù)計算服務(wù)。
重要當(dāng)您使用函數(shù)計算服務(wù)運行函數(shù)時,會根據(jù)函數(shù)調(diào)用次數(shù)、資源使用情況以及公網(wǎng)出流量產(chǎn)生相關(guān)費用。更多信息,請參見函數(shù)計算計費概述。
背景信息
配置審計可以通過運行規(guī)則檢測不合規(guī)資源,并且設(shè)置自定義修正將不合規(guī)資源進行修正。當(dāng)企業(yè)在多賬號場景下需要跨賬號的對不合規(guī)資源進行修正時,可以結(jié)合資源目錄提供多級賬號和資源關(guān)系管理能力來實現(xiàn)。本文以ECS實例是否安裝云監(jiān)控插件為例,實現(xiàn)跨賬號的不合規(guī)資源檢測并自動修正,假設(shè)賬號A(賬號ID:100931896542****)在資源目錄中擁有管理員權(quán)限(或配置審計委派管理員賬號),賬號B(賬號ID:178366182654****)與賬號A為相同資源目錄的下成員賬號,是待修正不合規(guī)資源的所屬者。以下步驟介紹如何在賬號A中對賬號B進行不合規(guī)資源檢測并修正。
步驟一:資源目錄管理員創(chuàng)建角色并添加授權(quán)策略
登錄RAM控制臺。
創(chuàng)建角色。
在左側(cè)導(dǎo)航欄,單擊身份管理 > 角色。
單擊創(chuàng)建角色,在創(chuàng)建角色面板中配置角色創(chuàng)建相關(guān)參數(shù)。
選擇可信實體類型為阿里云賬號,單擊下一步。
輸入角色名稱,例如:
ConfigCustomRemediationRole
,選擇信任的云賬號為當(dāng)前云賬號。單擊完成。
單擊關(guān)閉。
創(chuàng)建權(quán)限策略。
在左側(cè)導(dǎo)航欄,單擊權(quán)限管理 > 權(quán)限策略。
單擊創(chuàng)建權(quán)限策略,進入創(chuàng)建權(quán)限策略編輯頁面。
切換至腳本編輯頁簽,輸入以下權(quán)限策略腳本。
// 扮演該角色實體擁有安裝云監(jiān)控插件權(quán)限 { "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "cms:InstallMonitoringAgent", "Resource": "*" }, { "Action": "sts:AssumeRole", "Effect": "Allow", "Resource": "*" } ] }
單擊繼續(xù)編輯基本信息,填寫權(quán)限策略名稱,例如
ConfigCustomRemediationPolicy
。單擊保存。
為角色添加授權(quán)。
在左側(cè)導(dǎo)航欄,單擊權(quán)限管理 > 授權(quán)。
單擊新增授權(quán),在新增授權(quán)面板中為角色新增授權(quán)。
授權(quán)范圍選擇整個云賬號。
在授權(quán)主體輸入框中輸入
ConfigCustomRemediationRole
,并進行選中。選擇權(quán)限中切換至自定義策略頁簽,在對話框中輸入
ConfigCustomRemediationPolicy
,并進行選中。單擊確定。
為角色添加信任策略。
在左側(cè)導(dǎo)航欄,單擊身份管理 > 角色。
在角色列表頁面搜索角色名稱
ConfigCustomRemediationRole
,單擊搜索目標(biāo)角色名稱進入角色配置詳情頁面。切換至信任策略管理頁簽,單擊修改信任策略,將修改策略調(diào)整成以下內(nèi)容。
// 允許函數(shù)計算服務(wù)扮演該角色 { "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "RAM": [ "acs:ram::100931896542****:root" ] } }, { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "fc.aliyuncs.com" ] } } ], "Version": "1" }
單擊確認。
步驟二:資源目錄成員賬號創(chuàng)建角色并添加授權(quán)策略
創(chuàng)建角色并為角色進行授權(quán)。
具體操作,請參見步驟一中的子步驟1~4。
為角色添加信任策略。
具體操作,請參見步驟一中子步驟5,并將信任策略調(diào)整成以下內(nèi)容。
// 允許資源目錄管理員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" }
步驟三:創(chuàng)建自定義修正函數(shù)
登錄函數(shù)計算控制臺。
創(chuàng)建服務(wù)。
在左側(cè)導(dǎo)航欄,單擊服務(wù)及函數(shù)。
單擊創(chuàng)建服務(wù),喚出創(chuàng)建服務(wù)面板。
填寫服務(wù)名稱,例如:
ConfigRemediationService
。選擇服務(wù)角色為
ConfigCustomRemediationRole
。單擊確定。
創(chuàng)建自定義修正函數(shù)。
在函數(shù)管理頁面左側(cè)導(dǎo)航欄選擇函數(shù)管理。
單擊創(chuàng)建函數(shù),進入創(chuàng)建函數(shù)配置頁面。
函數(shù)創(chuàng)建方式使用內(nèi)置運行時創(chuàng)建。
基本設(shè)置中填寫函數(shù)名稱,例如:
ConfigRemediationFunction
,請求處理程序類型選擇處理事件請求。函數(shù)代碼配置中運行環(huán)境選擇Python 3.9,代碼上傳方式選擇使用示例代碼。
單擊創(chuàng)建,進入函數(shù)詳情頁。
在函數(shù)代碼頁簽中輸入以下資源修正函數(shù)代碼。
#!/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實例未開啟云監(jiān)控插件進行修正,對于不同的業(yè)務(wù)場景用戶可以自定義修正邏輯 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
步驟四:創(chuàng)建規(guī)則并配置自定義修正
登錄配置審計控制臺。
創(chuàng)建賬號組,將賬號A和賬號B加入至相同賬號組中。
具體操作,請參見創(chuàng)建賬號組。
在配置審計控制臺左上角切換賬號組至上一步創(chuàng)建的賬號組。
創(chuàng)建規(guī)則,具體創(chuàng)建過程可參考基于模板創(chuàng)建規(guī)則。
在選擇創(chuàng)建方式頁面,先選擇基于模板創(chuàng)建,搜索運行中的ECS實例安裝了云監(jiān)控插件規(guī)則并且選中,單擊下一步。
在設(shè)置基本屬性頁面,填寫規(guī)則名稱、風(fēng)險等級、觸發(fā)機制和描述信息,然后單擊下一步。
在設(shè)置生效范圍頁面,保持默認配置,單擊下一步。
在設(shè)置修正頁面,打開設(shè)置修正開關(guān),選擇自定義修正,選擇觸發(fā)方式為自動觸發(fā),然后選擇函數(shù)ARN為步驟三所創(chuàng)建的函數(shù),最后單擊提交。
說明如果自定義修正函數(shù)還在測試過程中,可以暫時將觸發(fā)方式調(diào)整為手動觸發(fā),以便于調(diào)試觀察,當(dāng)調(diào)試完成之后可以將觸發(fā)方式切換為自動觸發(fā)。
步驟五:執(zhí)行自定義修正并校驗修正結(jié)果
在規(guī)則頁面,單擊目標(biāo)規(guī)則對應(yīng)修正模板列的修正詳情。
在修正詳情頁簽,單擊修正詳情正后方的執(zhí)行手動修正。
在執(zhí)行結(jié)果列表區(qū)域,您可以查看修正執(zhí)行結(jié)果。對于修正失敗的資源,您還可以查看失敗原因。
說明在修正詳情頁簽,單擊修正模板正后方的函數(shù)ARN,進入函數(shù)計算控制臺的目標(biāo)函數(shù)的函數(shù)代碼頁簽。