Amazon-Web-Services

安全儲存由 IaC 創建的 AWS IAM 使用者密鑰(訪問和秘密)

  • March 17, 2022

我有以下設置:

  1. 使用 AWS CDK 設置基礎設施;
  2. 我有一個堆棧/環境(生產,登台……);
  3. 每個 Stack 都有不同的 S3 Bucket(用於網站託管);
  4. 我有一個創建 IAM 使用者的堆棧(由 CI/CD 使用);
  5. 在這種情況下,CI/CD 是 GitHub Actions(每次合併main發生時部署);
  6. 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 ConnectGitHub 連接,然後擁有一個可由 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

引用自:https://serverfault.com/questions/1096129