GitLab を Entra ID で SSO 出来るように設定する
SaaS 版 GitLab では無く、自身で Linux などへ構築する GitLab Self-Managed 上で Entra ID と SAML 連携し、SSO する為の設定手順をメモしておきます。
検証環境¶
対象 | バージョン |
---|---|
Amazon Linux | 2023.7.20250414 |
GitLab | 17.11.1-ee.0 |
作業の流れ¶
作業は以下の流れで進めます。
- GitLab を構築する (Amazon Linux 2023 へ GitLab をインストールする を参照)
- Entra ID にエンタープライズアプリケーションを登録する
- GitLab に SSO 設定を実施する
Entra ID にエンタープライズアプリケーションを登録する¶
Azure Portal へログインしたら Entra 管理センターへアクセスします。
Step.1¶
アプリケーション
→ エンタープライズアプリケーション
をクリックします。
Step.2¶
新しいアプリケーション
をクリックします。
Step.3¶
独自のアプリケーションの作成
をクリックします。
Step.4¶
お使いのアプリの名前は何ですか?
に対して、任意の名前を入力します。 この名前は設定上、利用するものではありませんが、管理者が見て分かりやすい名前を設定しておきます。 アプリケーションでどのような操作を行いたいですか?
は ギャラリーに見つからないその他のアプリケーションを統合します (ギャラリー以外)
のまま、作成
をクリックします。
Step.5¶
エンタープライズアプリケーションが作成されました。 SSO の設定をする為、シングル サインオン
をクリックします。
Step.6¶
SAML
をクリックします。
Step.7¶
以下の画面が表示されます。 「1. 基本的な SAML 構成」は情報を入力する必要があります。 「3. SAML 証明書」と「4. 〜 のセットアップ」は表示されている情報を控えておき、後の手順で GitLab へ設定する必要があります。 詳しくは次のステップで内容を説明します。
Step.8¶
「1. 基本的な SAML 構成」へ、以下の情報を入力します。 FQDN 部分は自身の環境に合わせて調整します。
項目 | 入力例 |
---|---|
識別子 (エンティティ ID) | https://gitlab.example.com/users/auth/saml/metadata |
応答 URL (Assertion Consumer Service URL) | https://gitlab.example.com/ |
サインオン URL | https://gitlab.example.com/ |
Step.9¶
「3. SAML 証明書」から「拇印」の値を控えます。 これは 0123456789ABCDEF0123456789ABCDEF01234567
のようなフォーマットです。 後の手順で GitLab へ設定する際は 2 文字ごとに :
(コロン) を入力し、01:23:45:67:89:AB:CD:EF:01:23:45:67:89:AB:CD:EF:01:23:45:67
のようなフォーマットへ変換して利用します。
Step.10¶
「4. 〜 のセットアップ」から「ログイン URL」と「ログアウト URL」を控えます。 今回、両者は同じ値でした。
これで Azure 側で確認は終わりです。
GitLab に SSO 設定を実施する¶
GitLab の設定ファイルは /etc/gitlab/gitlab.rb
です。 このファイルに以下の内容を追記します。 尚、omniauth_allow_single_sign_on
を true
にしていると SSO でログインを試みたユーザが「管理者の承認待ち」状態になってしまい、承認されるまでログイン出来ません。 この状態を避けたい場合は false
を指定します。
項目 | 説明 |
---|---|
assertion_consumer_service_url | https://FQDN/users/auth/saml/callback |
issuer | 「1. 基本的な SAML 構成」に入力した「識別子 (エンティティ ID)」の値 |
idp_cert_fingerprint | 「3. SAML 証明書」の「拇印」の値を 2 文字ごとに : (コロン) で区切った値 |
idp_sso_target_url | 「4. 〜 のセットアップ」の「ログイン URL」の値 |
idp_slo_target_url | 「4. 〜 のセットアップ」の「ログアウト URL」の値 |
gitlab_rails['omniauth_allow_single_sign_on'] = ['saml']
gitlab_rails['omniauth_block_auto_created_users'] = false
gitlab_rails['omniauth_auto_link_saml_user'] = true
gitlab_rails['omniauth_providers'] = [
{
name: 'saml',
args: {
assertion_consumer_service_url: 'https://gitlab.example.com/users/auth/saml/callback',
issuer: 'https://gitlab.example.com/users/auth/saml/metadata',
idp_cert_fingerprint: '01:23:45:67:89:AB:CD:EF:01:23:45:67:89:AB:CD:EF:01:23:45:67',
idp_sso_target_url: 'https://login.microsoftonline.com/01234567-0123-0123-0123-0123456789AB/saml2',
idp_slo_target_url: 'https://login.microsoftonline.com/01234567-0123-0123-0123-0123456789AB/saml2',
name_identifier_format: 'urn:oasis:names:tc:SAML:2.0:nameid-format:persistent',
attribute_statements: { email: ['http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name'] }
},
label: 'SAML Login'
}
]
追加した設定を反映する為、GitLab を再起動します。
gitlab-ctl reconfigure
GitLab へ SSO でログインする¶
Web ブラウザで GitLab へアクセスします (例. https://gitlab.example.com
)。 そうすると https://gitlab.example.com/users/sign_in
へリダイレクトされ、以下のようなログインフォームが表示されます。 ここで SAML Login
ボタンをクリックすれば設定した Entra ID で SSO が実行されます。 このボタンの表示名を変更したい場合は /etc/gitlab/gitlab.rb
に設定した label
を修正します。
ログイン画面で「パスワード認証フォーム」を表示させない¶
ログイン画面で「パスワード認証フォーム」を表示させたくない場合は 管理者
→ 設定
→ 一般
→ サインインの制限
から Web インターフェイスのパスワード認証を許可する
のチェックを外し、変更を保存
をクリックします。
この変更を実施すると以下のように「外部認証用のフォーム」のみ、表示されるようになります。
「パスワード認証フォーム」を再表示させる¶
もし「root
ユーザでログインしたいのでパスワード認証を再有効化したい」場合は Rails コンソールから設定出来ます。 具体的には gitlab-rails console
を実行して Rails コンソールを起動した後、Gitlab::CurrentSettings.update!(password_authentication_enabled_for_web: true)
を実行します。 私の環境では Rails コンソールの起動だけで 1 分程度、かかりました。 実際の実行例は以下です。
# gitlab-rails console
--------------------------------------------------------------------------------
Ruby: ruby 3.2.5 (2024-07-26 revision 31d0f1a2e7) [aarch64-linux]
GitLab: 17.11.1-ee (cd4c186e8bc) EE
GitLab Shell: 14.41.0
PostgreSQL: 16.8
------------------------------------------------------------[ booted in 53.78s ]
WARNING: Active Record does not support composite primary key.
security_findings has composite primary key. Composite primary key is ignored.
Loading production environment (Rails 7.0.8.7)
irb(main):001:0> Gitlab::CurrentSettings.update!(password_authentication_enabled_for_web: true)
=> true
irb(main):002:0> exit