手动批准 CDK 管道中的安全更改

作者: 布莱恩·比奇 |

在这篇文章中,我将向您展示如何在部署之前向 亚马逊云科技 云开发套件 (CDK) 管道添加手动批准以确认安全更改。使用此解决方案,当开发人员提交更改时,CDK Pipeline 会识别 IAM 权限变更,暂停执行,并在部署更改之前向安全工程师发送通知,要求其手动批准或拒绝更改。

简介

在我的职位上,我与许多对 亚马逊云科技 云开发套件 (CDK) 感到兴奋的客户进行了交谈。他们喜欢的一件事是,L2 结构经常生成 IAM 和其他安全策略。与手工编写这些策略相比,这可以节省大量时间和精力。大多数客户还告诉我,CDK生成的策略比他们手工生成的策略更安全。

但是,这些客户担心他们的安全工程团队不知道CDK生成的策略中有什么。过去,这些客户花费大量时间制定了一些 IAM 策略,供开发人员在其应用程序中使用。这些策略广为人知,但过于宽松,因为它们经常在许多应用程序中重复使用。

客户希望更多地了解 CDK 生成的政策。幸运的是,CDK 提供了一种 批准安全变更 的机制。如果您使用的是 CDK,则在命令行运行 cdk deploy 时可能会提示您批准安全更改。这在开发者的机器上效果很好,但客户希望在持续交付管道中建立同样的确认信息。CDK 通过 confirmPermissionsBroadening 操作为此提供了一种机制。 请注意,只有 亚马逊云科技 CodePipline 部署引擎支持 confirmPermiss ionsBroadening

背景

在我谈论 confirmPermissionsBroadening 之前,让我回顾一下 CDK 是如何创建 IAM 策略的。以在 亚马逊云科技 CDK 研讨会中创建的 “你好,CDK ” 应用程序为例。 在本模块的最后,我有一个 亚马逊云科技 L am bda 函数和 一个由以下 CDK 代码定义的 亚马逊 API Gateway。

// defines an AWS Lambda resource
const hello = new lambda.Function(this, 'HelloHandler', {
  runtime: lambda.Runtime.NODEJS_14_X,    // execution environment
  code: lambda.Code.fromAsset('lambda'),  // code loaded from "lambda" directory
  handler: 'hello.handler'                // file is "hello", function is "handler"
});

// defines an API Gateway REST API resource backed by our "hello" function.
new apigw.LambdaRestApi(this, 'Endpoint', {
  handler: hello
});

请注意,我不需要定义 IAM 角色或 Lambda 权限。我只是将对 Lambda 函数的引用传递给 API 网关(上面第 10 行)。CDK 了解我在做什么,并为我生成了权限。例如,CDK 生成了以下 Lambda 权限等。

{
  "Effect": "Allow",
  "Principal": {
    "Service": "apigateway.amazonaws.com"
  },
  "Action": "lambda:InvokeFunction",
  "Resource": "arn:aws:lambda:us-east-1:123456789012:function:HelloHandler2E4FBA4D",
  "Condition": {
    "ArnLike": {
      "AWS:SourceArn": "arn:aws:execute-api:us-east-1:123456789012:9y6ioaohv0/prod/*/"
    }
  }
}

请注意,CDK 生成了一个范围狭窄的策略,该策略允许特定 API(上面第 10 行)调用特定的 Lambda 函数(上面第 7 行)。此政策不能在其他地方重复使用。稍后在同一个研讨会中,我 使用 Lambda 函数和亚马逊 Dynam oDB 表创建了 命中计数器结构 。 同样,我使用一行 CDK 代码将它们关联起来。

table.grantReadWriteData(this.handler);

与前面的示例一样,CDK 生成了范围狭窄的 IAM 策略。此策略允许 Lambda 函数对特定表格(下文第 14 行)执行某些操作(第 4-11 行)。

{
  "Effect": "Allow",
  "Action": [
    "dynamodb:BatchGetItem",
    "dynamodb:ConditionCheckItem",
    "dynamodb:DescribeTable",
    "dynamodb:GetItem",
    "dynamodb:GetRecords",
    "dynamodb:GetShardIterator",
    "dynamodb:Query",
    "dynamodb:Scan"
  ],
  "Resource": [
    "arn:aws:dynamodb:us-east-1:123456789012:table/HelloHitCounterHits"
  ]
}

如你所见,CDK为我做了很多工作。此外,CDK正在为每种资源制定范围狭窄的政策,而不是在多个地方共享范围广泛的政策。

CDK 管道权限检查

现在我已经回顾了 CDK 如何生成策略,让我们讨论如何在持续部署管道中使用它。具体而言,我希望允许 CDK 生成策略,但我希望安全工程师使用正在进行的手动批准步骤来审查任何更改。当然,我不希望安全成为瓶颈,因此只有在添加安全声明或交通规则时我才需要批准。如果没有添加新的安全规则,则管道应跳过手动批准。

让我们继续以 CDK Workshop 为例。在 CDK Pipel ines 模块中,我使用 CDK 配置 亚马逊云科技 CodePipeline 来部署我上面讨论的 “你好,CDK” 应用程序。我在研讨会上做的最后一件事就是 使用部署后步骤 添加验证测试 。添加权限检查类似,但我将使用部署前步骤来确保在部署之前进行权限检查。

首先,我将从管道包中导入 conf irmPermissionsBroadening

import {ConfirmPermissionsBroadening} from "aws-cdk-lib/pipelines";

然后,我可以简单地使用 addPre 方法将 conf irmPermissionsBroadening 添加 到 depl oySat age 中,如下 所示。

const deploy = new WorkshopPipelineStage(this, 'Deploy');
const deployStage = pipeline.addStage(deploy);

deployStage.addPre(    
  new ConfirmPermissionsBroadening("PermissionCheck", {
    stage: deploy
})

deployStage.addPost(
    // Post Deployment Test Code Omitted
)

在我提交并推动此更改后,一个名为 permissionCheck. Confirm 的新手动批准步骤将添加到管道的部署阶段。将来,如果我推送添加更多规则的更改,则管道将在此处暂停并等待手动批准,如下面的屏幕截图所示。

Figure 1. Pipeline waiting for manual review

图 1。流水线正在等待手动审查

当安全工程师单击 “审阅” 按钮时,她会看到以下对话框。在这里,她可以单击 URL 查看编译日志中记录的我请求的更改摘要。她还可以选择批准或拒绝更改,并在需要时添加评论。

Figure 2. Manual review dialog with a link to the build logsd

图 2。带有编译日志链接的手动审阅对话框

当安全工程师点击评论网址时,她会看到以下安全更改摘要。

Figure 3. Summary of security changes in the build logs

图 3。编译日志中的安全更改摘要

我想添加的最后一个功能是电子邮件通知,以便安全工程师知道何时有需要批准的内容。 为此,我创建了一个新的 亚马逊简单通知服务 (SNS) 主题和订阅,并将其与 confirmPermiss ionsBroadening Check 关联起来。

// Create an SNS topic and subscription for security approvals
const topic = new sns.Topic(this, 'SecurityApproval’);
topic.addSubscription(new subscriptions.EmailSubscription('security-approvers@example.com')); 

deployStage.addPre(    
  new ConfirmPermissionsBroadening("PermissionCheck", {
    stage: deploy,
    notificationTopic: topic
})

配置通知后,安全工程师将在需要批准时收到一封电子邮件。她将有机会回顾我所做的安全更改并评估其影响。这使安全工程团队能够了解他们想要的 CDK 正在生成的策略。此外,如果更改未添加安全规则,则会跳过批准步骤,这样安全工程师就不会成为部署过程中的瓶颈。

结论

亚马逊云科技 云开发套件 (CDK) 可自动生成 IAM 和其他安全策略。这可以节省大量时间和精力,但安全工程团队希望了解CDK生成的策略。为了解决这个问题,CDK Pipelines 提供了 confirmPer missionsBroadening 操作 。当您将 Conf irmPermissionsBroadening 添加到您的 CI/CD 管道时,CDK 将等待手动批准,然后再部署包含新安全规则的更改。

作者简介:

布莱恩 ·比奇

布莱恩·比奇拥有超过20年的开发人员和架构师经验。他目前是亚马逊网络服务的首席解决方案架构师。他拥有纽约大学理工学院的计算机工程学位和罗格斯商学院的工商管理硕士学位。他是Apress的《适用于亚马逊网络服务的Pro PowerShell》的作者。他是一位定期作家,曾在许多活动中发表过演讲。布莱恩与妻子和三个孩子住在北卡罗来纳州。


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您发展海外业务和/或了解行业前沿技术选择推荐该服务。