#aws-lambda #policy #cloud-formation #compliance #yaml #json #security

bin+lib cfn-guard-lambda

Lambda 版本的 cfn-guard。使用简单的、策略即代码的声明性语法检查 JSON 或 YAML 格式的结构化数据是否符合策略

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 2020 年 9 月 18 日

#2 in #compliance

Download history 1/week @ 2024-04-20 2/week @ 2024-05-18 1/week @ 2024-06-01 1/week @ 2024-06-08

885 每月下载量

Apache-2.0

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

  1. 安装和配置 依赖项
  2. 运行以下命令:rustup target add x86_64-unknown-linux-musl
  3. 如果您使用的是Mac,请将以下内容添加到~/.cargo/config
    [target.x86_64-unknown-linux-musl]
    linker = "x86_64-linux-musl-gcc"
    
  4. 确保您位于guard-lambda目录中。
  5. 运行以下命令:cargo build --release --target x86_64-unknown-linux-musl。对于自定义运行时,AWS Lambda会在部署包zip中查找名为bootstrap的可执行文件。将生成的cfn-lambda可执行文件重命名为bootstrap并将其添加到zip存档中。
  6. 运行以下命令:cp ./../target/x86_64-unknown-linux-musl/release/cfn-guard-lambda ./bootstrap && zip lambda.zip bootstrap && rm bootstrap
  7. 使用与您的账户对应的值初始化以下shell变量
    LAMBDA_FUNCTION_NAME=CloudFormationGuardLambda
    AWS_ACCOUNT_ID=111111111111
    REGION=us-east-1
    ROLE_NAME="${LAMBDA_FUNCTION_NAME}Role"
    
  8. 为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
    
  9. 运行以下命令将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已安装

构建和部署

  1. 确保Docker正在运行
  2. 导航到guard-lambda目录并运行sam build --use-container以构建Lambda函数的代码
  3. 运行sam deploy --guided并完成交互式工作流程。此工作流程将创建一个CloudFormation更改集并将其部署
  4. 成功后,函数的名称将显示在CloudFormationGuardLambdaFunctionName输出中
  5. 对于后续更新,再次构建代码(步骤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