OIDCを構成してEntra IDのアカウントでGitHubへログインできるようにする

Entra IDの条件付きアクセスを使ってGitHubへのログインを制限する目的で、OIDCを構成する手順を確認しました。公式ドキュメントの手順通りだと一部わかりづらいところがあったため、備忘録として設定手順を残します。

:::note info
本手順は2025年3月時点で検証したものです。
:::

# GitHub Enterpriseのトライアル有効化
Entra IDとOIDCを構成し、SSOするためにはEnterprise Managed Usersを使用します。これにはGitHub Enterpriseの利用が必要です。今回は[トライアル](https://github.com/account/enterprises/new?ref_cta=GHEC+trial&ref_loc=setting+up+a+trial+of+github+enterprise+cloud&ref_page=docs)で試します。

Enterprise with managed usersのほうの「Get started」を選択します。
![01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850747/88293d01-a52a-4d30-84fe-1e12bd7db60e.png)

必要事項を記入します。Identity providerは「Microsoft Entra ID」を選択します。
![02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850747/f25303fd-f1fa-48b7-bd14-29d3977f15ee.png)

初期セットアップ用アカウント（<Enterprise名>_admin）のパスワード設定や有効化を完了させ、初期セットアップ用アカウントでGitHubへログインします。

# GitHub側でOIDCを設定
初期セットアップ用アカウントでGitHubにログインしている状態だと以下の画面になっていると思います。[Identity Provider]を選択し、[Enable OIDC Configuration]をクリックします。
もし、別の画面になっている場合は右上のアカウントアイコンをクリックし、「Your Enterprise」を選択してください。
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850747/b8ca0e5f-a6b2-4c22-8a74-707893a140da.png)

Entra IDの認証画面へリダイレクトされます。リダイレクトされたらEntra IDのグローバル管理者権限を持ったアカウントでサインインします。
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850747/49fabf04-b2a4-4891-8913-1bd622940d1a.png)

以下のような画面が出てくるので、「組織の代理として同意する」にチェックを入れて「承諾」をクリックします。

:::note warn
ドキュメントにはチェックを入れるように書いてあるのですが、検証時にチェックを入れ忘れて進めてしまったため、画面ショットではチェックが外れています。チェックを入れ忘れると各アカウントがGitHubに初回サインインする時に同じ画面が出てくるようになります。エンタープライズアプリケーションのアクセス許可の画面で後から同意を与えることは可能です。
:::

![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850747/8cf54455-ef34-425f-99cf-e765739fc8a9.png)

初期セットアップ用アカウントのリカバリーコードが発行されるので控えておきます。リカバリーコードを控えると「Enable OIDC authentication」が押下できるようになるので、クリックします。
![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850747/666b932a-706b-4e69-b402-0a7d5b418c76.png)

GitHub側のOIDC設定が完了しました。

![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850747/0c4107fe-9af8-45cb-8434-6156ff49e6b3.png)

# アクセストークンの発行
引き続き、GitHub側で初期セットアップ用アカウントを利用してアクセストークンを発行します。

右上のアカウントアイコンをクリックし、「Settings」を選択します。

![08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850747/01b95e83-f2ca-43e7-8cef-06ba9b1516fb.png)

メニューの一番下にある「Developer Settings」を選択します。

![09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850747/dd24cb2d-3ba6-45eb-828e-921c9d2af398.png)

「Tokens (classic) 」> 「Generate new token」 > 「Generate new token (classic)」を選択します。

![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850747/37308430-ee7b-4c54-841a-c04ae404ab86.png)

Expirationは「No expiration」（無期限）を選択します。

![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850747/790b2e00-3b44-4428-9488-189ee7b01185.png)

アクセス権限は「scim:enterprise」にだけチェックを入れましょう。これでトークンを生成します。

![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850747/f07d7fde-f764-4f42-a076-04c576e37f5d.png)

トークンが発行されるので値をコピーして控えておきます。

![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850747/7dc98cb3-df33-43ce-8807-829f555db73b.png)

# Entra ID側での設定
次はEntra ID側で設定します。
Entra IDの画面へ移動し、「エンタープライズアプリケーション」>「GitHub Enterprise Managed User (OIDC)」を選択します。

![14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850747/147142fa-1f2d-482b-aaf9-3a02354992ae.png)

左メニューの「管理」 > 「プロビジョニング」を選択します。

![15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850747/7f802d32-8d64-4638-805e-eed0ac31dfe1.png)

プロビジョニング設定画面に遷移します。
改めて「管理」 > 「プロビジョニング」を選択します。

以下のように指定し、「テスト接続」をクリックします。設定が誤っていなければテスト接続に成功します。
| 設定項目 | 設定値 |
|:-:|:-:|
| プロビジョニングモード | 自動  |
| テナントのURL (※) | https://api.github.com/scim/v2/enterprises/{enterprise} |
| シークレットトークン | 事前に作成したアクセストークンを入力  |

※ {enterprise} は、GitHub Enterpriseを有効にするときに指定した「Enterprise URL slug」になるかと思います。今回の検証ではEnterprise name、Enterprise URL slug、Username shortcodeを全部同じ値にしてしまったので、区別がつかなくなりました…。

※ GHE.com のエンタープライズの場合、「https://api.{subdomain}.ghe.com/scim/v2/enterprises/{subdomain}」 を指定します。こちらは未検証。

![16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850747/f6a299ee-8dc5-4532-85de-ca28191a489c.png)

続いて、GitHubへ同期するユーザ・グループを指定します。
「管理」 > 「ユーザとグループ」を選択し、「＋ユーザまたはグループの追加」をクリックします。

![17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850747/05125a3b-84fc-4c91-ab18-3728650c28f3.png)

同期したいユーザ、グループを指定します。
事前に同期用のグループを作っておいて、そのグループに同期させたいユーザを所属させるのが管理しやすいかと思います。

ロールはGitHub側で割り当てるロールを指定します。
各ロールの説明は [エンタープライズにおける役割](https://docs.github.com/ja/enterprise-cloud@latest/admin/managing-accounts-and-repositories/managing-users-in-your-enterprise/roles-in-an-enterprise) を参照してください。

![18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850747/c96de1c1-a564-4815-90aa-eb7fa3b82a3a.png)
![19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850747/f0bd25f0-b8f8-40a5-bb5e-38557e2b81cc.png)

ユーザ・グループの指定が完了したら、プロビジョニングを開始します。
「概要」へ移動し、「プロビジョニングの開始」をクリックします。

![20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850747/73545c0e-858c-4c68-a25e-c79106c1ff78.png)

少し待つと同期が完了します。

![21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850747/1345758d-2c26-4706-a723-ecf139b904f4.png)

# GitHub側で同期結果を確認

GitHub側で同期が成功したか確認します。
「People」> 「Members」を確認します。
Entra ID側で指定したユーザが同期されていることが確認できると思います。

同期されたユーザは「EntraIDのユーザ名_<組織名>」になっています。ユーザ名に「.」が含まれていると「-」に置換されています。

![22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850747/1a891bcc-edcf-40eb-8b68-b6b70f16e6d6.png)

# GitHubにログイン
GitHubのログイン画面に移動し、同期されたユーザ（ユーザ名_{組織名}）を指定します。するとパスワード入力欄がグレーアウトし、「Sign in with your identity provider」というボタンに変わります。このボタンをクリックします。

![23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850747/835db3cd-5221-4bc9-b533-c5c866aa68be.png)

「Continue」をクリックします。

![24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850747/8ee7d31b-8e5a-409e-be31-489dd6d24401.png)

Entra IDの認証画面へリダイレクトされるので、Entra ID側のユーザで認証します。
認証に成功すればGitHubへログインできます。

# その他検証して分かったこと
初期セットアップユーザはOIDCの設定以外は何もできないようになっています。初期セットアップユーザではOrganizationを作れません。Enterprise Ownerのロールを割り当ててEntra IDから同期したユーザを利用します。

条件付きアクセスを有効にするには以下の設定から「Identity Provider」を選択すればできそうです。Azure検証環境側の事情で条件付きアクセスを設定できなかったため、現在未検証です。
![25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850747/c9bf3db9-9428-445f-925d-68615681a7c3.png)


# 参考にした公式ドキュメント
* [エンタープライズ マネージド ユーザーの OIDC の構成](https://docs.github.com/ja/enterprise-cloud@latest/admin/managing-iam/configuring-authentication-for-enterprise-managed-users/configuring-oidc-for-enterprise-managed-users)
* [自動ユーザー プロビジョニング用に GitHub Enterprise Managed User (OIDC) を構成する](https://learn.microsoft.com/ja-jp/entra/identity/saas-apps/github-enterprise-managed-user-oidc-provisioning-tutorial)