提高AWS安全性并遵守CDK-nag
#aws #安全 #java #cdk

AWS Cloud Development Kit (AWS CDK)是一种强大的工具,可允许开发人员使用熟悉的编程语言在代码中定义云基础架构,例如Typescript,Python和Java。但是,与任何基础架构 - 代码工具一样,重要的是要确保所得的基础架构遵守安全和合规性最佳实践。这是CDK-nag进来的地方。

什么是CDK-NAG?

cdk-nag是一种开源工具,可为AWS CDK代码和生成的云形式模板提供自动检查,以确保它们遵守安全和合规性最佳实践。

在您的项目中添加CDK-nag后,它会检查各种已知的安全性和合规性问题,包括过度允许的IAM策略,缺少访问日志和意外的公共S3存储桶。 CDK-NAG还检查可能导致安全漏洞的常见错误,例如使用纯文本密码和使用默认安全组。

关于CDK-NAG的伟大之处在于,它使您可以在此过程的早期阶段捕获错误。理想情况下,您可以在本地计算机上的CDK中开发基础架构作为代码时捕获它们。作为替代方案,您可以在CI/CD管道中添加CDK-NAG,并使构建失败在任何问题中。

在您的项目中添加CDK-NAG

使用CDK-NAG很简单。首先,将其作为对AWS CDK项目的依赖性。如果您使用的是Java,可以将其添加到您的pom.xml文件中。

<dependency>
  <groupId>io.github.cdklabs</groupId>
  <artifactId>cdknag</artifactId>
  <version>2.25.2</version>
</dependency>

添加了依赖关系后,您需要明确使用CDK aspect启用CDK-NAG。您可以在整个CDK应用程序的范围或单个CDK堆栈的范围中应用CDK-NAG。

CDK-nag与包装定义的规则一起使用。这些包基于AWS confien conformance Pack。如果您从未查看过AWS配置,那么在这些CDK-NAG符合包装的上下文中,Operational Best Practices for HIPAA Security页面是一个不错的页面。默认情况下,CDK-NAG包含几个规则包。

  1. AWS Solutions

  2. HIPAA Security

  3. NIST 800-53 rev 4

  4. NIST 800-53 rev 5

  5. PCI DSS 3.2.1

根据您的要求,您可以启用一个或多个规则包。让我们看一下如何应用这样的规则包。

public class AwsCdkNagDemoApp {
    public static void main(final String[] args) {
        App app = new App();

        new AwsCdkNagDemoStack(app, "AwsCdkNagDemoStack", 
            StackProps
                .builder()
                .env(Environment.builder()
                .account(System.getenv("CDK_DEFAULT_ACCOUNT"))
                .region(System.getenv("CDK_DEFAULT_REGION"))
                .build())
            .build()
        );

         Aspects.of(app)
           .add(
                AwsSolutionsChecks.Builder
                .create()
                .verbose(true)
                .build()
           );
        app.synth();
    }
}

您可以在上面的代码片段中看到,我们启用了整个CDK应用程序范围的 awssolutionschecks 规则。在此示例中,我们已经明确启用了 verbose 模式,因为它将生成更多的描述性消息。

现在让我们看一下一个示例堆栈,看看CDK-nag如何响应。下面的堆栈是一个非常简单的堆栈,其中包含AWS lambda函数处理来自SQS队列的消息。

public AwsCdkNagDemoStack(final Construct scope, 
  final String id, final StackProps props) {

  super(scope, id, props);

  final Queue queue = Queue.Builder.create(this, "demo-queue")
                 .visibilityTimeout(Duration.seconds(300))
                 .build();

  final Function function = Function.Builder
    .create(this, "demo-function")
    .handler("com.jeroenreijn.demo.aws.cdknag.FunctionHandler")
    .code(Code.fromAsset("function.jar"))
    .runtime(Runtime.JAVA_11)
    .events(List.of(
      SqsEventSource.Builder.create(queue).build())
    )
    .build();

  queue.grantConsumeMessages(function);
}

分析结果

现在,当您从命令行运行cdk synth时,它将触发CDK-nag,它将自动在生成模板中扫描您的资源,并检查它们是否有安全性和合规性问题。扫描完成后,CDK-NAG将成功返回或返回错误消息,并以易于理解的格式输出违规列表。运行cdk synth后,我们将在输出中获取以下消息。

[Error at /AwsCdkNagDemoStack/demo-queue/Resource] 
AwsSolutions-SQS3: The SQS queue is not used as a dead-letter queue (DLQ) and does not have a DLQ enabled. 
Using a DLQ helps maintain the queue flow and avoid losing data by detecting and mitigating failures and service disruptions on time.

[Error at /AwsCdkNagDemoStack/demo-queue/Resource] 
AwsSolutions-SQS4: The SQS queue does not require requests to use SSL. 
Without HTTPS (TLS), a network-based attacker can eavesdrop on network traffic or manipulate it, using an attack such as man-in-the-middle. 
Allow only encrypted connections over HTTPS (TLS) using the aws:SecureTransport condition in the queue policy to force requests to use SSL.

[Error at /AwsCdkNagDemoStack/demo-function/ServiceRole/Resource] AwsSolutions-IAM4[Policy::arn:<AWS::Partition>:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole]: 
The IAM user, role, or group uses AWS managed policies. An AWS managed policy is a standalone policy that is created and administered by AWS. 
Currently, many AWS managed policies do not restrict resource scope. Replace AWS managed policies with system specific (customer) managed policies. 
This is a granular rule that returns individual findings that can be suppressed with 'appliesTo'. The findings are in the format 'Policy::<policy>' for AWS managed policies. Example: appliesTo: ['Policy::arn:<AWS::Partition>:iam::aws:policy/foo'].

Found errors

您可以看到CDK-nag发现了一些错误,并解释了我们可以采取的措施来改善基础架构。通常,解决这些错误很容易。 Level 2 CDK constructs已经结合了一些最佳实践,因此,与使用1级结构相比,您可能会发现较少的错误。

消息取决于您选择的规则包。例如,当我们切换到 hipaasecuritychecks 规则包时,我们将获得一些重复项,但也将获得一些其他错误消息。

[Error at /AwsCdkNagDemoStack/demo-function/Resource] 
HIPAA.Security-LambdaConcurrency: The Lambda function is not configured with function-level concurrent execution limits - (Control ID: 164.312(b)). 
Ensure that a Lambda function's concurrency high and low limits are established. This can assist in baselining the number of requests that your function is serving at any given time.

[Error at /AwsCdkNagDemoStack/demo-function/Resource] 
HIPAA.Security-LambdaDLQ: The Lambda function is not configured with a dead-letter configuration - (Control ID: 164.312(b)). 
Notify the appropriate personnel through Amazon Simple Queue Service (Amazon SQS) or Amazon Simple Notification Service (Amazon SNS) when a function has failed.

[Error at /AwsCdkNagDemoStack/demo-function/Resource] 
HIPAA.Security-LambdaInsideVPC: The Lambda function is not VPC enabled - (Control IDs: 164.308(a)(3)(i), 164.308(a)(4)(ii)(A), 164.308(a)(4)(ii)(C), 164.312(a)(1), 164.312(e)(1)). 
Because of their logical isolation, domains that reside within an Amazon VPC have an extra layer of security when compared to domains that use public endpoints.

...

HipaAsecurityChecks 还发现了与Lambda功能并发相关的问题,并在VPC中运行Lambda功能。如您所见,不同的包装看不同的东西,因此值得探索不同的包装,看看它们如何帮助您改进。值得一提的是,CDK-NAG并未实现这些AWS confency符合包装中定义的所有规则。您可以检查cdk-nag excluded rules documentation中的哪些规则。

概括

总体而言,CDK-NAG是确保您的AWS CDK代码和模板遵守安全性和合规性最佳实践的强大工具。通过在开发过程的早期解决安全问题,CDK-NAG可以帮助您建立更安全和可靠的基础架构。在过去的几年中,我在许多项目中都使用了它,这增加了价值。尤其是如果您在没有很多AWS经验的团队中工作。如果您使用的是AWS CDK,我强烈建议您尝试一下CDK-NAG。这篇文章中的example code和一个工作项目可以在GitHub上找到。