Amazon-Web-Services
安全儲存由 IaC 創建的 AWS IAM 使用者密鑰(訪問和秘密)
我有以下設置:
- 使用 AWS CDK 設置基礎設施;
- 我有一個堆棧/環境(生產,登台……);
- 每個 Stack 都有不同的 S3 Bucket(用於網站託管);
- 我有一個創建 IAM 使用者的堆棧(由 CI/CD 使用);
- 在這種情況下,CI/CD 是 GitHub Actions(每次合併
main
發生時部署);- IAM 使用者只對所有 Bucket 擁有 put 權限(deploy 是指將資產放入 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);
我花了一段時間,但我終於把我的想法總結在這裡:https ://dev.to/viniciuskneves/use-aws-through-github-actions-without-secret-keys-32eo
想法是使用OpenID Connect與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 🔧 uses: aws-actions/configure-aws-credentials@v1.6.1 # Version at the time of this writing with: # We are loading keys stored in secrets role-to-assume: arn:aws:iam::<ACCOUNT>:role/<ROLE-NAME> # You can specify the role name when creating it or AWS will automatically generate one for you aws-region: eu-central-1 - run: npm run deploy # Just an example