掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
譯文
作者:李睿 2022-01-14 08:00:00
云計(jì)算 用戶采用Cloud Custodian能夠編寫簡單的YAML策略,以創(chuàng)建管理良好的云計(jì)算基礎(chǔ)設(shè)施。

【51CTO.com快譯】用戶采用Cloud Custodian能夠編寫簡單的YAML策略,以創(chuàng)建管理良好的云計(jì)算基礎(chǔ)設(shè)施。
在當(dāng)今不斷擴(kuò)展的云計(jì)算基礎(chǔ)設(shè)施中,很難管理所有資源都合規(guī)。而企業(yè)都有一組需要遵循的策略,用于檢測(cè)違規(guī)行為并對(duì)其云計(jì)算資源使用采取補(bǔ)救措施。這通常是通過編寫多個(gè)自定義腳本并使用一些第三方工具和集成來完成的。許多開發(fā)團(tuán)隊(duì)都知道管理和編寫自定義腳本并跟蹤這些腳本有多么困難。但他們可以利用Cloud Custodian DSL策略輕松管理云計(jì)算資源。
云治理是一個(gè)框架,它定義了開發(fā)人員如何創(chuàng)建策略來控制成本、最小化安全風(fēng)險(xiǎn)、提高效率以及加速部署。
提供治理即代碼的工具有哪些?
(1)AWS Config
AWS Config主要記錄和監(jiān)控AWS資源的所有配置數(shù)據(jù),可以構(gòu)建規(guī)則來幫助強(qiáng)制執(zhí)行使用的合規(guī)性。比如設(shè)置多賬戶和多區(qū)域選項(xiàng)。它還提供了一些可以使用的預(yù)定義AWS托管規(guī)則,或者用戶可以自己編寫自定義規(guī)則。還可以根據(jù)匹配情況采取補(bǔ)救措施。對(duì)于自定義策略,需要編寫自己的lambda函數(shù)來執(zhí)行操作。
但是,用戶可以使用Cloud Custodian設(shè)置AWS Config規(guī)則和使用c7n-org支持多賬戶和多區(qū)域的自定義規(guī)則。此外,它還可以自動(dòng)配置AWS lambda函數(shù)。
(2)Azure政策
Azure政策跨Azure資源實(shí)施組織標(biāo)準(zhǔn)。它提供了一個(gè)聚合視圖來評(píng)估環(huán)境的整體狀態(tài),并且能夠深入到每個(gè)資源、每個(gè)策略的粒度(例如,用戶只能創(chuàng)建A和B系列虛擬機(jī))。用戶可以打開內(nèi)置策略或?yàn)樗匈Y源創(chuàng)建自定義策略。它還可以對(duì)不合規(guī)的資源采取自動(dòng)修復(fù)措施。
Azure政策在部署上構(gòu)建自定義驗(yàn)證層以防止偏離客戶定義的規(guī)則時(shí)可靠且高效。Cloud Custodian和Azure政策在合規(guī)性實(shí)施方面可以完成的場景有很大的重疊。在查看用戶的要求時(shí),建議首先確定可以通過Azure政策實(shí)施的要求。然后可以使用Custodian來實(shí)現(xiàn)其余的要求。Custodian還經(jīng)常用于向Azure政策涵蓋的要求添加第二層保護(hù)或緩解措施。這樣就可以確保正確配置策略。
到目前為止,已經(jīng)看到了什么是云治理以及市場上可用的工具是什么。以下了解一下Cloud Custodian可以在云治理方面提供什么。
Cloud Custodian是一個(gè)CNCF沙盒項(xiàng)目,用于實(shí)時(shí)管理公共云資源。它幫助用戶以代碼的形式編寫治理,就像以代碼的形式編寫基礎(chǔ)設(shè)施一樣。它檢測(cè)非投訴資源并采取措施對(duì)其進(jìn)行補(bǔ)救。Cloud Custodian也是一個(gè)云原生工具。它可以與多個(gè)云計(jì)算提供商(AWS、Azure、GCP等)一起使用。
用戶可以使用Cloud Custodian,如下所示:
當(dāng)運(yùn)行Cloud Custodian命令時(shí),根據(jù)云計(jì)算提供商的不同情況,將資源、過濾器、操作作為輸入,并轉(zhuǎn)換為云計(jì)算提供商API調(diào)用(例如AWS Boto3 API)。無需擔(dān)心自定義腳本或AWS CLI命令。用戶可以獲得清晰易讀的策略以及Cloud Custodian中內(nèi)置的許多常見過濾器和操作。如果需要自定義過濾器,總是可以使用JMESPath來編寫過濾器。
在某些情況下,可能需要定期或根據(jù)某些事件運(yùn)行政策。為此Cloud Custodian自動(dòng)預(yù)配lambda函數(shù)和CloudWatch事件規(guī)則。CloudWatch事件規(guī)則可以安排(每10分鐘)或觸發(fā)以響應(yīng)CloudTrail、EC2實(shí)例狀態(tài)事件等的API調(diào)用。
可以簡單地使用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變量中獲取的,用戶應(yīng)該有權(quán)訪問在策略YAML文件中定義的所需IAM角色和策略。另一種選擇是在容器內(nèi)掛載文件/目錄。
Cloud Custodian有一個(gè)簡單的YAML文件,其中包括資源、過濾器和操作:
操作和過濾器都可以結(jié)合任意多的規(guī)則來很好地表達(dá)需求。
- - 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)
盡管官方文檔涵蓋了大部分AWS策略示例,但還是挑選了一些策略,用戶可以使用這些策略來節(jié)省成本和合規(guī)。
(1)ebs-snapshots-month-old.yml
組織面臨的最常見問題之一是刪除舊的AMI、快照和卷的復(fù)雜性,這些舊的AMI、快照和卷在環(huán)境中存在1年多并且增加了更多的費(fèi)用。最終,必須編寫多個(gè)自定義腳本來處理這種情況。
以下是刪除超過30天的快照的簡單策略:
- policies:
- - name: ebs-snapshots-month-old
- resource: ebs-snapshot
- filters:
- - type: age
- days: 30
- op: ge
- actions:
- - delete
以下是如何運(yùn)行Cloud Custodian策略的示例。
- custodian run -v -s /tmp/output /tmp/ebs-snapshots-month-old.yml
每次運(yùn)行Custodian命令時(shí),它都會(huì)在通過-s選項(xiàng)(例如,
/tmp/output/ebs-snapshot-month-old/custodian-run.log)傳遞的policies.name輸出目錄中創(chuàng)建/附加文件)
要獲得過濾的資源報(bào)告,可以運(yùn)行以下命令。在默認(rèn)情況下,它提供CSV格式的報(bào)告,但可以通過傳遞–format json來更改它。
- custodian report -s /tmp/output/ --format csv ebs-snapshots-month-old.yml
(2)only-approved-ami.yml
停止運(yùn)行與可信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
當(dāng)開發(fā)人員在創(chuàng)建POC虛擬機(jī)時(shí)傾向于允許SSH上的所有流量,或者在測(cè)試期間,有時(shí)允許端口22訪問所有端口,但忘記刪除該規(guī)則時(shí),將會(huì)看到一個(gè)更常見的問題。以下的策略可以通過自動(dòng)從所有組中刪除SSH訪問,并僅向安全組添加網(wǎng)絡(luò)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"
現(xiàn)在可以管理Kubernetes資源,如部署、pod、DaemonSet和卷。以下是可以使用Cloud Custodian編寫的一些示例策略。
- 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資源仍在開發(fā)中。
可以稱為Cloud Custodian的模式類型有哪些?
為簡單起見,使用Cloud Custodian docker映像并將憑據(jù)作為環(huán)境變量注入。
注:機(jī)密文件應(yīng)該有大寫和默認(rèn)區(qū)域的密鑰。對(duì)于Kubernetes,應(yīng)該將KUBE CONFIG文件裝入容器中。
- export AWS_ACCESS_KEY_ID=
- export AWS_SECRET_ACCESS_KEY=
- export AWS_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控制臺(tái)輸出:
Cloud Custodian擁有許多由社區(qū)開發(fā)的附加工具。
(1)多區(qū)域和多賬戶支持
可以使用c7n-org插件來配置多個(gè)AWS、AZURE、GCP帳戶并并行運(yùn)行它們。Flag–regionall可用于跨所有區(qū)域運(yùn)行相同的策略。
(2)通知
c7n-mailer插件為警報(bào)通知提供了很大的靈活性,可以使用Webhook、電子郵件、隊(duì)列服務(wù)、Datadog、Slack和Splunk來發(fā)出警報(bào)。
(3)自動(dòng)資源標(biāo)記
c7n_trailcreator腳本將處理CloudTrail記錄以創(chuàng)建資源及其創(chuàng)建者的SQLite DB,然后使用該SQLite DB用其創(chuàng)建者的姓名標(biāo)記資源。
(4)記錄和報(bào)告
它提供JSON和CSV格式的報(bào)告。還可以在云原生日志記錄中收集這些指標(biāo),并生成漂亮的儀表板。將日志存儲(chǔ)在本地、S3或Cloudwatch上。一致的日志記錄格式可以輕松地對(duì)策略進(jìn)行故障排除。
(5)Custodian試運(yùn)行
在試運(yùn)行中,策略的操作部分被忽略。它顯示了哪些資源將受到政策的影響。在運(yùn)行實(shí)際代碼之前先進(jìn)行試運(yùn)行始終是最佳實(shí)踐。
(6)Custodian緩存
當(dāng)執(zhí)行任何策略時(shí),它會(huì)從云中獲取數(shù)據(jù)并將其存儲(chǔ)在本地15分鐘。緩存用于最小化API調(diào)用,可以使用–cache-period0選項(xiàng)設(shè)置緩存。
(7)編輯器集成
它可以與Visual Studio Code集成以進(jìn)行自動(dòng)編譯和建議。
(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能夠?qū)⒁?guī)則和補(bǔ)救措施定義為一項(xiàng)策略,以促進(jìn)管理良好的云計(jì)算基礎(chǔ)設(shè)施,還可以使用它來編寫管理Kubernetes資源(如部署、pod等)的策略。與其他基于云的治理工具相比,它提供了一個(gè)非常簡單的DSL來編寫策略及其跨云平臺(tái)的一致性。這樣Custodian就減少了在云中安全創(chuàng)新的摩擦,并提高了效率。
用戶可以使用Cloud Custodian通過實(shí)施非工作時(shí)間和清理策略來優(yōu)化云成本。它還包括許多插件,如多賬戶/區(qū)域支持、廣泛的通知工具(Slack、SMTP、SQS、Datadog、Webhooks)等。
原文標(biāo)題:Implementing Cloud Governance as a Code Using Cloud Custodian,作者:Alok Maurya
【51CTO譯稿,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文譯者和出處為51CTO.com】

我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流