【51CTO.com快译】用户采用Cloud Custodian能够编写简单的YAML策略,以创建管理良好的云计算基础设施。
在当今不断扩展的云计算基础设施中,很难管理所有资源都合规。而企业都有一组需要遵循的策略,用于检测违规行为并对其云计算资源使用采取补救措施。这通常是通过编写多个自定义脚本并使用一些第三方工具和集成来完成的。许多开发团队都知道管理和编写自定义脚本并跟踪这些脚本有多么困难。但他们可以利用Cloud Custodian DSL策略轻松管理云计算资源。
什么是云治理?
云治理是一个框架,它定义了开发人员如何创建策略来控制成本、最小化安全风险、提高效率以及加速部署。
提供治理即代码的工具有哪些?
(1)AWS Config
AWS Config主要记录和监控AWS资源的所有配置数据,可以构建规则来帮助强制执行使用的合规性。比如设置多账户和多区域选项。它还提供了一些可以使用的预定义AWS托管规则,或者用户可以自己编写自定义规则。还可以根据匹配情况采取补救措施。对于自定义策略,需要编写自己的lambda函数来执行操作。
但是,用户可以使用Cloud Custodian设置AWS Config规则和使用c7n-org支持多账户和多区域的自定义规则。此外,它还可以自动配置AWS lambda函数。
(2)Azure政策
Azure政策跨Azure资源实施组织标准。它提供了一个聚合视图来评估环境的整体状态,并且能够深入到每个资源、每个策略的粒度(例如,用户只能创建A和B系列虚拟机)。用户可以打开内置策略或为所有资源创建自定义策略。它还可以对不合规的资源采取自动修复措施。
Azure政策在部署上构建自定义验证层以防止偏离客户定义的规则时可靠且高效。Cloud Custodian和Azure政策在合规性实施方面可以完成的场景有很大的重叠。在查看用户的要求时,建议首先确定可以通过Azure政策实施的要求。然后可以使用Custodian来实现其余的要求。Custodian还经常用于向Azure政策涵盖的要求添加第二层保护或缓解措施。这样就可以确保正确配置策略。
到目前为止,已经看到了什么是云治理以及市场上可用的工具是什么。以下了解一下Cloud Custodian可以在云治理方面提供什么。
什么是Cloud Custodian?
Cloud Custodian是一个CNCF沙盒项目,用于实时管理公共云资源。它帮助用户以代码的形式编写治理,就像以代码的形式编写基础设施一样。它检测非投诉资源并采取措施对其进行补救。Cloud Custodian也是一个云原生工具。它可以与多个云计算提供商(AWS、Azure、GCP等)一起使用。
用户可以使用Cloud Custodian,如下所示:
- 合规性和安全性即代码:可以将简单的YAML DSL策略编写作为代码。
- 节约成本:删除不需要的资源,并实施开/关时间政策可以节约成本。
- 运营效率:通过添加治理即代码,它减少了在云中安全创新的摩擦,并提高了开发人员的效率。
它是如何工作的?
当运行Cloud Custodian命令时,根据云计算提供商的不同情况,将资源、过滤器、操作作为输入,并转换为云计算提供商API调用(例如AWS Boto3 API)。无需担心自定义脚本或AWS CLI命令。用户可以获得清晰易读的策略以及Cloud Custodian中内置的许多常见过滤器和操作。如果需要自定义过滤器,总是可以使用JMESPath来编写过滤器。
在某些情况下,可能需要定期或根据某些事件运行政策。为此Cloud Custodian自动预配lambda函数和CloudWatch事件规则。CloudWatch事件规则可以安排(每10分钟)或触发以响应CloudTrail、EC2实例状态事件等的API调用。
如何安装和设置Cloud Custodian?
可以简单地使用Python的pip命令安装Cloud Custodian:
- python3 -m venv custodian
- source custodian/bin/activate
- pip install c7n # This includes AWS support
- pip install c7n_azure # Install Azure package
- pip install c7n_gcp # Install GCP Package
使用 Cloud Custodian Docker 映像
- docker run -it \
- -v $(pwd)/output:/opt/custodian/output \
- -v $(pwd)/policy.yml:/opt/custodian/policy.yml \
- --env-file <(env | grep "^AWS\|^AZURE\|^GOOGLE|^KUBECONFIG") \
- cloudcustodian/c7n run -v --cache-period 0 -s /opt/custodian/output /opt/custodian/policy.yml
注:ACCESS和SECRET KEY、DEFAULT_REGION和KUBECONFIG是从ENV变量中获取的,用户应该有权访问在策略YAML文件中定义的所需IAM角色和策略。另一种选择是在容器内挂载文件/目录。
Cloud Custodian policy.yaml解释
Cloud Custodian有一个简单的YAML文件,其中包括资源、过滤器和操作:
- 资源:Custodian能够针对多个云计算提供商(AWS、GCP、Azure),每个提供商都有自己的资源类型(例如ec2、s3存储桶)。
- 过滤器:过滤器是Custodian中针对特定资源子集的方式。它可以基于某些日期、标签等,可以使用JMESPath表达式编写自定义过滤器。
- 操作:操作是对与过滤器匹配的资源做出的实际决定。这一操作可以很简单,例如向所有者发送报告,说明资源与云治理规则不匹配或删除资源。
操作和过滤器都可以结合任意多的规则来很好地表达需求。
- - name: first-policy
- resource: name-of-cloud-resource
- description: Description of policy
- filters:
- - (some filter that will select a subset of resource)
- - (more filters)
- actions:
- - (an action to trigger on filtered resource)
- - (more actions)
Cloud Custodian的示例策略
尽管官方文档涵盖了大部分AWS策略示例,但还是挑选了一些策略,用户可以使用这些策略来节省成本和合规。
(1)ebs-snapshots-month-old.yml
组织面临的最常见问题之一是删除旧的AMI、快照和卷的复杂性,这些旧的AMI、快照和卷在环境中存在1年多并且增加了更多的费用。最终,必须编写多个自定义脚本来处理这种情况。
以下是删除超过30天的快照的简单策略:
- policies:
- - name: ebs-snapshots-month-old
- resource: ebs-snapshot
- filters:
- - type: age
- days: 30
- op: ge
- actions:
- - delete
以下是如何运行Cloud Custodian策略的示例。
- custodian run -v -s /tmp/output /tmp/ebs-snapshots-month-old.yml
每次运行Custodian命令时,它都会在通过-s选项(例如,
/tmp/output/ebs-snapshot-month-old/custodian-run.log)传递的policies.name输出目录中创建/附加文件)
- custodian-run.log:所有控制台日志都存储在这里。
- resources.json:过滤的资源列表。
- metadata.json:关于过滤资源的元数据。
- action-*:已采取行动的资源列表。
- $HOME/.cache/cloud-custodian.cache:所有云API调用结果都缓存在这里。默认值为15分钟。
要获得过滤的资源报告,可以运行以下命令。在默认情况下,它提供CSV格式的报告,但可以通过传递–format json来更改它。
- custodian report -s /tmp/output/ --format csv ebs-snapshots-month-old.yml
(2)only-approved-ami.yml
停止运行与可信AMI列表不匹配的EC2。
- policies:
- - name: only-approved-ami
- resource: ec2
- comment: |
- Stop running EC2 instances that are using invalid AMIs
- filters:
- - "State.Name": running
- - type: value
- key: ImageId
- op: not-in
- value:
- - ami-04db49c0fb2215364 # Amazon Linux 2 AMI (HVM)
- - ami-06a0b4e3b7eb7a300 # Red Hat Enterprise Linux 8 (HVM)
- - ami-0b3acf3edf2397475 # SUSE Linux Enterprise Server 15 SP2 (HVM)
- - ami-0c1a7f89451184c8b # Ubuntu Server 20.04 LTS (HVM)
- actions:
- - stop
(3)Security-group-check.yml
当开发人员在创建POC虚拟机时倾向于允许SSH上的所有流量,或者在测试期间,有时允许端口22访问所有端口,但忘记删除该规则时,将会看到一个更常见的问题。以下的策略可以通过自动从所有组中删除SSH访问,并仅向安全组添加网络IP来解决这些问题。
- policies:
- - name: sg-remove-permission
- resource: security-group
- filters:
- - or:
- - type: ingress
- IpProtocol: "-1"
- Ports: [22]
- Cidr: "0.0.0.0/0"
- - type: ingress
- IpProtocol: "-1"
- Ports: [22]
- CidrV6: "::/0"
- actions:
- - type: set-permissions
- remove-ingress: matched
- add-ingress:
- - IpPermissions:
- - IpProtocol: TCP
- FromPort: 22
- ToPort: 22
- IpRanges:
- - Description: VPN1 Access
- CidrIp: "10.10.0.0/16"
支持Kubernetes资源
现在可以管理Kubernetes资源,如部署、pod、DaemonSet和卷。以下是可以使用Cloud Custodian编写的一些示例策略。
- 删除POC和未标记的资源。
- 更新k8资源的标签和补丁。
- 根据调查结果调用Webhook。
- kubernetes-delete-poc-resource.yml
- policies:
- - name: delete-poc-namespace
- resource: k8s.namespace
- filters:
- - type: value
- key: 'metadata.name'
- op: regex
- value: '^.*poc.*$'
- actions:
- - delete
- - name: delete-poc-deployments
- resource: k8s.deployment
- filters:
- - type: value
- key: 'metadata.name'
- op: regex
- value: '^.*poc.*$'
- actions:
- - delete
注意:Cloud Custodian Kubernetes资源仍在开发中。
可以称为Cloud Custodian的模式类型有哪些?
- pull:默认方法可以人工运行。首选在CI/CD工具cron中添加它。
- 定期:根据策略配置云计算资源(例如,带有CloudWatch cron的AWS Lambda)并按计划执行。
- 根据云计算提供商的自定义模式:在事件匹配时执行。
将Cloud Custodian与Jenkins CI集成
为简单起见,使用Cloud Custodian docker映像并将凭据作为环境变量注入。
注:机密文件应该有大写和默认区域的密钥。对于Kubernetes,应该将KUBE CONFIG文件装入容器中。
- export AWS_ACCESS_KEY_ID=<YOUR_AWS_ACCESS_KEY>
- export AWS_SECRET_ACCESS_KEY=<YOUR_AWS_SECRET_ACCESS_KEY>
- export AWS_DEFAULT_REGION=<YOUR_DEFAULT_REGION>
- pipeline{
- agent{ label 'worker1'}
- stages{
- stage('cloudcustodian-non-prod'){
- steps{
- dir("non-prod"){
- withCredentials([file(credentialsId: 'secretfile', variable: 'var_secretfile')])
- {
- sh '''
- source $var_secretfile > /dev/null 2>&1
- env | grep "^AWS\\|^AZURE\\|^GOOGLE\\|^KUBECONFIG" > envfile
- for files in $(ls | egrep '.yml|.yaml')
- do
- docker run --rm -t \
- -v $(pwd)/output:/opt/custodian/output \
- -v $(pwd):/opt/custodian/ \
- --env-file envfile \
- cloudcustodian/c7n run -v -s /opt/custodian/output /opt/custodian/$files
- done
- '''
- }
- }
- }
- }
- stage("cloudcustodian-prod"){
- steps{
- dir("prod"){
- withCredentials([file(credentialsId: 'secretfile', variable: 'var_secretfile')])
- {
- sh '''
- source $var_secretfile > /dev/null 2>&1
- env | grep "^AWS\\|^AZURE\\|^GOOGLE\\|^KUBECONFIG" > envfile
- for files in $(ls | egrep '.yml|.yaml')
- do
- docker run --rm -t \
- -v $(pwd)/output:/opt/custodian/output \
- -v $(pwd):/opt/custodian/ \
- --env-file envfile \
- cloudcustodian/c7n run -v -s /opt/custodian/output /opt/custodian/$files
- done
- '''
- }
- }
- }
- }
- }
- }
Jenkins控制台输出:
工具和功能
Cloud Custodian拥有许多由社区开发的附加工具。
(1)多区域和多账户支持
可以使用c7n-org插件来配置多个AWS、AZURE、GCP帐户并并行运行它们。Flag–regionall可用于跨所有区域运行相同的策略。
(2)通知
c7n-mailer插件为警报通知提供了很大的灵活性,可以使用Webhook、电子邮件、队列服务、Datadog、Slack和Splunk来发出警报。
(3)自动资源标记
c7n_trailcreator脚本将处理CloudTrail记录以创建资源及其创建者的SQLite DB,然后使用该SQLite DB用其创建者的姓名标记资源。
(4)记录和报告
它提供JSON和CSV格式的报告。还可以在云原生日志记录中收集这些指标,并生成漂亮的仪表板。将日志存储在本地、S3或Cloudwatch上。一致的日志记录格式可以轻松地对策略进行故障排除。
(5)Custodian试运行
在试运行中,策略的操作部分被忽略。它显示了哪些资源将受到政策的影响。在运行实际代码之前先进行试运行始终是最佳实践。
(6)Custodian缓存
当执行任何策略时,它会从云中获取数据并将其存储在本地15分钟。缓存用于最小化API调用,可以使用–cache-period0选项设置缓存。
(7)编辑器集成
它可以与Visual Studio Code集成以进行自动编译和建议。
(8)Custodian模式
可以使用custodian schema命令来找出Cloud Custodian中可用的资源、操作和过滤器的类型。
- custodian schema #Shows all resource available in custodian
- custodian schema aws #Shows aws resource available in custodian
- custodian schema aws.ec2 #Shows aws ec2 action and filters
- custodian schema aws.ec2.actions #Shows aws ec2 actions only
- custodian schema aws.ec2.actions.stop #Shows ec2 stop sample policy and schema
Cloud Custodian如何优于其他工具?
- 跨多个云平台和Kubernetes编写策略的简单性和一致性。
- 使用c7n-org的多账户和多区域支持。
- 使用c7n-mailer支持广泛的通知渠道。
- Custodian的Terraform提供程序支持针对Terraform IaaC模块编写和评估Custodian策略。
- Custodian与AWS配置深度集成。它可以部署config支持的任何配置规则。此外,它还可以为AWS自定义配置策略自动配置AWS Lambda。
- 如果需要,可以在Python中实施自定义策略,因为它支持根据云计算提供商SDK的所有规则。
- Cloud Custodian是一个开源的CNCF沙盒项目。
Cloud Custodian限制
- 无默认仪表板(支持AWS原生仪表板,但也可以将指标输出发送到Elasticsearch/Grafana等,并创建仪表板)。
- Cloud Custodian无法阻止自定义层验证预部署。它只能定期运行或基于某些事件运行。
- Cloud Custodian没有任何内置策略。用户需要自己编写所有策略。但是,它有很多很好的示例策略(AWS、Azure、GCP),可以用作参考。
结论
Cloud Custodian能够将规则和补救措施定义为一项策略,以促进管理良好的云计算基础设施,还可以使用它来编写管理Kubernetes资源(如部署、pod等)的策略。与其他基于云的治理工具相比,它提供了一个非常简单的DSL来编写策略及其跨云平台的一致性。这样Custodian就减少了在云中安全创新的摩擦,并提高了效率。
用户可以使用Cloud Custodian通过实施非工作时间和清理策略来优化云成本。它还包括许多插件,如多账户/区域支持、广泛的通知工具(Slack、SMTP、SQS、Datadog、Webhooks)等。
原文标题:Implementing Cloud Governance as a Code Using Cloud Custodian,作者:Alok Maurya
【51CTO译稿,合作站点转载请注明原文译者和出处为51CTO.com】