安全存储由 IaC 创建的 AWS IAM 用户密钥(访问密钥和机密密钥)

安全存储由 IaC 创建的 AWS IAM 用户密钥(访问密钥和机密密钥)

我有以下设置:

  1. 使用 AWS CDK 设置基础设施;
  2. 我有一个堆栈/环境(生产、暂存......);
  3. 每个 Stack 都有不同的 S3 Bucket(用于网站托管);
  4. 我有一个创建 IAM 用户(由 CI/CD 使用)的堆栈;
  5. 在这种情况下,CI/CD 是 GitHub Actions(每次合并时部署main);
  6. IAM User 只对所有 Bucket 有 put 权限(部署,即把资产放到 Bucket 里);

为该用户存储/处理密钥的最佳方法是什么?

我开始在输出中打印它,但这并不安全。每个人都可以看到它(例如,如果他们有权访问 CI/CD 的日志)。

有人建议将它们存储在 SSM 中:它可以工作,但您不能将其创建为 SecureString,因此它只是一个字符串。

我也研究了 Secrets Manager:它也能工作,而且似乎更安全(但不确定我的感觉是否有效)。

这里有什么想法/意见吗?

谢谢!


在代码中它看起来像这样:

// Production Stack
const bucket = new Bucket(this, "Bucket", {
  bucketName: "production",
});

// Staging Stack
const bucket = new Bucket(this, "Bucket", {
  bucketName: "staging",
});

// IAM Stack
const user = new User(this, "User", {
  userName: "ci-cd-user",
});
const userAccessKey = new AccessKey(this, "UserAccessKey", { user });

// This is just an example, I go through all the available Buckets
bucketProduction.grantPut(user);
bucketStaging.grantPut(user);

答案1

我花了一段时间才终于理解了这一点:https://dev.to/viniciuskneves/use-aws-through-github-actions-without-secret-keys-32eo

这个想法是使用OpenID 连接连接 GitHub然后拥有一个可以由 GitHub Actions 承担的角色并执行部署(我会为 GitHub Actions 用户提供相同的策略)。

使用 AWS CDK 的解决方案如下所示:

const provider = new OpenIdConnectProvider(this, "GitHubProvider", {
  url: "https://token.actions.githubusercontent.com",
  clientIds: ["sts.amazonaws.com"], // Referred as "Audience" in the documentation
});
const role = new Role(this, "Role", {
  assumedBy: new OpenIdConnectPrincipal(provider, {
    StringEquals: {
      "token.actions.githubusercontent.com:aud": "sts.amazonaws.com", // "Audience" from above
    },
    StringLike: {
      "token.actions.githubusercontent.com:sub":
      "repo:<ORGANIZATION>/<REPOSITORY>:*", // Organization and repository that are allowed to assume this role
    },
  }),
});

bucket.grantPut(role); // Creates policy

之后,我们需要更新 GitHub Actions 以使用它而不是我们的用户密钥:

...
permissions:
  id-token: write
  contents: read # This is required for actions/checkout (GitHub documentation mentions that)
...
- name: Configure AWS Credentials 

相关内容