<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>OIDC on あるエンジニアのログブック</title><link>https://cloud-aws.net/tags/oidc/</link><description>Recent content in OIDC on あるエンジニアのログブック</description><generator>Hugo -- gohugo.io</generator><language>ja</language><lastBuildDate>Thu, 02 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://cloud-aws.net/tags/oidc/index.xml" rel="self" type="application/rss+xml"/><item><title>IAM IDプロバイダー — AWSにユーザーを作らないという設計</title><link>https://cloud-aws.net/post/iam-id-provider/</link><pubDate>Thu, 15 Jun 2023 00:00:00 +0000</pubDate><guid>https://cloud-aws.net/post/iam-id-provider/</guid><description>&lt;h2 id="なぜこの仕組みがあるのか"&gt;なぜこの仕組みがあるのか
&lt;/h2&gt;&lt;p&gt;IAMのベストプラクティスには昔から「IAMユーザーを増やすな」がある。アクセスキーは漏れるし、退職者アカウントの棚卸しは漏れるし、パスワードポリシーの面倒は増える。認証情報は、配った瞬間から管理すべき負債になる。&lt;/p&gt;
&lt;p&gt;そこで発想を逆にする。&lt;strong&gt;認証は、すでにユーザーを管理している場所（Google Workspace、Active Directory、GitHub…）にやらせて、AWSは「その認証結果を信じて、どの権限を渡すか」だけを判断する&lt;/strong&gt;。この「外の認証を信じる」ための受け口がIAM IDプロバイダーだ。&lt;/p&gt;
&lt;p&gt;外部IdPと信頼関係を張るという意味では、ADのドメイントラストと同じ発想になる。認証の実体は向こうにあり、こちらは署名の検証だけをする。&lt;/p&gt;
&lt;h2 id="仕組み--登場人物は3つ"&gt;仕組み — 登場人物は3つ
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;外部IdP&lt;/strong&gt;（Google、GitHub、AD FS…）— ユーザーやワークロードを認証し、トークン（OIDC）またはアサーション（SAML）を発行する&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IAM IDプロバイダー&lt;/strong&gt; — 「このIdPが署名したトークンは信じる」という宣言。IdPの発行者情報を登録しておく&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IAMロール + STS&lt;/strong&gt; — トークンを持ってきた相手に &lt;code&gt;AssumeRoleWithWebIdentity&lt;/code&gt;（OIDC）/ &lt;code&gt;AssumeRoleWithSAML&lt;/code&gt;（SAML）で一時クレデンシャルを発行する&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;ポイントは、最後に手に入るのが&lt;strong&gt;一時クレデンシャル&lt;/strong&gt;であること。長命なアクセスキーはこのフローのどこにも生まれない。&lt;/p&gt;
&lt;h2 id="実例--このブログのデプロイがそれ"&gt;実例 — このブログのデプロイがそれ
&lt;/h2&gt;&lt;p&gt;このブログはGitHub ActionsからS3へデプロイしているが、リポジトリのSecretsにアクセスキーは入っていない。ワークフローの認証部分はこれだけだ。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;permissions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;id-token&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;write &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# GitHubにOIDCトークンの発行を許可&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Configure AWS credentials (OIDC)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;uses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;aws-actions/configure-aws-credentials@v4&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;with&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;role-to-assume&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${{ secrets.AWS_OIDC_IAM_ROLE_ARN }}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;流れはこうなる。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;GitHubがワークフロー実行時にOIDCトークンを発行する。「このリポジトリの、このブランチの実行である」と署名付きで主張するトークンだ&lt;/li&gt;
&lt;li&gt;AWS側のIAM IDプロバイダー（&lt;code&gt;token.actions.githubusercontent.com&lt;/code&gt; を登録済み）がその署名を検証する&lt;/li&gt;
&lt;li&gt;ロールのトラストポリシーが「このリポジトリからの引き受けなら許可」と判定する&lt;/li&gt;
&lt;li&gt;STSが短時間だけ有効なクレデンシャルを返し、&lt;code&gt;aws s3 sync&lt;/code&gt; が動く&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;漏れて困るものがリポジトリ側に存在しない。キーのローテーションという作業自体が消える。CI/CDでまだアクセスキーを使っているなら、置き換え先はこれ一択だと思っている。&lt;/p&gt;
&lt;h2 id="似た名前のサービスとの使い分け"&gt;似た名前のサービスとの使い分け
&lt;/h2&gt;&lt;p&gt;認証まわりはサービス名が似ていて混乱するが、「&lt;strong&gt;誰を&lt;/strong&gt;認証したいのか」で切ると整理できる。&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;誰を認証したいか&lt;/th&gt;
					&lt;th&gt;使うもの&lt;/th&gt;
					&lt;th&gt;一言で&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;CI/CD・外部ワークロード&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;IAM IDプロバイダー + IAMロール&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;機械のフェデレーション&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;社員（コンソール/CLIへのSSO）&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;IAM Identity Center&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;人間のSSO。マルチアカウントの入口&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;自作アプリのエンドユーザー&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;Cognito&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;アプリのユーザー基盤（サインアップ・MFA込み）&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;STSはこの表に並ばない。どのパターンでも最後に一時クレデンシャルを発行しているのはSTSであり、対立候補ではなく&lt;strong&gt;全パターン共通のエンジン&lt;/strong&gt;だ。&lt;/p&gt;
&lt;p&gt;このあたりの見分けはSAP試験でも頻出で、判断軸は&lt;a class="link" href="https://cloud-aws.net/post/sap-service-notes/#2-%e8%aa%8d%e8%a8%bc%e8%aa%8d%e5%8f%af%e3%83%91%e3%82%bf%e3%83%bc%e3%83%b3" &gt;サービス別ノートの認証・認可パターン&lt;/a&gt;にまとめてある。&lt;/p&gt;
&lt;h2 id="料金"&gt;料金
&lt;/h2&gt;&lt;p&gt;IAM IDプロバイダー自体は無料。発行された一時クレデンシャルで使ったAWSサービスの料金だけがかかる。&lt;/p&gt;</description></item></channel></rss>