OmniAuth
- プラン: Free、Premium、Ultimate
- 提供形態: GitLab Self-Managed
ユーザーは、Google、GitHub、その他の一般的なサービスの認証情報を使用してGitLabにサインインできます。OmniAuthは、GitLabがこの認証を提供するために使用するRackフレームワークです。
設定すると、追加のサインインオプションがサインインページに表示されます。
サポートされているプロバイダー
GitLabは、次のOmniAuthプロバイダーをサポートしています。
| プロバイダーのドキュメント | OmniAuthプロバイダー名 |
|---|---|
| AliCloud | alicloud |
| Atlassian | atlassian_oauth2 |
| Auth0 | auth0 |
| AWS Cognito | cognito |
| Azure v2 | azure_activedirectory_v2 |
| Bitbucket Cloud | bitbucket |
| Generic OAuth 2.0 | oauth2_generic |
| GitHub | github |
| GitLab.com | gitlab |
google_oauth2 | |
| JWT | jwt |
| Kerberos | kerberos |
| OpenID Connect | openid_connect |
| Salesforce | salesforce |
| SAML | saml |
| Shibboleth | shibboleth |
共通設定を行う
OmniAuthプロバイダーを設定する前に、すべてのプロバイダーに共通の設定を行います。
| オプション | 説明 |
|---|---|
allow_bypass_two_factor | ユーザーが2要素認証(2FA)なしで、指定されたプロバイダーでサインインできるようにします。true、false、またはプロバイダーの配列を指定できます。詳細については、2要素認証を回避するを参照してください。 |
allow_single_sign_on | OmniAuthでサインインする際のアカウントの自動作成を有効にします。true、false、またはプロバイダーの配列を指定できます。プロバイダー名については、サポートされているプロバイダーの表を参照してください。falseの場合、既存のGitLabアカウントなしで、OmniAuthプロバイダーのアカウントを使用してサインインすることはできません。まずGitLabアカウントを作成してから、プロファイル設定でOmniAuthプロバイダーのアカウントと接続する必要があります。 |
auto_link_ldap_user | OmniAuthプロバイダーを介して作成されたユーザーに対して、GitLabでLDAPアイデンティティを作成します。この設定を有効にするには、LDAPインテグレーションが有効になっている必要があります。また、LDAPおよびOmniAuthプロバイダーでユーザーのuidが同一である必要があります。 |
auto_link_saml_user | SAMLプロバイダーを介して認証するユーザーと、既存のGitLabユーザーのメールアドレスが一致する場合に、それらを自動的にリンクできるようにします。この設定を有効にするには、SAMLインテグレーションが有効になっている必要があります。 |
auto_link_user | OmniAuthプロバイダーを介して認証するユーザーと、既存のGitLabユーザーのメールアドレスが一致する場合に、それらを自動的にリンクできるようにします。true、false、またはプロバイダーの配列を指定できます。プロバイダー名については、サポートされているプロバイダーの表を参照してください。 |
auto_sign_in_with_provider | 単一のプロバイダー名を使用してユーザーが自動的にサインインできるようにします。ここで指定する名前は、samlやgoogle_oauth2など、プロバイダー名と一致している必要があります。サインインの無限ループを防ぐために、ユーザーはGitLabからサインアウトする前に、Identity Providerのアカウントからサインアウトしておく必要があります。サポートされているOmniAuthプロバイダー向けのフェデレーションサインアウトを実装するために、SAMLなどを対象とした機能拡張が現在進行中です。 |
block_auto_created_users | 自動的に作成されたユーザーを、管理者が承認するまで承認保留中状態にします。falseに設定した場合は、SAMLやGoogleなど、制御可能なプロバイダーを必ず指定してください。そうしないと、インターネット上の誰でも、管理者の承認なしにGitLabにサインインできるようになる可能性があります。trueに設定した場合は、自動作成されたユーザーはデフォルトでブロックされ、サインインできるようにするには管理者がブロックを解除する必要があります。 |
enabled | GitLabにおけるOmniAuthの使用を有効または無効にします。falseの場合、UIにOmniAuthプロバイダーボタンは表示されません。 |
external_providers | external(外部)プロバイダーとして扱うOmniAuthプロバイダーを定義できます。この設定により、これらのプロバイダーを介してアカウントの作成やサインインを行うユーザーは、内部プロジェクトにアクセスできなくなります。プロバイダーのフルネームを指定する必要があります。たとえば、Googleの場合はgoogle_oauth2です。詳細については、外部プロバイダーリストを作成するを参照してください。 |
providers | プロバイダー名は、サポートされているプロバイダーの表に記載されています。 |
sync_profile_attributes | サインイン時にプロバイダーから同期するプロファイル属性のリスト。詳細については、OmniAuthユーザープロファイルを最新の状態に保つを参照してください。 |
sync_profile_from_provider | GitLabがプロファイル情報を自動的に同期するプロバイダー名のリスト。各エントリは、samlやgoogle_oauth2など、プロバイダー名と一致している必要があります。詳細については、OmniAuthユーザープロファイルを最新の状態に保つを参照してください。 |
初期設定を行う
OmniAuth設定を変更するには、次の手順に従います:
/etc/gitlab/gitlab.rbを編集します:# CAUTION! # This allows users to sign in without having a user account first. Define the allowed providers # using an array, for example, ["saml", "google_oauth2"], or as true/false to allow all providers or none. # User accounts will be created automatically when authentication was successful. gitlab_rails['omniauth_allow_single_sign_on'] = ['saml', 'google_oauth2'] gitlab_rails['omniauth_auto_link_ldap_user'] = true gitlab_rails['omniauth_block_auto_created_users'] = trueファイルを保存して、GitLabを再設定します:
sudo gitlab-ctl reconfigure
Helm値をエクスポートします:
helm get values gitlab > gitlab_values.yamlgitlab_values.yamlを編集し、globals.appConfigのomniauthセクションを更新します:global: appConfig: omniauth: enabled: true allowSingleSignOn: ['saml', 'google_oauth2'] autoLinkLdapUser: false blockAutoCreatedUsers: true詳細については、グローバル設定に関するドキュメントを参照してください。
ファイルを保存して、新しい値を適用します:
helm upgrade -f gitlab_values.yaml gitlab gitlab/gitlab
docker-compose.ymlを編集します:version: "3.6" services: gitlab: environment: GITLAB_OMNIBUS_CONFIG: | gitlab_rails['omniauth_allow_single_sign_on'] = ['saml', 'google_oauth2'] gitlab_rails['omniauth_auto_link_ldap_user'] = true gitlab_rails['omniauth_block_auto_created_users'] = trueファイルを保存して、GitLabを再起動します:
docker compose up -d
/home/git/gitlab/config/gitlab.ymlを編集します:## OmniAuth settings omniauth: # Allow sign-in by using Google, GitLab, etc. using OmniAuth providers # Versions prior to 11.4 require this to be set to true # enabled: true # CAUTION! # This allows users to sign in without having a user account first. Define the allowed providers # using an array, for example, ["saml", "google_oauth2"], or as true/false to allow all providers or none. # User accounts will be created automatically when authentication was successful. allow_single_sign_on: ["saml", "google_oauth2"] auto_link_ldap_user: true # Locks down those users until they have been cleared by the admin (default: true). block_auto_created_users: trueファイルを保存して、GitLabを再起動します:
# For systems running systemd sudo systemctl restart gitlab.target # For systems running SysV init sudo service gitlab restart
これらの設定を終えたら、選択したプロバイダーの設定に進むことができます。
プロバイダーごとの設定
allow_single_sign_onが設定されている場合、GitLabはサインインしているユーザーのユーザー名を決定するために、OmniAuthのauth_hashで返された次のフィールドのいずれかを使用し、存在するフィールドの中で最初に見つかったものを選択します:
usernamenicknameemail
プロバイダーごとにGitLabの設定を作成し、argsを使用してそのプロバイダーに設定を渡すことができます。あるプロバイダーに対するargsにgitlab_username_claim変数を設定すると、GitLabのユーザー名として使用する別のクレームを選択できます。指定するクレームは、競合が発生しないよう一意である必要があります。
gitlab_rails['omniauth_providers'] = [
# The generic pattern for configuring a provider with name PROVIDER_NAME
gitlab_rails['omniauth_providers'] = {
name: "PROVIDER_NAME"
...
args: { gitlab_username_claim: 'sub' } # For users signing in with the provider you configure, the GitLab username will be set to the "sub" received from the provider
},
# Here are examples using GitHub and Kerberos
gitlab_rails['omniauth_providers'] = {
name: "github"
...
args: { gitlab_username_claim: 'name' } # For users signing in with GitHub, the GitLab username will be set to the "name" received from GitHub
},
{
name: "kerberos"
...
args: { gitlab_username_claim: 'uid' } # For users signing in with Kerberos, the GitLab username will be set to the "uid" received from Kerberos
},
]- { name: 'PROVIDER_NAME',
# ...
args: { gitlab_username_claim: 'sub' }
}
- { name: 'github',
# ...
args: { gitlab_username_claim: 'name' }
}
- { name: 'kerberos',
# ...
args: { gitlab_username_claim: 'uid' }
}OmniAuthを介して作成されたユーザーのパスワード
統合認証で作成されたユーザーのパスワードの生成に関するガイドでは、OmniAuthで作成されたユーザーに対してGitLabがパスワードを生成および設定する方法の概要を説明しています。
既存のユーザーに対してOmniAuthを有効にする
既存のユーザーの場合は、GitLabアカウントが作成された後、OmniAuthプロバイダーを有効にできます。たとえば、最初にLDAPでサインインした場合、GoogleなどのOmniAuthプロバイダーを有効にできます。
- GitLabの認証情報、LDAP、または別のOmniAuthプロバイダーでGitLabにサインインします。
- 左側のサイドバーで、自分のアバターを選択します。
- プロファイルの編集を選択します。
- 左側のサイドバーで、アカウントを選択します。
- 接続したアカウントセクションで、GoogleなどのOmniAuthプロバイダーを選択します。
- プロバイダーにリダイレクトされます。GitLabを承認すると、GitLabにリダイレクトされます。
これで、選択したOmniAuthプロバイダーを使用してGitLabにサインインできます。
インポートソースを無効にせずにOmniAuthプロバイダーでのサインインを有効または無効にする
管理者は、一部のOmniAuthプロバイダーのサインインを有効または無効にできます。
デフォルトでは、config/gitlab.ymlで設定されたすべてのOAuthプロバイダーに対してサインインは有効になっています。
OmniAuthプロバイダーを有効または無効にするには、次の手順に従います:
- 左側のサイドバーの下部で、管理者を選択します。
- 設定 > 一般を選択します。
- サインインの制限を展開します。
- 有効なOAuth認証ソースセクションで、有効または無効にする各プロバイダーのチェックボックスをオンまたはオフにします。
OmniAuthを無効にする
OmniAuthはデフォルトで有効になっています。ただし、OmniAuthは、プロバイダーが設定され、有効になっている場合にのみ機能します。
OmniAuthプロバイダーを個別に無効にしていても問題を引き起こす場合は、設定ファイルを変更することで、OmniAuthサブシステム全体を無効にできます。
gitlab_rails['omniauth_enabled'] = falseomniauth:
enabled: false既存のユーザーをOmniAuthユーザーにリンクする
OmniAuthユーザーと既存のGitLabユーザーのメールアドレスが一致する場合、それらを自動的にリンクできます。
次の例では、OpenID ConnectプロバイダーとGoogle OAuthプロバイダーに対して、自動リンクを有効にしています。
gitlab_rails['omniauth_auto_link_user'] = ["openid_connect", "google_oauth2"]omniauth:
auto_link_user: ["openid_connect", "google_oauth2"]自動リンクを有効にするこの方法は、SAMLを除くすべてのプロバイダーに対して機能します。SAMLの自動リンクを有効にするには、SAMLのセットアップ手順を参照してください。
外部プロバイダーリストを作成する
外部OmniAuthプロバイダーのリストを定義できます。リストに含まれているプロバイダーを介してアカウントを作成またはGitLabにサインインしたユーザーは、内部プロジェクトへのアクセス権を付与されず、外部ユーザーとしてマークされます。
外部プロバイダーリストを定義するには、プロバイダーのフルネームを使用します。たとえば、Googleの場合はgoogle_oauth2です。プロバイダー名については、サポートされているプロバイダーの表のOmniAuth provider name(OmniAuthプロバイダー名)の列を参照してください。
OmniAuthプロバイダーを外部プロバイダーリストから削除する場合、このサインイン方法を使用するユーザーを手動で更新して、アカウントを完全な内部アカウントにアップグレードする必要があります。
gitlab_rails['omniauth_external_providers'] = ['saml', 'google_oauth2']omniauth:
external_providers: ['saml', 'google_oauth2']OmniAuthユーザープロファイルを最新の状態に保つ
一部のプロバイダーでは、これらの属性を同期するために追加の設定が必要です。たとえば、SAMLプロバイダーではプロファイル属性のマッピングが必要です。
選択したOmniAuthプロバイダーからのプロファイル同期を有効にできます。次のユーザー属性を任意の組み合わせで同期できます:
nameemailjob_titlelocationorganization
LDAPを使用して認証する場合は、ユーザーの名前とメールアドレスは常に同期されます。
/etc/gitlab/gitlab.rbを編集します:gitlab_rails['omniauth_sync_profile_from_provider'] = ['saml', 'google_oauth2'] gitlab_rails['omniauth_sync_profile_attributes'] = ['name', 'email', 'job_title', 'location', 'organization']ファイルを保存して、GitLabを再設定します:
sudo gitlab-ctl reconfigure
Helm値をエクスポートします:
helm get values gitlab > values.yamlvalues.yamlを編集します:global: appConfig: omniauth: syncProfileFromProvider: ['saml', 'google_oauth2'] syncProfileAttributes: ['name', 'email', 'job_title', 'location', 'organization']ファイルを保存して、新しい値を適用します:
helm upgrade -f values.yaml gitlab gitlab/gitlab
docker-compose.ymlを編集します:version: "3.6" services: gitlab: environment: GITLAB_OMNIBUS_CONFIG: | gitlab_rails['omniauth_sync_profile_from_provider'] = ['saml', 'google_oauth2'] gitlab_rails['omniauth_sync_profile_attributes'] = ['name', 'email', 'job_title', 'location', 'organization']ファイルを保存して、GitLabを再起動します:
docker compose up -d
/home/git/gitlab/config/gitlab.ymlを編集します:production: &base omniauth: sync_profile_from_provider: ['saml', 'google_oauth2'] sync_profile_attributes: ['name', 'email', 'job_title', 'location', 'organization']ファイルを保存して、GitLabを再起動します:
# For systems running systemd sudo systemctl restart gitlab.target # For systems running SysV init sudo service gitlab restart
2要素認証を回避する
特定のOmniAuthプロバイダーを使用すると、ユーザーは2要素認証(2FA)を使用せずにサインインできます。
2FAを回避するには、次のいずれかを実行します:
- 配列を使用して、許可されるプロバイダーを定義する(例:
['saml', 'google_oauth2'])。 - すべてのプロバイダーを許可する場合は
true、許可しない場合はfalseを指定する。
このオプションは、すでに2FAを備えているプロバイダーに対してのみ設定する必要があります。デフォルトはfalseです。
この設定はSAMLには適用されません。
gitlab_rails['omniauth_allow_bypass_two_factor'] = ['saml', 'google_oauth2']omniauth:
allow_bypass_two_factor: ['saml', 'google_oauth2']プロバイダーで自動的にサインインする
auto_sign_in_with_provider設定をGitLabの設定に追加することで、認証のためにログインリクエストをOmniAuthプロバイダーにリダイレクトできます。これにより、サインインする前にプロバイダーを選択する必要がなくなります。
たとえば、Azure v2インテグレーションの自動サインインを有効にするには、次の手順に従います:
gitlab_rails['omniauth_auto_sign_in_with_provider'] = 'azure_activedirectory_v2'omniauth:
auto_sign_in_with_provider: azure_activedirectory_v2すべてのサインイン試行がOmniAuthプロバイダーにリダイレクトされるため、ローカルの認証情報を使用してサインインできなくなる点に注意してください。少なくとも1人のOmniAuthユーザーが管理者であることを確認してください。
https://gitlab.example.com/users/sign_in?auto_sign_in=falseにアクセスして、自動サインインを回避することもできます。
カスタムOmniAuthプロバイダーアイコンを使用する
ほとんどのサポートされているプロバイダーには、表示されるサインインボタン用の組み込みのアイコンが用意されています。
独自のアイコンを使用するには、画像が64 x 64ピクセルで表示されるように最適化されていることを確認したうえで、次の2つの方法のいずれかでアイコンをオーバーライドします:
Provide a custom image path(カスタム画像パスを指定する):
- GitLabサーバーのドメインの外部で画像をホストしている場合は、画像ファイルへのアクセスを許可するようにコンテンツセキュリティポリシーを設定します。
- GitLabのインストール方法に応じて、GitLab設定ファイルにカスタム
iconパラメータを追加します。OpenID Connectプロバイダーの例については、OpenID Connect OmniAuthプロバイダーを参照してください。
Embed an image directly in a configuration file(設定ファイルに画像を直接埋め込む): この例では、画像のBase64エンコードバージョンを作成します。この形式の画像は、Data URLを介して提供できます:
GNU
base64コマンド(例:base64 -w 0 <logo.png>)を使用して画像ファイルをエンコードします。このコマンドは、1行の<base64-data>文字列を返します。Base64エンコードされたデータを、GitLab設定ファイルのカスタム
iconパラメータに追加します:omniauth: providers: - { name: '...' icon: 'data:image/png;base64,<base64-data>' # Additional parameters removed for readability }
アプリまたは設定を変更する
GitLabのOAuthは、同じ外部認証および認可プロバイダーを複数のプロバイダーとして設定することをサポートしていないため、プロバイダーまたはアプリを変更する場合は、GitLabの設定とユーザーアイデンティティを同時に更新する必要があります。たとえば、samlとazure_activedirectory_v2を設定できますが、同じ設定内にazure_activedirectory_v2をもう1つ追加することはできません。
この手順は、GitLabがextern_uidを保存しており、それがユーザー認証に使用する唯一のデータであるすべての認証方法に適用されます。
プロバイダー内でアプリを変更する場合、ユーザーのextern_uidが変更されないのであれば、更新する必要があるのはGitLabの設定のみです。
設定を切り替えるには、次の手順に従います:
gitlab.rbファイルでプロバイダーの設定を変更します。- 以前のプロバイダーに対応するGitLabのアイデンティティを持つすべてのユーザーの
extern_uidを更新します。
extern_uidを確認するには、既存ユーザーの現在のextern_uidを調べ、同じユーザーについて、現在のプロバイダーの適切なフィールドと一致するIDを特定します。
extern_uidを更新するには、次の2つの方法があります:
ユーザーAPIを使用する(プロバイダー名と新しい
extern_uidを渡す)。Railsコンソールを使用する:
Identity.where(extern_uid: 'old-id').update!(extern_uid: 'new-id')
既知の問題
ほとんどのサポートされているOmniAuthプロバイダーは、HTTPパスワード認証を介したGitをサポートしていません。回避策として、パーソナルアクセストークンを使用して認証できます。