文档首页/ 配置审计 Config/ 最佳实践/ 通过Config实现资源自动化管理
更新时间:2025-01-21 GMT+08:00
分享

通过Config实现资源自动化管理

本文为您介绍如何通过配置审计服务的资源评估和合规修正能力,自动化实现不合规资源的发现和修正。通过该流程,可以确保云上任意用户,无论有意还是无意的行为,造成了资源不合规,都可以在几分钟内被该流程自动修复,从而保证了云上的资源安全。

应用场景

具体场景:用户在云上的OBS桶,应该使用桶策略避免客户端误使用HTTP协议进行OBS业务操作,详见确保您的数据在传输到OBS过程中不被窃取和篡改

操作流程

创建合规规则:

  1. 登录配置审计控制台
  2. 在左侧导航栏,选择资源合规。
  3. 在规则页面,单击“添加规则”。
  4. 选择预设策略“OBS桶策略授权行为使用SSL加密”,单击“下一步”。
  5. 在规则参数页面,保持默认的资源范围,区域选择“全部”,完成规则创建。
  6. 返回规则列表页面,查看新建合规规则的评估结果。

配置修正函数:

以python方式为例,为您介绍如何通过FunctionGraph实现资源的自动修正。

  1. 登录函数工作流控制台
  2. 在左侧导航栏,选择函数。
  3. 在函数列表页面,单击“创建函数”。
  4. 函数类型选择“事件函数”,运行时选择“Python3.9”,选择一个合适的委托,至少包含如下权限:
{
    "Version": "1.1",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "obs:bucket:PutBucketPolicy",
                "obs:bucket:GetBucketPolicy",
                "rms:resources:get"
            ]
        }
    ]
}
  1. 完成函数创建后,为函数添加“huaweicloudsdk_obs”和“huaweicloudsdkconfig”两个依赖包。

  2. 在“index.py”中贴入如下代码。
    import json
    
    from obs.client import ObsClient
    from huaweicloudsdkcore.auth.credentials import GlobalCredentials
    from huaweicloudsdkconfig.v1.region.config_region import ConfigRegion 
    from huaweicloudsdkconfig.v1.config_client import ConfigClient 
    from huaweicloudsdkconfig.v1 import ShowResourceDetailRequest 
    
    def get_resource_region(context, domain_id, resource_id):
        auth = GlobalCredentials(
            ak=context.getSecurityAccessKey(),
            sk=context.getSecuritySecretKey(),
            domain_id=domain_id
        ).with_security_token(context.getSecurityToken())
        client = ConfigClient.new_builder() \
            .with_credentials(credentials=auth) \
            .with_region(region=ConfigRegion.value_of(region_id="cn-north-4")) \
            .build()
        resource = client.show_resource_detail(ShowResourceDetailRequest(resource_id)).to_json_object()
        return resource.get("region_id")
    
    def getBucketPolicy(obsClient, bucket_name):
        resp = obsClient.getBucketPolicy(bucket_name)
        if resp.status < 300:
            print("Get Bucket Policy Succeeded")
            return resp.body.policyJSON
        if resp.status == 404 and resp.errorCode == "NoSuchBucketPolicy":
            print("NoSuchBucketPolicy")
            return "{\"Statement\": []}"
        assert False, f"Get Bucket Policy Failed: {resp.errorCode} | {resp.errorMessage}"
    
    def ensurePolicySSL(obsClient, bucket_name, policy):
        policy["Statement"] = policy["Statement"] + [{
            "Sid": "ensure_secure_transport",
            "Effect": "Deny",
            "Principal": {"ID": ["*"]},
            "Action": ["*"],
            "Resource": [bucket_name, bucket_name + "/*"],
            "Condition": {"Bool": {"g:SecureTransport": ["false"]}}
        }]
        resp = obsClient.setBucketPolicy(bucket_name, policy)
        if resp.status < 300:
            print("Set Bucket Policy Succeeded")
        else:
            print(policy)
            assert False, f"Set Bucket Policy Failed: {resp.errorCode} | {resp.errorMessage}"
    
    def handler(event, context):
        domain_id = event.get("domain_id")
        bucket_name = event.get("bucket_name")
        print("domain_id", domain_id)
        print("bucket_name", bucket_name)
    
        region_id = get_resource_region(context, domain_id, bucket_name)
        print("region_id", region_id)
    
        server = f"https://obs.{region_id}.myhuaweicloud.com"
        obsClient = ObsClient(
            access_key_id=context.getSecurityAccessKey(),
            secret_access_key=context.getSecuritySecretKey(),
            server=server,
            security_token=context.getSecurityToken()
        )
        policy = getBucketPolicy(obsClient, bucket_name)
        policy = json.loads(policy)
        ensurePolicySSL(obsClient, bucket_name, policy)
        obsClient.close()
  3. (可选)在函数的设置页面适当修改函数的“执行超时时间”和“内存”,并启用日志配置。强烈建议您执行该项操作,否则资源修正的行为有可能会失败,且您无法通过日志记录定位函数执行的错误原因。

配置合规修正:

  1. 登录配置审计控制台
  2. 在左侧导航栏,选择资源合规。
  3. 在规则页面,单击规则名称。
  4. 进入规则详情页面,选择“修正管理”,单击“修正配置”。
  5. 选择“手动修正”或“自动修正”,重试时间和重试次数使用默认值。
  6. 选择“FGS模版”,选中前一步中所配置的函数。
  7. 依赖于资源类型设置为“bucket_name”,参数中键和值分别输入domain_id 和 账号ID的值。
  8. 单击“保存”,完成合规修正的配置。

资源的手动修正:

如果您在上一步的修正方法中选择“手动修正”,则需要进行如下操作。

  1. 重新进入修正配置的页面。
  2. 在资源范围页面勾选您需要处理的资源:
    • 如果资源属于您认为需要处理的资源,则单击“执行修正”。
    • 如果资源属于您认为不需要处理的资源,则单击“加入修正例外”。
  3. 登录对象存储服务控制台,进入您刚才执行修正的OBS桶的详情页。
  4. 进入权限控制的桶策略页面,确认桶策略内容已经被更新。

常见问题

手动修正和自动修正的区别?

如果配置为手动修正,则需要用户主动查询不合规资源,并执行修正;如果配置为自动修正,则Config服务会自动为该合规规则下的所有不合规资源执行修正行为。

强烈建议您在第一次配置修正时,选择手动修正。手动修正可以防止资源被修改导致用户业务中断。

在您处理完所有存量的不合规资源后,再将修正配置修改为自动修正,此后所有新增的不合规资源都会被自动修复,而且不需要人为干预。

执行修正后,为什么资源未成功被修正?

这通常是因为您配置在函数工作流服务的代码存在问题,也可能是因为您赋予函数工作流的权限不足。请前往函数工作流的监控页面查询具体的失败日志。

资源修正成功后,为什么资源在合规规则页面还是不合规?

资源修正完成后,资源的变更行为通常会在5分钟之内通知Config服务,规则会自动触发该资源的合规评估并生成最新的资源合规结果。

相关文档