通过Config实现资源自动化管理
本文为您介绍如何通过配置审计服务的资源评估和合规修正能力,自动化实现不合规资源的发现和修正。通过该流程,可以确保云上任意用户,无论有意还是无意的行为,造成了资源不合规,都可以在几分钟内被该流程自动修复,从而保证了云上的资源安全。
应用场景
具体场景:用户在云上的OBS桶,应该使用桶策略避免客户端误使用HTTP协议进行OBS业务操作,详见确保您的数据在传输到OBS过程中不被窃取和篡改。
操作流程
创建合规规则:
- 登录配置审计控制台。
- 在左侧导航栏,选择资源合规。
- 在规则页面,单击“添加规则”。
- 选择预设策略“OBS桶策略授权行为使用SSL加密”,单击“下一步”。
- 在规则参数页面,保持默认的资源范围,区域选择“全部”,完成规则创建。
- 返回规则列表页面,查看新建合规规则的评估结果。
配置修正函数:
以python方式为例,为您介绍如何通过FunctionGraph实现资源的自动修正。
- 登录函数工作流控制台。
- 在左侧导航栏,选择函数。
- 在函数列表页面,单击“创建函数”。
- 函数类型选择“事件函数”,运行时选择“Python3.9”,选择一个合适的委托,至少包含如下权限:
{ "Version": "1.1", "Statement": [ { "Effect": "Allow", "Action": [ "obs:bucket:PutBucketPolicy", "obs:bucket:GetBucketPolicy", "rms:resources:get" ] } ] }
- 完成函数创建后,为函数添加“huaweicloudsdk_obs”和“huaweicloudsdkconfig”两个依赖包。
- 在“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()
- (可选)在函数的设置页面适当修改函数的“执行超时时间”和“内存”,并启用日志配置。强烈建议您执行该项操作,否则资源修正的行为有可能会失败,且您无法通过日志记录定位函数执行的错误原因。
配置合规修正:
- 登录配置审计控制台。
- 在左侧导航栏,选择资源合规。
- 在规则页面,单击规则名称。
- 进入规则详情页面,选择“修正管理”,单击“修正配置”。
- 选择“手动修正”或“自动修正”,重试时间和重试次数使用默认值。
- 选择“FGS模版”,选中前一步中所配置的函数。
- 依赖于资源类型设置为“bucket_name”,参数中键和值分别输入domain_id 和 账号ID的值。
- 单击“保存”,完成合规修正的配置。
资源的手动修正:
如果您在上一步的修正方法中选择“手动修正”,则需要进行如下操作。
- 重新进入修正配置的页面。
- 在资源范围页面勾选您需要处理的资源:
- 如果资源属于您认为需要处理的资源,则单击“执行修正”。
- 如果资源属于您认为不需要处理的资源,则单击“加入修正例外”。
- 登录对象存储服务控制台,进入您刚才执行修正的OBS桶的详情页。
- 进入权限控制的桶策略页面,确认桶策略内容已经被更新。
常见问题
手动修正和自动修正的区别?
如果配置为手动修正,则需要用户主动查询不合规资源,并执行修正;如果配置为自动修正,则Config服务会自动为该合规规则下的所有不合规资源执行修正行为。
强烈建议您在第一次配置修正时,选择手动修正。手动修正可以防止资源被修改导致用户业务中断。
在您处理完所有存量的不合规资源后,再将修正配置修改为自动修正,此后所有新增的不合规资源都会被自动修复,而且不需要人为干预。
执行修正后,为什么资源未成功被修正?
这通常是因为您配置在函数工作流服务的代码存在问题,也可能是因为您赋予函数工作流的权限不足。请前往函数工作流的监控页面查询具体的失败日志。
资源修正成功后,为什么资源在合规规则页面还是不合规?
资源修正完成后,资源的变更行为通常会在5分钟之内通知Config服务,规则会自动触发该资源的合规评估并生成最新的资源合规结果。