モダンなCI/CDパイプラインを構築する際、GitHub ActionsからAWSリソースへのデプロイや操作を行うケースは非常に多く存在します。しかし、従来の「IAMユーザーのアクセスキー」をGitHubのSecretsに登録する方法は、キーの漏洩リスクや管理の手間という大きな課題を抱えていました。
本記事では、セキュリティのベストプラクティスであるOIDC(OpenID Connect)を使用し、アクセスキーを完全に排除して安全にAWSへ接続するための具体的な設定手順を、初心者から中級者向けに分かりやすく解説します。
前提知識/必要な理由
OIDCを利用する最大の理由は、「有効期限のない認証情報を永続的に保管する必要がなくなる」という点にあります。
従来のアクセスキー方式では、キーが万が一漏洩した場合、悪意のある第三者にAWS環境へ不正アクセスされる致命的なリスクがありました。一方でOIDC方式では、GitHub Actionsの実行時にAWSのSTS(Security Token Service)から「有効期限付きの短期トークン」を動的に取得して認証を行います。これにより、安全性が飛躍的に向上し、鍵のローテーションなどの管理運用コストからも解放されます。
具体的な設定手順・設計方法
設定は大きく分けて「AWS側での準備」と「GitHub側での準備」の2つのフェーズで進めます。
1. AWSでのIDプロバイダ作成
まず、AWS IAM(Identity and Access Management)コンソールで、GitHubを認証先(IDプロバイダ)として登録します。
- AWSマネジメントコンソールで「IAM」を開き、左メニューの「IDプロバイダー」を選択して「プロバイダーを追加」をクリックします。
- プロバイダーのタイプに「OpenID Connect」を選択します。
- プロバイダーのURLに「
https://token.actions.githubusercontent.com」を入力し、「サムプリントを取得」をクリックします。 - 対象者(Audience)に「
sts.amazonaws.com」を入力します。 - 最後に「プロバイダーを追加」をクリックします。
2. IAMロールの作成と信頼関係ポリシーの設定
次に、GitHub Actionsが一時的に引き受ける(Assumeする)ためのIAMロールを作成します。
新規のIAMロールを作成し、信頼関係ポリシー(Trust Relationship)に以下のJSONを設定します。これにより、特定のGitHubリポジトリからのみ認証を許可する制限をかけます。123456789012とyour-org/your-repoは、自身のAWSアカウントIDおよびGitHubリポジトリ名に置き換えてください。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::123456789012: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:your-org/your-repo:*"
}
}
}
]
}
※IAMロールの権限(許可ポリシー)には、S3へのアップロードやECSの更新など、GitHub Actionsで実際に実行したい処理に応じた最小限のポリシーをアタッチしてください。
3. GitHub Actionsワークフローの実装
GitHubリポジトリ内の「.github/workflows/deploy.yml」に、AWSへOIDC経由で接続するためのジョブを記述します。
AWSへの接続には、AWS公式が提供している外部アクション aws-actions/configure-aws-credentials を使用します。このアクションは、GitHub Actionsのワークフローから直接呼び出すだけで機能するため、事前にランナー側へ手動でパッケージやCLIなどをインストールする必要はありません。ただし、OIDCトークンを発行するために、ワークフロー内で必ず id-token: write のパーミッションを指定する必要があります。
name: Connect to AWS with OIDC
on:
push:
branches:
- main
permissions:
id-token: write # OIDCトークンを取得するために必須
contents: read # リポジトリのソースコードを読み取るために必要
jobs:
aws-connect:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::123456789012:role/your-github-actions-role
aws-region: ap-northeast-1
- name: Check AWS Identity
run: |
aws sts get-caller-identity
実務での注意点
- リポジトリ制限を厳密に行うこと: 信頼関係ポリシー内の
token.actions.githubusercontent.com:sub条件でワイルドカード「*」を多用しすぎると、同じ組織内の別リポジトリや、最悪の場合は第三者のリポジトリからのアクセスを許してしまう可能性があります。必ずrepo:your-org/your-repo:*のように、アクセスを許可するリポジトリを厳密に指定してください。 - パーミッションの定義漏れ:
permissions: id-token: writeを指定し忘れると、一時的なWeb IDトークンの生成に失敗し、AWSへの認証エラー(403 Forbidden)が発生します。エラーが発生した際はまずパーミッション設定を見直しましょう。 - ロールの引き受け最大時間の考慮:
configure-aws-credentialsでは、デフォルトで1時間のセッション有効期限が設定されます。大規模なビルドやマイグレーションなど、1時間以上の長時間の処理が必要な場合は、role-duration-secondsオプションで制限時間を調整してください。
まとめ
OIDCを用いたGitHub ActionsからAWSへの接続設定は、認証情報の漏洩リスクをゼロにするために非常に有効な手段です。初期設定の手間は多少かかりますが、一度構築してしまえば、アクセスキーのローテーション管理やセキュリティインシデントへの怯えから解放されます。実務でCI/CD環境を構築する際は、必ず最優先でこのOIDC構成を選択するようにしましょう。