16 个稳定版本
3.1.1 | 2024 年 4 月 12 日 |
---|---|
3.1.0 | 2024 年 3 月 27 日 |
3.0.3 | 2024 年 1 月 11 日 |
3.0.2 | 2023 年 11 月 17 日 |
0.0.0 |
|
#2 in #compliance
885 每月下载量
1.5MB
31K SLoC
AWS CloudFormation Guard 作为 Lambda
该工具的 Lambda 版本是一个轻量级的包装器,围绕核心 cfn-guard 代码,可以简单地作为 Lambda 调用。我们目前支持两种部署 Lambda 的方法。
目录
方法 1:使用 AWS CLI 安装
依赖项
- AWS CLI 配置 有部署和调用 Lambda 的权限
- Rust (参见 顶级 README 中的安装说明)
- 如果在 Mac 上构建,您需要 Homebrew。
- 如果在 Ubuntu 上构建,您需要运行
sudo apt-get update; sudo apt install build-essential
如果您还没有这样做的话 - 如果在 CentOS/RHEL 上构建,您需要将
musl-libc
软件包仓库添加到您的 yum 配置中(参见 https://copr.fedorainfracloud.org/coprs/ngompa/musl-libc/)
Mac/Ubuntu
- 安装和配置 依赖项。
- 运行以下命令:
rustup target add x86_64-unknown-linux-musl
。 - 如果您使用的是Mac,请将以下内容添加到
~/.cargo/config
中[target.x86_64-unknown-linux-musl] linker = "x86_64-linux-musl-gcc"
- 确保您位于
guard-lambda
目录中。 - 运行以下命令:
cargo build --release --target x86_64-unknown-linux-musl
。对于自定义运行时,AWS Lambda会在部署包zip中查找名为bootstrap
的可执行文件。将生成的cfn-lambda
可执行文件重命名为bootstrap
并将其添加到zip存档中。 - 运行以下命令:
cp ./../target/x86_64-unknown-linux-musl/release/cfn-guard-lambda ./bootstrap && zip lambda.zip bootstrap && rm bootstrap
。 - 使用与您的账户对应的值初始化以下shell变量
LAMBDA_FUNCTION_NAME=CloudFormationGuardLambda AWS_ACCOUNT_ID=111111111111 REGION=us-east-1 ROLE_NAME="${LAMBDA_FUNCTION_NAME}Role"
- 为Lambda函数创建执行角色。请参考链接中的文档以获取最新的说明。或者,使用以下命令
aws iam create-role \ --role-name $ROLE_NAME \ --assume-role-policy-document '{"Version": "2012-10-17","Statement": [{ "Effect": "Allow", "Principal": {"Service": "lambda.amazonaws.com"}, "Action": "sts:AssumeRole"}]}' aws iam attach-role-policy \ --role-name $ROLE_NAME \ --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
- 运行以下命令将
cfn-guard
作为AWS Lambda函数提交到您的账户aws lambda create-function \ --function-name $LAMBDA_FUNCTION_NAME \ --handler guard.handler \ --zip-file fileb://./lambda.zip \ --runtime provided \ --role "arn:aws:iam::${AWS_ACCOUNT_ID}:role/${ROLE_NAME}" \ --environment Variables={RUST_BACKTRACE=1} \ --tracing-config Mode=Active \ --region $REGION
方法 2:使用 SAM CLI 安装
依赖项
-
SAM CLI已安装
-
AWS CLI 已安装并配置了通过CloudFormation部署的权限。SAM CLI将内部使用与AWS CLI设置的凭证。您可以使用以下IAM策略作为最小权限访问的参考。
SAM CLI用户IAM策略
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "cloudformation:CreateChangeSet", "cloudformation:CreateStack", "cloudformation:DeleteChangeSet", "cloudformation:DeleteStack", "cloudformation:DescribeChangeSet", "cloudformation:DescribeStackEvents", "cloudformation:DescribeStackResource", "cloudformation:DescribeStackResources", "cloudformation:DescribeStacks", "cloudformation:ExecuteChangeSet", "cloudformation:GetTemplate", "cloudformation:GetTemplateSummary", "cloudformation:ListStackResources", "cloudformation:SetStackPolicy", "cloudformation:UpdateStack", "cloudformation:UpdateTerminationProtection", "iam:AttachRolePolicy", "iam:CreateRole", "iam:DeleteRole", "iam:DetachRolePolicy", "iam:GetRole", "iam:PassRole", "lambda:CreateFunction", "lambda:DeleteFunction", "lambda:GetFunction", "lambda:TagResource", "s3:GetObject", "s3:PutObject" ], "Resource": "*" } ] }
-
Docker已安装
构建和部署
- 确保Docker正在运行
- 导航到
guard-lambda
目录并运行sam build --use-container
以构建Lambda函数的代码 - 运行
sam deploy --guided
并完成交互式工作流程。此工作流程将创建一个CloudFormation更改集并将其部署 - 成功后,函数的名称将显示在
CloudFormationGuardLambdaFunctionName
输出中 - 对于后续更新,再次构建代码(步骤2)并运行
sam deploy
(不带--guided
)
调用 AWS Lambda 函数
有效载荷结构
发送到cfn-guard-lambda
的JSON有效载荷需要以下两个字段
data
- (必需,字符串)基础设施代码模板数据,以YAML或JSON结构。rules
- (必需,字符串列表)您想要对YAML或JSON结构化数据运行的规则列表。verbose
- (可选,布尔值)当设置为false
时,Lambda 会输出一个简短的版本。为了向后兼容,默认设置为true
。
调用 cfn-guard-lambda
将变量 LAMBDA_FUNCTION_NAME
初始化为已部署的 AWS Lambda 函数的名称,并使用以下语法调用它
aws lambda invoke \
--function-name $LAMBDA_FUNCTION_NAME \
--cli-binary-format raw-in-base64-out \
--payload "{"data": "<input data>", "rules" : ["<input rules 1>", "<input rules 2>", ...], "verbose": <true|false>}" \
output.json
注意:--cli-binary-format
选项仅用于覆盖默认配置设置以解析 JSON 输入。如果命令带有此选项不起作用,请尝试在不覆盖配置的情况下运行它。您当前的 AWS CLI 版本可能已将此配置设置为所需的值。
示例
aws lambda invoke \
--function-name $LAMBDA_FUNCTION_NAME \
--cli-binary-format raw-in-base64-out \
--payload '{"data":"{\"Resources\":{\"NewVolume\":{\"Type\":\"AWS::EC2::Volume\",\"Properties\":{\"Size\":500,\"Encrypted\":true,\"AvailabilityZone\":\"us-west-2b\"}},\"NewVolume2\":{\"Type\":\"AWS::EC2::Volume\",\"Properties\":{\"Size\":50,\"Encrypted\":true,\"AvailabilityZone\":\"us-west-2c\"}}}}","rules":["let ec2_volumes = Resources.*[ Type == /EC2::Volume/ ]\nrule EC2_ENCRYPTION_BY_DEFAULT when %ec2_volumes !empty {\n %ec2_volumes.Properties.Encrypted == true \n <<\n Violation: All EBS Volumes should be encrypted \n Fix: Set Encrypted property to true\n >>\n}"],"verbose":false}' \
output.json
注意:--cli-binary-format
选项仅用于覆盖默认配置设置以解析 JSON 输入。如果命令带有此选项不起作用,请尝试在不覆盖配置的情况下运行它。您当前的 AWS CLI 版本可能已将此配置设置为所需的值。
常见问题解答
问题:如何调试一个返回模糊错误消息的 Lambda 调用,例如
{"errorType": "Runtime.ExitError", "errorMessage": "RequestId: 1c0c0620-0f83-40bc-8eca-3cf2cf24820f Error: Runtime exited with error: exit status 101"}
答案:使用 cfn-guard
在本地运行相同的规则集和模板以获取更好的消息,例如
Parsing error handling template file, Error = while parsing a flow mapping, did not find expected ',' or '}' at line 21 column 1
cfn-guard-lambda
只是 cfn-guard
代码的包装器,并且每个都可以用来测试另一个。
依赖项
~18–32MB
~498K SLoC