在 GitHub Action 中使用 OIDC 取得操作 AWS 資源的權限

程式技術
在 GitHub Action 中使用 OIDC 取得操作 AWS 資源的權限

如果想要在 GitHub Action 中取得操作 AWS 資源的權限,最簡單的做法,就是建立一個 IAM User 並產生與之對應的 Secret Key,再將 Secret Key 儲存在 Action Secrets 中。這樣我們就可以在工作流程中透過 secrets 取得操作 AWS 資源的權限。

AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}

但這種做法有幾個缺點,首先金鑰提供的是長期性的權限,如果你的 IAM User 沒有刪除,金鑰提供的權限就始終有效。再來是金鑰更新較為麻煩,如果你更新了 IAM User 的金鑰,你需要連同 Action Secrets 也一起更新。最後,萬一 Secret Key 洩漏出去,就會造成很嚴重的資安事件。

因此官方建議的做法,是使用 OIDC (OpenID Connect) 來向 AWS 取得一個暫時性的權限,這個權限的有效性只會持續到工作流程結束,因此更為安全。

本篇文章就來簡單的說明如何在 GitHub Action 使用 OIDC 取得 AWS 權限。

新增一個 Identity Provider

在 AWS IAM 的管理頁面中,我們可以點擊左側選單的 Identity provider 來新增一個給 GitHub Action 使用的 Identity Provider。

Provider type 選擇 OpenID Connect,並填寫以下資訊:

  • Provider URLhttps://token.actions.githubusercontent.com
  • Audiencests.amazonaws.com

Provider URL 填寫後需要點擊旁邊的 Get thumbprint 取得一個新的 Thumbprint 後才能建立 Identity Provider。

2024_02_05_15_38_21_6c654fc3c082.png

新增一個 IAM Role 給 Identity Provider 使用

建立好 Identity Provider 之後,進入其詳細的設定頁面,點擊 Assign role 來新增一個給 GitHub Action 使用的 IAM Role。

2024_02_05_15_54_45_a7307f7f8b79.png

設定 Role 總共有三個步驟,第一個步驟是設定 Trusted entity type 選擇 Web identity,並在 Web identity 的設定中輸入以下資訊:

  • GitHub organization 是你的 GitHub 帳號名稱。
  • GitHub repository 是你的專案名稱。
2024_02_05_15_59_05_17d3d5ebfd2a.png

第二個步驟是設定 Role Policy,設定這個 Role 擁有哪些 AWS 資源的權限,這裡選擇最高權限。

這裡是為了方便才選擇最高權限,真實情況應該按照需要用到哪些權限來設定。

2024_02_05_16_06_20_c5a88f4f0d3e.png

最後一個步驟需要為建立的 Role 取一個名稱,為了與官方預設的名稱做區別,我通常使用蛇形命名,輸入名稱後就可以點擊 Create Role 建立一個新的 Role。

新建立 Role 的 Trust Relationships (Assume Role Policy) 如下。GitHub Action 會透過這個 Role 來取得操作 AWS 資源的權限。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::<AWS_ACCOUNT_ID>:oidc-provider/token.actions.githubusercontent.com"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
        },
        "StringLike": {
          "token.actions.githubusercontent.com:sub": [
            "repo:YourGitHubUsername/YourGitHubRepo:*",
            "repo:YourGitHubUsername/YourGitHubRepo2:*"
          ]
        }
      }
    }
  ]
}

在 GitHub Action 中使用 OICD 取得 AWS 權限

測試一下剛剛建立的 Identity Provider 能不能使用,在專案中的 .github/workflows 下新增一個 oidc.yaml 檔案並寫上以下內容:

name: OIDC test

# 允許手動觸發工作流程
on:
  workflow_dispatch:
    inputs:
      name:
        description: Who to greet?
        default: Allen

# 使用 JWT 取得 OIDC token
permissions:
  id-token: write
  contents: read

jobs:
  oidc-test:
    name: A simple OIDC test
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      # AWS 官方的 Action 會透過 OIDC 取得暫時性的權限
      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v4
        with:
          # 使用剛剛建立的 IAM Role
          role-to-assume: arn:aws:iam::154471991214:role/gitHub_action
          aws-region: ap-northeast-1

      # 試試看能否列出所有 S3 儲存桶
      - name: List S3 buckets
        run: |
          aws s3 ls

手動觸發 OIDC test 這個工作流程,成功取得 AWS 權限並列出所有 S3 的儲存桶!

2024_02_05_16_32_26_b1c3a5a67863.png

參考資料

sharkHead
written by
sharkHead

後端打工仔,在下班後喜歡研究各種不同的技術。稍微擅長 PHP,並偶爾涉獵前端開發。個性就像動態語言般隨興,但渴望做事能像囉嗦的靜態語言那樣嚴謹。

0 則留言
新增留言
編輯留言