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