Gitlab + AzureAD + SAML 連携
概要
Gitlab の OmniAuth Provider を使って Azure AD と SAML 連携してみました
AzureAD の oauth2 連携の記事はよく見るのですが SAML 連携はあまり見ない気がします
ポイントは AzureAD でエンタープライズアプリケーション「Azure AD SAML Toolkit」を作成する点です
環境
- Gitlab 14.3.4-ee
- AzureAD (20211126 時点)
まずは AzureAD でエンタープライズアプリケーションを作成します
Azure ポータルにログインしたら「Azue Active Directory」を選択します
AzureAD のトップページに来たら左メニューの「エンタープライズアプリケーション」を選択します
「新しいアプリケーション」からエンタープライズアプリケーションを作成します
検索窓で「Azure Toolkit」で検索しましょう
すると「Azure AD SAML Toolkit」が表示されるので選択します
右ペインで名前を入力できるので好きな名前を入力して「作成」しましょう
エンドポイントの確認
エンタープライズアプリケーションは普通のアプリとしても登録されています
左メニューの「アプリの登録」からアプリの一覧を確認できます
アプリの詳細を選択して「エンドポイント」を選択すると SAML ログインに必要な URL が表示さます
「SAML-P サインオンエンドポイント」に記載されている URL をメモしておきましょう
シングルサインオンの設定
作成されたエンタープライズアプリケーションを選択し詳細画面にいきます
先程は「アプリの登録」でアプリを確認しましたがエンタープライズアプリケーションは左メニューの「エンタープライズアプリケーション」から確認できます
一覧から作成した Azure AD SAML Toolkit のエンタープライズアプリケーションを選択しましょう
シングルサインオンの設定にある「作業の開始」を選択します
そして SAML を選択します
1 番の「基本的なSAML構成」を「編集」します
右ペインに必要な情報を入力します
- 識別子・・・GitlabのURL
- 応答 URL・・・GItlabのURLのコールバックURL
- サインオンURL・・・先程アプリの登録のエンドポイントで確認したURL
入力したら「保存」しましょう
シングルサインオンから必要な情報をメモ
3 番に「SAML 署名証明書」があります
ここの「拇印」をメモしておきましょう
email 属性の追加
2 番に「属性とクレーム」があります
Gitlab と SAML 連携する場合には必ず email or mail という属性がレスポンスに含まれている必要があります
編集を選択します
- 名前・・・email
- 名前空間・・・空
- ソース・・・属性
- ソース属性・・・user.mail
と入力し「保存」します
アプリにユーザを登録する
左メニューの「ユーザとグループ」を選択します まだユーザはいないので「ユーザまたはグループの追加」を選択します
好きなユーザやグループを登録しましょう
Gitlab からログインできるユーザはここでエンタープライズアプリケーションに紐付けたユーザまたはグループのみになります
gitlab.rb の修正
あとは gitlab.rb を編集します
OmniAuth の部分を編集します
記載する箇所を5箇所です
- assertion_consumer_service_url・・・Gitlabのコールバック用のURL
- idp_cert_fingerprint・・・先程確認した拇印
- idp_sso_target_url・・・エンドポイントで確認したSAMLサインオンURL
- issuer・・・GitlabのURL
- label・・・ログイン時に表示される文言
あと任意で変更して良さそうな名は omniauth_block_auto_created_users になります
true にすると SAML 経由でログインしたユーザは自動で登録されずに Gitlab の Admin ユーザの承認を待ってからログインすることができます
false になっていれば自動で承認されて使えるようになります
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",
label: "AzureAdTest",
args: {
assertion_consumer_service_url: "https://your.gitlab.example.com/users/auth/saml/callback",
idp_cert_fingerprint: "3番で確認した拇印",
idp_sso_target_url: "アプリ登録のエンドポイントで確認したSAMLサインオンURL",
issuer: "https://your.gitlab.example.com",
name_identifier_format: "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent"
}
}
]
必要な箇所が修正できたら reconfigure を実行しましょう
動作確認
Gitlab にアクセスするとログインフォームの下の方に Azure AD でログインするためのボタンが設置されます
ボタンを押すと MS のログイン画面に遷移するのでここで先程登録したユーザやグループに属するユーザでログインしてみましょう
トラブルシューティング
422 でログインできない場合は email 属性がちゃんと設定されているか確認しましょう
最後に
AzureAD + Gitlab + SAML 認証を試してみました
一番わかりづらかったのはエンタープライズアプリケーションを作る点でした
普通のアプリケーションだと SAML の設定項目がなく oauth2 しかできなさそうなので注意しましょう
今回は「Azure AD SAML Toolkit」を使いましたがもしかするとそのうちエンタープライズアプリケーションの一覧に「Gitlab」が登場するかもしれません
また今回やらなかったこととして他の属性の連携 (name) やユーザの2authの対応などはやりませんでした
この辺りもできそうなので興味があれば調べてみると良いかもしれません
参考サイト