全部產品
Search
文件中心

Cloud Config:企業多帳號情境下實現不合規資源自訂修正

更新時間:May 01, 2026

本文為您介紹在多帳號的情境下,如何利用資來源目錄提供的跨帳號管理能力以及配置審計的帳號組管理能力,實現跨帳號不合規資源自訂修正。

前提條件

  • 請確保您已開通資來源目錄。具體操作,請參見開通資來源目錄

  • 請確保您已開通Function Compute。具體操作,請參見開通Function Compute服務

    重要

    當您使用Function Compute服務運行函數時,會根據函數調用次數、資源使用方式以及公網出流量產生相關費用。更多資訊,請參見Function Compute計費概述

背景資訊

配置審計可以通過運行規則檢測不合規資源,並且設定自訂修正將不合規資源進行修正。當企業在多帳號情境下需要跨帳號的對不合規資源進行修正時,可以結合資來源目錄提供多級帳號和資源關係管理能力來實現。本文以ECS執行個體是否安裝CloudMonitor外掛程式為例,實現跨帳號的不合規資源檢測並自動修正,假設帳號A(帳號ID:100931896542****)在資來源目錄中擁有管理員權限(或配置審計委派管理員帳號),帳號B(帳號ID:178366182654****)與帳號A為相同資來源目錄的下成員帳號,是待修正不合規資源的所屬者。以下步驟介紹如何在帳號A中對帳號B進行不合規資源檢測並修正。

步驟一:資來源目錄管理員建立角色並添加授權策略

  1. 登入RAM控制台

  2. 建立角色。

    1. 在左側導覽列,單擊身份管理 > 角色

    2. 單擊创建角色,在创建角色面板中配置角色建立相關參數。

      1. 选择可信实体类型阿里雲賬號,單擊下一步

      2. 輸入角色名称,例如:ConfigCustomRemediationRole选择信任的云账号当前云账号

      3. 單擊完成

      4. 單擊關閉

  3. 建立權限原則。

    1. 在左側導覽列,單擊許可權管理 > 權限原則

    2. 單擊创建权限策略,進入创建权限策略編輯頁面。

      1. 切換至指令碼編輯頁簽,輸入以下權限原則指令碼。

        // 扮演該角色實體擁有安裝CloudMonitor外掛程式許可權 
        {
          "Version": "1",
          "Statement": [
            {
              "Effect": "Allow",
              "Action": "cms:InstallMonitoringAgent",
              "Resource": "*"
            },
            {
              "Action": "sts:AssumeRole",
              "Effect": "Allow",
              "Resource": "*"
            }
          ]
        }
      2. 單擊確認,填寫入權限策略名稱稱,例如ConfigCustomRemediationPolicy

      3. 單擊儲存

  4. 為角色添加授權。

    1. 在左側導覽列,單擊許可權管理 > 授權

    2. 單擊新增授权,在面板中為角色添加新的授權。

      1. 授权范围選擇整個雲帳號

      2. 授权主体輸入框中輸入ConfigCustomRemediationRole,並進行選中。

      3. 选择权限中切換至自定義策略頁簽,在對話方塊中輸入ConfigCustomRemediationPolicy,並進行選中。

      4. 單擊確定

  5. 為角色添加信任策略。

    1. 在左側導覽列,單擊身份管理 > 角色

    2. 在角色列表頁面搜尋角色名稱ConfigCustomRemediationRole,單擊搜尋目標角色名稱進入角色配置詳情頁面。

    3. 切換至信任策略管理頁簽,單擊修改信任策略,將修改策略調整成以下內容。

      // 允許Function Compute服務扮演該角色
      { 
        "Statement": [
          {
            "Action": "sts:AssumeRole",
            "Effect": "Allow",
            "Principal": {
              "RAM": [
                "acs:ram::100931896542****:root"
              ]
            }
          },
          {
            "Action": "sts:AssumeRole",
            "Effect": "Allow",
            "Principal": {
              "Service": [
                "fc.aliyuncs.com"
              ]
            }
          }
        ],
        "Version": "1"
      }
    4. 單擊確認

步驟二:資來源目錄成員帳號建立角色並添加授權策略

  1. 建立角色並為角色進行授權。

    具體操作,請參見步驟一中的子步驟1~4。

  2. 為角色添加信任策略。

    具體操作,請參見步驟一中子步驟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"
    }

步驟三:建立自訂修正函數

  1. 登入Function ComputeFC 3.0控制台

  2. 在左側導覽列,單擊函數

    1. 單擊创建函数,喚出创建函数面板。

    2. 選擇事件函數

      1. 基礎配置中填寫函數名稱,例如:ConfigRemediationService

      2. 規格方案單一實例並發度為系統預設設定。

  3. 彈性配置中彈性模式選擇為預設模式:按請求彈性 + 冷啟動

  4. 函数代码配置中運行環境選擇Python 3.9代碼上傳方式選擇使用範例程式碼

  5. 單擊建立,進入函數詳情頁。

    1. 函数详情頁簽中輸入以下資源修正函數代碼。

      #!/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執行個體未開啟CloudMonitor外掛程式進行修正,對於不同的業務情境使用者可以自訂修正邏輯
      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
  6. 單擊部署代碼

步驟四:建立規則並配置自訂修正

  1. 登入配置審計控制台

  2. 建立帳號組,將帳號A和帳號B加入至相同帳號組中。

    具體操作,請參見建立帳號組

  3. 在配置審計控制台左上方切換帳號組至上一步建立的帳號組。

  4. 建立規則,具體建立過程可參考基於模板建立規則

    1. 選擇創建方式頁面,先選擇基於模版創建,搜尋運行中的ECS執行個體安裝了CloudMonitor外掛程式規則並且選中,單擊下一步

    2. 設置基本屬性頁面,填寫規則名稱風險等級觸發機製描述資訊,然後單擊下一步

    3. 設置資源範圍頁面,保持預設配置,單擊下一步

    4. 設置修正頁面,開啟設定修正開關,選擇自定義修正,選擇觸發方式自動觸發,然後選擇函數ARN為步驟三所建立的函數,最後單擊提交

      說明

      如果自訂修正函數還在測試過程中,可以暫時將觸發方式調整為手動觸發,以便於調試觀察,當調試完成之後可以將觸發方式切換為自動觸發

步驟五:執行自訂修正並校正修正結果

  1. 規則頁面,單擊目標規則對應修正模板列的修正詳情

  2. 修正詳情頁簽,單擊修正詳情正後方的執行手動修正

    執行結果列表地區,您可以查看修正執行結果。對於修正失敗的資源,您還可以查看失敗原因。

    說明

    修正詳情頁簽,單擊修正模板正後方的函數ARN,進入Function Compute控制台的目標函數的函数代码頁簽。

相關文檔