使用 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:001005

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

评论

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

开发一款视频直播有多吃香?

anyRTC开发者

奈学:reaseShared共享式释放锁

古月木易

reaseShared 共享锁

《精益创业》摘要

孙苏勇

书摘 精益创业

Flink所需组件-1

小知识点

scala 大数据 flink 流计算

奈学:reaseShared共享式释放锁

奈学教育

共享锁

2w字 + 40张图带你参透并发编程!

cxuan

Java 后端 并发

认识分布式系统

多颗糖

分布式 分布式系统 分布式存储

Pulsar 联合 TiDB 推出大数据场景数据应用分析解决方案

Apache Pulsar

大数据 InfoQ Apache Pulsar #TiDB

法定数字人民币将成中国金融新名片

CECBC区块链专委会

数字货币 人民币

吃透Laravel的Ioc容器

书旅

laravel 容器 ioc

Week11

一叶知秋

四种主要的 IO 模型

方明

Netty

奈学:Executor框架的概述

古月木易

Executor Executor框架

区块链技术助力基础建设

CECBC区块链专委会

新基建 区块链技术 国家电力

奈学:Executor框架的概述

奈学教育

Executor Executor框架

微服务-技术专题-设计原则AFK

李浩宇/Alex

核查框架新的选择

柿子

jsr-303 核查框架 butterfly

浅谈如何做好软件研发团队的盘点

大黄蜂

团队管理 技术管理

9大训练营免费开营!阿里云大数据团队的独门绝学全在这了

Apache Flink

大数据 训练营

浅谈技术管理之团队管理

大黄蜂

团队管理 技术管理

云原生架构的基石

soolaugust

Docker 架构 Kubernetes 容器 云原生

华为:新政务风口下加宽“护城河”

脑极体

LeetCode题解:66. 加一,新数组求和再翻转,JavaScript,详细注释

Lee Chen

LeetCode 前端进阶训练营

跟我一起基于Karma搭建一个测试环境(下)

Jack Q

测试框架 前端进阶训练营 Karma

大数据技术发展(二):Hadoop 技术生态圈的发展

抖码算法

Java 大数据 hadoop 大数据技术 hadoop3

优雅快速的统计千万级别uv

架构师修行之路

哈希表 数据结构与算法

进击谷歌:多线程下程序顺序怎么稳定不乱?

架构师修行之路

数据结构与算法

为什么 Bash 脚本总是不稳定?

柴锋

bash Linux DevOps 运维 Shell

56张图入门操作系统——内功心法,适合所有程序员

执鸢者

前端 操作系统

有一种自我欺骗,叫只为孩子

zhoo299

随笔杂谈 家庭

一文吃透PHP进程信号处理

书旅

php Linux 信号

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