こんにちは。現場の最前線でエンジニアリングをしていると、「Secretsに保存したAWSアクセスキーが漏洩した」という悪夢のようなインシデントの話を耳にすることがあります。
皆さんは、まだGitHubのSecretsにAWSの長期的な認証情報を貼り付けていませんか?もしそうなら、今日でその習慣と決別しましょう。
今回は、GitHub Actionsの「OIDC(OpenID Connect)」を利用して、パスワードレスでAWSと連携する「最強の安全策」を伝授します。これをマスターすれば、鍵管理のストレスから解放され、セキュリティ強度は桁違いに向上します。
—
なぜ「IAMユーザーキー」は危険なのか?
従来のやり方では、AWSのIAMユーザーを作成し、`AWS_ACCESS_KEY_ID` と `AWS_SECRET_ACCESS_KEY` をGitHubのSecretsに保存していました。しかし、これには致命的な欠陥があります。
1. 鍵が永続的である: 漏洩した場合、誰かが明示的に無効化するまで攻撃者はアクセスし続けられます。
2. 権限過多になりがち: 鍵を回すのが面倒で、つい広範囲な権限を与えてしまいがちです。
3. 監査の難しさ: 「誰がいつ使ったか」の追跡が複雑になります。
OIDC認証という「魔法」の正体
OIDCは、「GitHub Actionsが発行する一時的なトークンを、AWSが信頼して身分証明書として受け取る」という仕組みです。
- 鍵は存在しない: 固定のパスワードを保存する必要はありません。
- 短命なセッション: GitHub Actionsの実行が終われば、そのトークンは無効になります。
- 文脈(Context)ベースの認証: 「このリポジトリの、このブランチで実行されたときだけ」という条件付きでAWSへの接続を許可できます。
—
実践:AWSとGitHub OIDCの接続手順
まずは、「GitHubを信頼できる相手としてAWSに登録する」ことから始めます。
ステップ1:AWS側で「IDプロバイダー」を作成する
AWSコンソールで「IAM」→「IDプロバイダー」を選択し、以下のように設定します。
- プロバイダーのタイプ: OpenID Connect
- プロバイダーのURL: `https://token.actions.githubusercontent.com`
- 対象者(Audience): `sts.amazonaws.com`
これで、AWSはGitHubからのリクエストを受け入れる準備が整いました。
ステップ2:信頼ポリシーを記述したIAMロールの作成
次に、GitHub Actionsが引き受けるための「ロール」を作成します。信頼ポリシー(Trust Policy)には、どのリポジトリからのアクセスを許可するかを明記します。
{
“Version”: “2012-10-17”,
“Statement”: [
{
“Effect”: “Allow”,
“Principal”: {
“Federated”: “arn:aws:iam::[あなたのAWSアカウントID]:oidc-provider/token.actions.githubusercontent.com”
},
“Action”: “sts:AssumeRoleWithWebIdentity”,
“Condition”: {
“StringLike”: {
“token.actions.githubusercontent.com:sub”: “repo:[GitHubユーザー名]/[リポジトリ名]:”
}
}
}
]
}
※ `sub` フィールドでリポジトリを限定するのが重要です。これによって、万が一他のリポジトリが乗っ取られても、このロールは使われません。
—
ステップ3:GitHub ActionsでHelloWorld(動作確認)
設定が完了したら、GitHub Actionsから実際にAWSへアクセスしてみましょう。`.github/workflows/deploy.yml` を作成します。
name: OIDC AWS Test
on: push
permissions:
# OIDCトークンを取得するために必須の権限
id-token: write
contents: read
jobs:
aws-test:
runs-on: ubuntu-latest
steps:
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v4
with:
# 先ほど作成したIAMロールのARN
role-to-assume: arn:aws:iam::[あなたのAWSアカウントID]:role/[作成したロール名]
aws-region: ap-northeast-1
- name: Run AWS Command
# 認証が成功すれば、自分のAWSアカウント情報が表示されます
run: aws sts get-caller-identity
この設定の何がすごいのか?
1. Secretsが空っぽ: GitHub側にAWSの秘密情報は一切ありません。
2. 権限の最小化: IAMロールに必要なS3バケットへのアクセス権やデプロイ権限だけを付与すれば、それ以外の悪用は不可能です。
3. 自動的なローテーション: 毎回発行される一時トークンを使うため、ローテーションという概念すら不要です。
—
先輩エンジニアからのアドバイス
初心者の方は「設定項目が多くて難しそう」と感じるかもしれません。しかし、一度この構築を済ませてしまえば、二度と「鍵の漏洩」に怯える必要はなくなります。
CI/CDを構築する際、まず考えるべきは「いかに便利にするか」ではなく「いかに安全に自動化するか」です。OIDCによるパスワードレス認証は、モダンなDevOpsにおける「現代の教養」と言っても過言ではありません。
まずは小さなリポジトリで、この設定を試してみてください。その瞬間、あなたの開発環境のセキュリティレベルが、世界トップクラスの企業と同じ水準に引き上がるはずです。
もし分からないことがあれば、いつでも聞いてくださいね。一緒に安全で快適なパイプラインを作り上げていきましょう!