使用 AWS CDK 结合 OPA 实现“策略即代码”

2020 年 11 月 11 日

使用 AWS CDK 结合 OPA 实现“策略即代码”

Original URL: https://aws.amazon.com/blogs/opensource/realize-policy-as-code-with-aws-cloud-development-kit-through-open-policy-agent/


AWS Cloud Development Kit(AWS CDK)是一个开源软件框架,允许使用熟悉的编程语言来定义和配置 AWS 上的基础设施。“基础设施即代码”通过使用 CDK 对基础设施进行版本控制,能够更有效且可靠地管理 AWS 上的基础设施。


当然,在计划部署新的 AWS 资源或更新时,我们必须确保这些更改没有引入安全漏洞,势必要建立安全合规基准,辅以流程遵循合规性要求。现在,是时候来设置和定义相应的安全基准,以确保 AWS 上基础设施的更改不会引起安全问题。开放策略代理(OPA)是一个云原生基金会的孵化项目,旨在针对云上基础设施的安全基准策略自动进行检查。OPA 提供了统一的框架和语言,用于声明、实施和控制云上基础设施中各个部件的安全基准策略。


将 OPA 与 AWS CDK 集成在一起之后,可获得“策略即代码”的能力,即在 AWS CDK 对 AWS 环境进行更改之前,对这些更改进行合规策略的检查。这种新方法带来很多好处,具体包括:


  • 各个团队成员可以轻松在实际更改之前进行策略检查。

  • 通过与CI / CD集成,可以自动执行策略检查。

  • 用户可以对“基础设施即代码”实施强制性检查。

  • 用户可以根据行业最佳实践框架(例如CIS AWS Benchmark)中的安全合规要求,编写自定义的OPA策略。


总而言之,这将极大地缩短基础设施安全合规的事后检查周期。


这篇文章的其余部分将逐步介绍如何将 OPA 与 AWS CDK 结合使用,以实现“策略即代码”。这将涉及以下的任务:


  • 创建一个AWS CDK项目以部署AWS资源。

  • 根据REGO策略语言编写简单的OPA策略。

  • 利用OPA策略来检查AWS CDK的基础设施代码。


先决条件


1.1 在 AWS Cloud9 中创建 EC2 环境


按照说明创建一个 Amazon Linux Cloud9 EC2环境(自建 EC2 实例亦 OK)。


1.2 确保已安装 AWS CDK


$ cdk --version
复制代码


1.3 安装 OPA


$ curl -L -o opa https://openpolicyagent.org/downloads/latest/opa_linux_amd64$ chmod 755 ./opa
复制代码


入门


2.1 创建一个 AWS CDK 项目


AWS CDK 项目将创建一个AWS CloudFormation堆栈,其中包括:一个Amazon Elastic Compute Cloud(Amazon EC2)实例,一个AWS Identity and Access Management(IAM)角色,一个附加到 EC2 的安全组。


2.2 使用 Python 语言的 CDK Demo 应用模板


$ mkdir cdk-demo$ cd cdk-demo/$ cdk init  --language python --app cdk-demo
复制代码


2.3 安装 virtualenv


$ python3 -m venv .venv
复制代码


2.4 进入 virtualenv


$ source .venv/bin/activate
复制代码


2.5 安装所有必需的软件包


$ cat >requirements.txt <<EOFaws-cdk.aws-ec2aws-cdk.core-e .EOF
$ pip install -r requirements.txt
复制代码


2.6 编辑 AWS CDK 项目创建资源


cat >app.py <<EOF#!/usr/bin/env python3
import osfrom aws_cdk import corefrom aws_cdk.core import Environmentfrom cdk_demo.cdk_demo_stack import CdkDemoStack
app = core.App()
ACCOUNT = app.node.try_get_context('account') or os.environ.get( 'CDK_DEFAULT_ACCOUNT', 'unknown')REGION = app.node.try_get_context('region') or os.environ.get( 'CDK_DEFAULT_REGION', 'unknown')
AWS_ENV = Environment(region=REGION, account=ACCOUNT)
CdkDemoStack(app, "cdk-demo", env=AWS_ENV)
app.synth()EOF


cat >cdk_demo/cdk_demo_stack.py <<EOF
from aws_cdk import core, aws_ec2

class CdkDemoStack(core.Stack):
def __init__(self, scope: core.Construct, id: str, **kwargs) -> None: super().__init__(scope, id, **kwargs)
self.vpc = aws_ec2.Vpc.from_lookup(self, 'default_vpc', is_default=True) self.sg_ssh = aws_ec2.SecurityGroup( self, 'ssh', vpc=self.vpc, description="Allow SSH from anywhere", security_group_name="SSH from anywhere" ) self.sg_ssh.add_ingress_rule(aws_ec2.Peer.any_ipv4(), aws_ec2.Port.tcp(22))
self.ami = aws_ec2.LookupMachineImage( name="ubuntu/images/hvm-ssd/ubuntu-bionic-18.04-amd64-server-*", owners=["099720109477"], )
self.ec2 = aws_ec2.Instance( self, 'cdk-demo', instance_type=aws_ec2.InstanceType('t2.micro'), machine_image=self.ami, vpc=self.vpc, security_group=self.sg_ssh, )EOF
复制代码


2.7 创建 AWS CloudFormation 模板


$ cdk synth
复制代码


这将生成cdk.out/cdk-demo.template.json。如果我们现在运动cdk deploy,将启动 CloudFormation 堆栈,并创建所有声明的资源。但是,在更改发生之前,我们需要使用 OPA 进行策略检查,以确保更改没有违反安全合规基准。


2.8 使用 Rego 编写 OPA 策略


本示例中将从三个策略检查 AWS CloudFormation 模板:


  • 禁止创建超过10个的EC2实例

  • 禁止在EC2实例上启用SSH

  • 禁止创建IAM角色


cat > opa_cdk.rego <<EOF
package opa_cdk
import input
# deny if it creates more than 10 EC2 instancesdeny_too_many_ec2[deny] { instances := [res | res:=input.Resources[_]; res.Type == "AWS::EC2::Instance"] count(instances) > 10 deny := true}
# deny if ssh is enableddeny_ssh_enabled[deny] { input.Resources[_].Properties.SecurityGroupIngress[_].ToPort == 22 deny := true}
# deny if it creates IAM roledeny_role_created[deny] { input.Resources[_].Type == "AWS::IAM::Role" deny := true}EOF
复制代码


2.9 OPA 策略检查


针对 AWS CloudFormation 模板运行 OPA 策略:


cd .../opa eval --format pretty -i cdk-demo/cdk.out/cdk-demo.template.json -d cdk-demo/opa_cdk.rego  "data"
复制代码



该命令的输出显示,CloudFormation 模板通过了 EC2 实例数量的策略检查,但违反了禁止创建 IAM 角色和禁止在 EC2 实例上启用 SSH 的两个策略。


模板未通过所有策略检查,无法部署此模版。OPA 的策略检查确保了,只有符合安全合规要求的基础设施更改才能投入生产。


清理


从 AWS 控制台删除 Cloud9 EC2 环境。


总结


上面的示例是一个 Hello World 的演示,展示了一种新的方式,即使用 OPA 策略,检查 AWS CDK 发生的基础设施更改是否符合既定的安全合规基准。该示例也可以应用于其他场景,例如确保所有资源在创建之前都具有标签,确保遵循资源的命名规范,满足安全性或运维合规要求等等。


尽早了解应用或基础设施部署是否违反策略,这点很管用。因为策略检查是基础设施生命周期中的一个环节,且须确保无法创建和部署不合规的资源。


OPA 可以和应用,同时作为守护程序运行,并可基于 HTTP 的 JSON 提供 RESTful API。对于用 Go 语言编写的应用,甚至可将 OPA 直接嵌入用作语言库。此外,将 OPA 与 AWS CDK 结合使用,可高度扩展“基础设施即代码”,也为基础设施策略检查,提供了端到端自动化的服务功能。


这篇博客文章提供了一个示例场景,当然可以在组织中广泛应用:安全性、成本和可用性的许多其他策略。也可以定制访问控制要求,为容器化工作负载施加约束,并可将 OPA 与 AWS CDK 结合使用,以构建策略驱动的基础设施,强制执行策略检查,为更好地管理云资源提供防护和信心。


现在,您距离 DevSecOps 更加近了一步。我们甚至可以将 OPA 与 AWS CDK,AWS CloudFormation 或 Terraform 所支撑的“基础设施即代码”流水线集成在一起,并利用 OPA 的检查结果,自动使部署失败或通过。显然,借助这些工具的功能,极大地扩充了 DevSecOps 的实践空间。正应了一句话:凡事皆有可能!


作者介绍


作者


Xuejiao Zhang


Xuejiao Zhang is a DevOps Consultant at Amazon Web Services. Prior to joining Amazon. Xuejiao worked for a number of e-commerce companies like JD.COM, Rakuten. You can find her on Github.


译者


黄帅


亚马逊 AWS 专业服务团队云架构咨询顾问。负责企业级客户的云架构设计和优化、DevOps 组织咨询和技术实施。在软件研发领域有多年架构设计和运维、团队管理经验,对 DevOps、云原生微服务治理框架、容器化平台运维、混沌工程实践等有深入的研究和热情。


本文转载自亚马逊 AWS 官方博客。


原文链接


使用 AWS CDK 结合 OPA 实现“策略即代码”


2020 年 11 月 11 日 10:00900

欲了解 AWS 的更多信息,请访问【AWS 技术专区】

评论

发布
暂无评论
发现更多内容

字节高级工程师告诉我,想越过开发5年的“分水岭”这样做最适合

周老师

Java 编程 程序员 架构 面试

架构师训练营大作业

叮叮董董

LeetCode题解:622. 设计循环队列,使用数组,JavaScript,详细注释

Lee Chen

LeetCode 前端进阶训练营

【高并发】面试官:说说缓存最关心的问题?有哪些类型?回收策略和算法?

冰河

缓存 面试 引用 offer 回收

oeasy教您玩转linux 010216 随机诗词 fortunezh

o

架构师训练营大作业一

子豪sirius

Electronjs

Neil

JavaScript Electron 前端框架 前端教程 客户端开发

【高并发】面试官:Java中提供了synchronized,为什么还要提供Lock呢?

冰河

Java synchronized 同步 lock 锁机制

架构师训练营 - 大作业(二)

张明森

Python基础知识(二)

Python基础

网上赌博输了怎么办?上岸戒赌是唯一的选择

10万元能找个女人代生小孩

网上赌博输了怎么办 网上赌博玩快三输了怎办 网上玩快三输了怎么回血 网赌输了怎么戒赌

为什么很多人不买iPhone?

北柯

windows平台python3使用impyla连接hive问题汇总

誓约·追光者

hive python3.x Windows 10

python——dict常用方法

菜鸟小sailor 🐕

JDK15真的来了,一起来看看它的新特性

程序那些事

java15 JDK15 JDK15新特性 java15新特性

甲方日常 16

大橘子

随笔杂谈

直播倒计时|30分钟带你解锁“技术写作”新技能

Yumiko

技术 写作 直播 技术创作 RTC征文大赛

关于手机里的IP地址,你不得不知道的“秘密”

脑极体

配置时间特性

小知识点

大数据 flink scal

食堂就餐卡系统设计

Geek_Albert

食堂就餐卡系统设计

血的教训!千万别在生产使用这些 redis 指令

云流

redis 学习 编程 程序员

Spring 5 中文解析数据存储篇-理解Spring事物抽象

青年IT男

Spring5 数据存储

第一周学习总结

Geek_Albert

架构师训练营结业作业

superman

拓扑排序就这么回事

码农田小齐

数据结构 算法 数据结构和算法

如何进步神速

Sean

个人成长 学习方式

快三十岁了,网上玩赌博输掉了四百万后的忏悔

10万元能找个女人代生小孩

网上赌博输了怎么办 赌博玩快三输了怎么回血

升级Php Curl扩展遇到的坑

心平气和

php curl php扩展

关于java使用JDBC连接数据库

谷鱼

Java JDBC

宁静的可贵

谷鱼

宁静

IP网络

菜鸟小sailor 🐕

使用 AWS CDK 结合 OPA 实现“策略即代码”-InfoQ