全部產品
Search
文件中心

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

更新時間:Dec 11, 2024

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

前提條件

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

  • 請確保您已開通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 Compute控制台

  2. 建立服務。

    1. 在左側導覽列,單擊服務及函數

    2. 單擊建立服務,喚出建立服務面板。

      1. 填寫服務名稱,例如:ConfigRemediationService

      2. 選擇服務角色ConfigCustomRemediationRole

      3. 單擊確定

  3. 建立自訂修正函數。

    1. 在函數管理頁面左側導覽列選擇函數管理

    2. 單擊建立函數,進入建立函數配置頁面。

      1. 函數建立方式使用內建運行時建立

      2. 基本設定中填寫函數名稱,例如:ConfigRemediationFunction請求處理常式類型選擇處理事件請求

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

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

      5. 函數代碼頁簽中輸入以下資源修正函數代碼。

        #!/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

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

  1. 登入配置審計控制台

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

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

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

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

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

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

    3. 設定生效範圍頁面,保持預設配置,單擊下一步

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

      說明

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

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

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

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

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

    說明

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

相關文檔