🕌

【GitHub Actions】 OIDC で AWS 認証を行う

2024/02/18に公開

概要

近年、CICDパイプラインでGitHub Actionsが多く利用されます。AWS環境に対してCICDを構築する際には、AWSのOIDC機能を使って安全に認証認可を行い、操作を行うことができるので、その方法を記載します。

OIDCとは

OIDC(OpenID Connect)は、OAuth 2.0の拡張であり、認証とAPIアクセスのためのフレームワークです。OIDCを使用すると、ユーザーは自身のIDをクライアントアプリケーションに対して安全に提供し、クライアントアプリケーションはそのIDを使用してユーザーを認証できます。

ハンズオン

  • 前提条件
    • AWS環境を持っていること
    • GitHubのアカウントを持っていて、既にレポジトリ等を作成していること
  • 実施手順
    • 【AWS】ID プロバイダを作成する
    • 【AWS】IAM ロールを作成する
    • 【GitHub】GitHub Actions で OIDC を使用して AWS 認証実施

【AWS】ID プロバイダを作成する

  • AWS環境にログイン>IAM>ID プロバイダ>プロバイダを追加 を選択する

  • 設定値を入力して作成する(設定内容はGitHubの公式ページに記載があります)
       ※GitHub公式
No 設定項目 設定内容
1 プロバイダのタイプ OpenID Connect
2 プロバイダ名 https://token.actions.githubusercontent.com
3 対象者 sts.amazonaws.com

【AWS】IAM ロールを作成する

  • AWS環境にログイン>IAM>ロール>ロールを作成 を選択する

  • 信頼されたエンティティタイプ で カスタム信頼ポリシー を選択し、 下記の信頼ポリシー を入力します。

    • 信頼エンティティにある"token.actions.githubusercontent.com:sub": "repo:<GITHUB_USER_ORG>/<GITHUB_REPOSITORY>を設定をすることで、特定のリポジトリ/ブランチのみ認証を許可できます。
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": {
                "Federated": "arn:aws:iam::<AWSアカウントID>:oidc-provider/token.actions.githubusercontent.com"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
                "StringEquals": {
                    "token.actions.githubusercontent.com:aud": "sts.amazonaws.com",
                    "token.actions.githubusercontent.com:sub": "repo:<GitHubユーザー名>/<GitHubリポジトリ名>:ref:refs/heads/<ブランチ名>"
                }
            }
        }
    ]
}
  • IAM ロールに必要なポリシーをアタッチする。
  • 任意のロール名をつけて完了。

【GitHub】GitHub Actions で OIDC を使用して AWS 認証実施

  • github/workflows/aws-auth.ymlという名前のファイルを作成してください。
name: AWS Auth OIDC
# 全てのブランチにpushされた時に起動する
on:
  push:
    branches:
      - '*'

# 作成したロールarnを設定
env:
  AWS_ROLE_ARN: arn:aws:iam::<AWSアカウントID>:role/<IAMロール名>


permissions:
  id-token: write
  contents: read

jobs:
  aws-deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: aws-actions/configure-aws-credentials@v1
        with:
          role-to-assume: ${{ env.AWS_ROLE_ARN }}
          aws-region: ap-northeast-1
  • pushしてaws-actions/configure-aws-credentialsまで実行できれば完了です。

  • 補足

    • permissions セクションは、id-token: write、contents: read の設定が必要です。
id-token: write このアクセス権は、IDトークンを書き込むことができます。IDトークンは、OpenID Connect(OIDC)プロバイダから発行され、認証されたユーザーの識別情報を含むトークンです。この権限が与えられると、GitHub ActionsのワークフローはIDトークンを生成し、必要に応じて書き込むことができます。
contents: read このアクセス権は、リポジトリ内のファイルやディレクトリの内容を読み取ることができます。この権限が与えられると、GitHub Actionsのワークフローはリポジトリ内のファイルを読み取り、必要に応じて操作することができます。
  • 詳細は下記の アクセス許可設定の追加 をご確認ください。
    GitHub公式ページ

まとめ

GitHubからAWSに対して、セキュアに認証認可する方法を書きました。今後AWSへのCICDパイプラインの記事も書ければと思います。

Discussion