我有以下设置:
- 使用 AWS CDK 设置基础设施;
- 我有一个堆栈/环境(生产、暂存......);
- 每个 Stack 都有不同的 S3 Bucket(用于网站托管);
- 我有一个创建 IAM 用户(由 CI/CD 使用)的堆栈;
- 在这种情况下,CI/CD 是 GitHub Actions(每次合并时部署
main
); - 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