はじめに
IDプロバイダーは外部サービスとセキュアに連携することができるサービスです。
以下の方におすすめの内容になっています。
- AWSリソースをセキュアに使用したい
- GitHubとの連携をセキュアにしたい
この記事では、AWS IAMのIDプロバイダを使ってGitHubと連携する方法を初心者向けに解説します。
AWSとGitHubの連携手順
準備するもの
次のものを準備しておきましょう。
- GitHubアカウント
- AWSのアカウント
手順
- GitHubでクライアントIDとOpenID Connect URLを確認
- IAMでIDプロバイダーの作成
- IAMロールの作成と条件付きアクセスの設定
- ロールとアクセス管理
GitHubでクライアントIDとプロバイダURLを確認
GitHubでクライアントIDを確認するにはgitHubActionsに表示させる必要があります。
.github/workflows/deploy.yml
を作成して、以下のコードを記述します。
name: WorkFlow_ver1.2
on:
push:
branches:
- main
permissions:
id-token: write
contents: read
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Request OIDC Token
id: oidc-token
run: |
echo "Requesting OIDC Token..."
OIDC_TOKEN=$(curl -X POST -H "Authorization: Bearer $ACTIONS_ID_TOKEN_REQUEST_TOKEN" "$ACTIONS_ID_TOKEN_REQUEST_URL")
echo $OIDC_TOKEN > oidc_token.txt
- name: Debug OIDC Token
run: |
echo "Debugging OIDC Token..."
cat oidc_token.txt
- name: Clean OIDC Token
run: |
echo "Cleaning OIDC Token..."
tr -d '\n' < oidc_token.txt > clean_oidc_token.txt
- name: Decode OIDC Token
run: |
echo "Decoding OIDC Token..."
TOKEN_CONTENT=$(cat clean_oidc_token.txt | cut -d "." -f2 | base64 --decode || base64 -d)
echo $TOKEN_CONTENT > decoded_token.json
echo "Decoded token has been saved to 'decoded_token.json'."
- name: Upload OIDC Token and Decoded JSON
uses: actions/upload-artifact@v3
with:
name: oidc-files
path: |
oidc_token.txt
clean_oidc_token.txt
decoded_token.json
gitで上記の内容をプッシュしたら、Actionsのタブにビルド後の項目が緑色になって追加されます。
ビルドを失敗すると、赤くなるのでエラーの内容を確認して修正してください。
ビルド完了後の項目をクリックするとoidc-filesという項目ができているので、クリックしてダウンロードしましょう。
ダウンロード後にdecoded_token.json
のデータを確認して、クライアントIDを確認します。
クライアントIDはaud
という部分になります。
jsonの整形がされていない場合は、以下のようなツールを使用してください。
JSON整形&構文チェック:jsonデータ、jsonファイルをフォーマットする | ラッコツールズ
プロバイダURLに記述する必要があるiss
のURLを確認します。
IDプロバイダの作成
IAMでIDプロバイダーを作成していきましょう。
先ほど確認したプロバイダURLとクライアントIDを記述します。
IAMロールの作成とS3への設定
まずは、IAMポリシーを作成します。ポリシー名は「s3-github-upload-policy」にします。
IAMポリシーについて知りたい場合は以下を参考にしてください。
AWS IAMポリシーとは?初心者向けの説明と設定手順やカスタムポリシーの設定についてご紹介!
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::kamecloud.site/*"
}
]
}
GitHubがS3にアップロードできるようにロールを作成します。
特定のリポジトリやブランチのみにアクセスを許可するよう設定します。
ロールはウェブアイデンティティで以下の項目を記述しましょう。
- アイデンティティプロバイダー:先ほど作成したIDプロバイダ
- Audience:
aud
- GitHub 組織:
repository_owner
- GitHub リポジトリ:連携したリポジトリ名
- GitHub ブランチ:連携したいブランチ
信頼ポリシーで以下のようになっていたら設定はOKです。
ロール名を記述して、IAMロールを作成します。ロール名は「s3-github-upload-role」にします。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::<アカウントID>:oidc-provider/token.actions.githubusercontent.com"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"token.actions.githubusercontent.com:aud": "https://github.com/<リポジトリオーナー>",
"token.actions.githubusercontent.com:sub": "repo:<リポジトリオーナー>/<リポジトリ名>:ref:refs/heads/<ブランチ名>"
}
}
}
]
}
GitHub Actionsで動作確認
設定ができたら、GitHub Actionsでビルドが完了したら、S3にアップロードを行い、動作確認をしていきます。
.github/workflows/s3_upload.yml
を作成して、以下のコードを記述します。
name: S3 Upload Test
on:
workflow_dispatch: # 手動実行をトリガー
permissions:
id-token: write # OIDCトークンの発行を有効化
contents: read
jobs:
upload:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v2
with:
role-to-assume: arn:aws:iam::<アカウントID>:role/<ロール名>
aws-region: <リージョン名>
audience:
- name: Upload file to S3
run: |
echo "This is KameCloudInfra test" > upload_test.txt
aws s3 cp upload_test.txt s3:///
gitHubでビルドが完了したことを確認して、以下のように「upload_test.txt」がアップロードされるとIDプロバイダの設定ができています。
IDプロバイダとは
IDプロバイダ(Identity Provider)は、ユーザー認証情報を管理し、外部サービスやアプリケーションへのアクセスを制御する役割を担うサービスです。
具体的には、ユーザーがログインした際にその認証情報を検証し、必要に応じて他のシステムやサービスにその情報を渡すことで、シームレスなアクセスを実現します。
IDプロバイダは、企業や開発チームがセキュリティを確保しながら効率的にアクセス管理を行うためによく使用されます。
GitHubやその他の外部サービスと連携することができます。この仕組みを活用することで、セキュリティリスクを軽減しながら、開発環境全体の管理を効率化することができるようになります。
IDプロバイダとGitHub連携のメリット
連携をするメリットはいくつかあります。
セキュリティの向上
IDプロバイダを通じてGitHubと連携することで、パスワードレス認証でパスワードを管理しなくていい分、安全性が上がります。
また、トークンベースの認証を採用することで、セッションの有効期限管理やアクセス制御も簡潔されます。
運用効率の向上
IDプロバイダで一元管理を行い、複数アカウントを管理する手間が削減します。
運用担当者が複数のアカウント設定をIDプロバイダで統合管理をできます。
チーム管理の効率化
GitHubの場合、チームメンバーの役割に応じた権限を自動的に付与することができます。
IDプロバイダでグループを管理していれば、グループに基づいてGitHub内のアクセスレベルを自動的に割り当てられ、権限管理が効率化されます。
ユースケース
いくつかユースケースを紹介します。
複数リポジトリの一元管理
IDプロバイダを利用すれば、GitHubで複数のリポジトリにわたるアクセス権を統合的に管理できます。
大規模なプロジェクトで10以上のリポジトリを扱う場合、個別にアクセス権を設定すると大きな手間となります。
IDプロバイダを使えば、ユーザーのグループや役割に基づいて自動で権限を設定可能です。これにより、セキュリティを保ちながら管理負担を軽減できます。
GitHub Actionsと連携したセキュアなCI/CD
IDプロバイダでGitHub Actionsを連携し、認証されたリソースへの安全なアクセスをできるようにします。
AWSリソース(S3やRDSなど)を利用するCI/CDパイプラインでは、トークンを通じてアクセス権を付与します。
IDプロバイダを設定しておくと、トークンの生成・利用がセキュアに行えます。これにより、シークレット管理が不要となり、運用負担を軽減できます。
メンバー管理の自動化
新しいチームメンバーのアクセス権付与を自動化し、オンボーディングを効率化します。
新入社員がチームに加わった場合、IDプロバイダでグループに追加するだけで、自動的にGitHubの必要なリポジトリやプロジェクトのアクセス権が付与されます。
これにより、管理者は手動で設定を行う必要がなくなり、オンボーディングの効率が大幅に向上します。
※オンボーディング・・・新しいメンバーが組織やプロジェクトにスムーズに適応するための導入プロセス
まとめ
IDプロバイダを活用したGitHub連携は、セキュリティと効率を大きく向上する手段です。
パスワードレス認証で安全性を高めるだけでなく、一元管理により運用の手間を削減できます。また、チームメンバーの権限付与を自動化することで、オンボーディングも効率化ができます。
大規模プロジェクトやCI/CDパイプラインで特に効果が出るため、運用に取り入れてみてください。