设置自定义修正

当您选择从模板创建规则或自定义创建规则时,均可以设置自定义修正,通过函数计算FC修正不合规资源。当该条规则绑定的资源被判定为不合规时,可以执行修正,快速修正不合规资源。

前提条件

请确保您已开通函数计算FC。具体操作,请参见开通服务

背景信息

本文以从模板选择规则模板运行中的ECS实例未绑定公网地址创建规则为例,为您介绍设置自定义修正和执行修正的方法。

规则模板运行中的ECS实例未绑定公网地址用于检测运行中的ECS实例是否直接绑定IPv4公网地址。如果ECS实例检测结果为“不合规”(即绑定公网IP地址),则批量停止有公网IP的ECS实例。

操作步骤

  1. 登录配置审计控制台

  2. (可选)在左上角选择目标账号组。

    仅资源目录下的管理账号需要执行该操作。单个阿里云账号不涉及。

  3. 在左侧导航栏,选择合规审计 > 规则

  4. 规则页面,单击新建规则

  5. 选择创建方式页面,先选择基于模板创建,再从模板中选择规则运行中的ECS实例未绑定公网地址,然后单击下一步

  6. 设置基本属性页面,各参数均保持默认值,单击下一步

  7. 设置生效范围页面,各参数均保持默认值,单击下一步

  8. 修正设置页面,打开设置修正开关,先选择自定义修正,再选择触发方式手动触发,然后选择函数ARN,最后单击提交

    重要
    • 由于自动修正会根据您的预设参数自动修改不合规资源的配置信息,可能会影响业务的连续性,因此系统默认触发方式手动触发,推荐您使用默认设置。

    • 当您确保本次修正不会对业务造成影响时,可以选择触发方式自动触发,当配置审计检测到不合规资源时,会自动执行修正。

    单击前往创建新的函数,在函数计算控制台上创建服务和函数。具体操作,请参见快速创建函数

    创建函数时,函数类型选择事件函数运行环境选择python 3,其他参数均可根据实际需求设置,函数代码示例如下:

    #!/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.auth.credentials import AccessKeyCredential
    from aliyunsdkcore.auth.credentials import StsTokenCredential
    from aliyunsdkecs.request.v20140526.StopInstanceRequest import StopInstanceRequest
    from aliyunsdkcore.auth.credentials import AccessKeyCredential
    from aliyunsdkcore.auth.credentials import StsTokenCredential
    from aliyunsdkkms.request.v20160120.DecryptRequest import DecryptRequest
    
    # -*- coding: utf-8 -*-
    
    import logging
    import json
    
    logger = logging.getLogger()
    
    
    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' and config_rule_id == 'cr-f8a1626622af005d****':
            print(region_id, account_id, resource_id, resource_type, config_rule_id)
            stop_ecs_instance(context, region_id, resource_id)
    
    def stop_ecs_instance(context, resource_region_id, resource_id):
        logger.info("注意:开始停机操作{}{}".format(resource_region_id, resource_id))
    
        creds = context.credentials
        client = AcsClient(creds.access_key_id, creds.access_key_secret, region_id=resource_region_id)
    
        request = StopInstanceRequest()
        request.set_accept_format('json')
        request.set_InstanceId("i-hp3f6lofgrnml5mt****")
        request.set_StoppedMode("KeepCharging")
        request.add_query_param('SecurityToken', creds.security_token)
    
        response = client.do_action_with_exception(request)
        logger.info(response)
    说明

    自定义修正的最新函数代码示例,请参见aliyun-config-remediation.py

    本函数代码中的主要函数如下:

    • handler:为配置审计触发的默认函数入口,即自定义修正触发时调用的函数。handler在新建函数时进行设置。

    • get_resources_non_compliant:解析不合规资源。

    • remediation:为自定义修正入口,可以根据您的检测需求设置。例如:规则模板“运行中的ECS实例未绑定公网地址”,如果检测结果为“不合规”(即绑定公网IP地址),则修正为停机操作。

  9. 手动执行修正。

    1. 规则页面,单击目标规则对应修正模板列的修正详情

    2. 修正详情页签,单击修正详情正后方的执行手动修正

      执行结果列表区域,您可以查看修正执行结果。对于修正失败的资源,您还可以查看失败原因。

      说明

      修正详情页签,单击修正模板正后方的函数ARN,进入函数计算控制台的目标函数的函数代码页签。

相关文档

在多账号场景下,函数代码及授权配置,请参见企业多账号场景下实现不合规资源自动修正