- 設定
- Kerberosアカウントの作成とリンク
- KerberosアカウントとLDAPアカウントをリンクさせましょう
- HTTP Gitアクセス
- パスワードベースからチケットベースの Kerberos サインインへのアップグレード
- Active Directory Kerberos環境のサポート
- トラブルシューティング
- 役立つリンク
Kerberos を OAuth 2.0 認証プロバイダーとして使用します。
GitLabは認証メカニズムとしてKerberosとインテグレーションすることができます。
- GitLabを設定して、ユーザーがKerberos認証情報でサインインできるようにすることができます。
- Kerberosを使うことで、送信されたパスワードの傍受や盗聴を防ぐことができます。
設定
GitLabがKerberosトークンベースの認証を提供するためには、以下の前提条件を実行してください。realmsの指定など、Kerberosを使用するための設定が必要です。GitLabはシステムのKerberos設定を利用します。
GitLab keytab
- GitLabサーバーのHTTPサービス用のKerberosサービス・プリンシパルを作成します。GitLab サーバーが
gitlab.example.com
で、Kerberos レルムがEXAMPLE.COM
の場合は、Kerberos データベースに Service PrincipalHTTP/gitlab.example.com@EXAMPLE.COM
を作成します。 - GitLabサーバー上に上記のサービスプリンシパル用のkeytabを作成します。例えば、
/etc/http.keytab
。
keytabは機密ファイルなので、GitLabユーザーが読めるようにしなければなりません。所有権を設定し、ファイルを適切に保護します:
sudo chown git /etc/http.keytab
sudo chmod 0600 /etc/http.keytab
GitLab の設定
セルフコンパイルによるインストール
kerberos
gemグループがインストールされていることを確認してください。-
gitlab.yml
のkerberos
セクションを編集して Kerberos チケットベース認証を有効にします。ほとんどの場合、Kerberosを有効にしてkeytabの場所を指定するだけです:omniauth: enabled: true allow_single_sign_on: ['kerberos'] kerberos: # Allow the HTTP Negotiate authentication method for Git clients enabled: true # Kerberos 5 keytab file. The keytab file must be readable by the GitLab user, # and should be different from other keytabs in the system. # (default: use default keytab from Krb5 config) keytab: /etc/http.keytab
-
変更を有効にするためにGitLabを再起動してください。
Linux パッケージのインストール
-
/etc/gitlab/gitlab.rb
を編集します:gitlab_rails['omniauth_allow_single_sign_on'] = ['kerberos'] gitlab_rails['kerberos_enabled'] = true gitlab_rails['kerberos_keytab'] = "/etc/http.keytab"
GitLabがKerberosを通して最初のサインイン時に自動的にユーザーを作成するのを避けるために、
gitlab_rails['omniauth_allow_single_sign_on']
にkerberos
を設定しないでください。 -
変更を有効にするには、GitLabを再設定してください。
GitLabはサインインとHTTP Gitアクセスにnegotiate
認証方法を提供するようになり、この認証プロトコルをサポートするGitクライアントがKerberosトークンで認証できるようになりました。
シングルサインオンの有効化
共通設定を構成して、シングルサインオンプロバイダとしてkerberos
。これにより、既存のGitLabアカウントを持っていないユーザーのためのJust-In-Timeアカウントプロビジョニングが可能になります。
Kerberosアカウントの作成とリンク
Kerberosアカウントを既存のGitLabアカウントにリンクするか、KerberosユーザーがサインインしようとしたときにGitLabが新しいアカウントを作成するように設定します。
Kerberosアカウントを既存のGitLabアカウントにリンクします。
Kerberos SPNEGOはGitLab 15.4でKerberosに名称変更されました。
管理者であれば、Kerberosアカウントを既存のGitLabアカウントにリンクすることができます。それには
- 左のサイドバーで、Search を選択するか、次のページに進んでください。
- Admin Areaを選択します。
- 左側のサイドバーで、[概要] > [ユーザー]を選択します。
- ユーザーを選択し、[Identities]タブを選択します。
- Provider]ドロップダウンリストから[Kerberos]を選択します。
- Identifierが Kerberos ユーザー名に対応していることを確認します。
- 変更を保存を選択します。
管理者でない場合
- 左のサイドバーで、自分のアバターを選択してください。
- プロフィールの編集を選択します。
- 左サイドバーで「アカウント」を選択します。
- サービス・サインイン]セクションで、[Kerberos接続]を選択します。Servicesign-inKerberos]オプションが表示されない場合は、[Enable single sign-on]の要件に従ってください。
どちらの場合でも、Kerberos認証を使ってGitLabアカウントにサインインできるようになります。
最初のサインインでアカウントを作成
ユーザーが初めてKerberosアカウントでGitLabにサインインするとき、GitLabはそれに一致するアカウントを作成します。続行する前に、OmnibusとGitLabソースの共通設定オプションをレビューしてください。また、kerberos
.
その情報を手元に置いて
-
allow_single_sign_on
設定で'kerberos'
を含めます。 - 今のところ、デフォルトの
block_auto_created_users
オプション、true を受け入れます。 - ユーザーが Kerberos 認証を使ってサインインしようとすると、GitLab は新しいアカウントを作成します。
-
block_auto_created_users
が true の場合、Kerberos ユーザーは次のようなメッセージを見るかもしれません:Your account has been blocked. Please contact your GitLab administrator if you think this is an error.
- 管理者として、ブロックされた新しいアカウントを確認できます:
- 左のサイドバーで、Search を選択するか、次のページに進んでください。
- Admin Areaを選択します。
- 左サイドバーで「概要」>「ユーザー」を選択し、「ブロック」タブをレビューします。
- ユーザーを有効にできます。
- 管理者として、ブロックされた新しいアカウントを確認できます:
-
block_auto_created_users
が false の場合、Kerberos ユーザーは認証され、GitLab にサインインします。
-
block_auto_created_users
block_auto_created_users
はデフォルトのままにしておくことをお勧めします。管理者が知らないうちにGitLabにアカウントを作成するKerberosユーザーは、セキュリティ・リスクになる可能性があります。
KerberosアカウントとLDAPアカウントをリンクさせましょう
ユーザーがKerberosでサインインし、LDAPインテグレーションも有効にしている場合、ユーザーは最初のサインイン時にLDAPアカウントにリンクされます。これを機能させるには、いくつかの前提条件を満たす必要があります:
Kerberosユーザー名がLDAPユーザーのUIDと一致していること。どのLDAP属性をUIDとして使うかはGitLabLDAP設定で選択できますが、Active Directoryの場合はsAMAccountName
。
Kerberosレルムは、LDAPユーザーの識別名のドメイン部分と一致しなければなりません。例えば、Kerberos レルムがAD.EXAMPLE.COM
の場合、LDAP ユーザーの識別名はdc=ad,dc=example,dc=com
で終わる必要があります。
これらのルールをまとめると、リンクはユーザーのKerberosユーザー名がfoo@AD.EXAMPLE.COM
、LDAP識別名がsAMAccountName=foo,dc=ad,dc=example,dc=com
のような場合にのみ機能します。
カスタム許可レルム
GitLab 13.5 で導入されました。
ユーザーのKerberosレルムがユーザーのLDAP DNのドメインと一致しない場合に、カスタム許可レルムを設定することができます。設定値には、ユーザーが持つと思われるドメインをすべて指定する必要があります。その他のドメインは無視され、LDAP ID はリンクされません。
-
/etc/gitlab/gitlab.rb
を編集します:gitlab_rails['kerberos_simple_ldap_linking_allowed_realms'] = ['example.com','kerberos.example.com']
-
ファイルを保存し、変更を有効にするために GitLab を再設定します。
-
config/gitlab.yml
を編集します:kerberos: simple_ldap_linking_allowed_realms: ['example.com','kerberos.example.com']
-
ファイルを保存して GitLab を再起動すると、変更が有効になります。
HTTP Gitアクセス
リンクされた Kerberos アカウントを使えば、標準の GitLab 認証情報だけでなく Kerberos アカウントを使ってgit pull
やgit push
にアクセスすることができます。
リンクされたKerberosアカウントを持つGitLabユーザーは、Kerberosトークンを使ってgit pull
、git push
。つまり、オペレーションごとにパスワードを送信する必要がありません。
libcurl
には、ネゴシエーションの際にコネクションを再利用しないという既知のイシューがあります。これは、プッシュがhttp.postBuffer
設定よりも大きい場合に作成者のイシューにつながります。これを避けるlibcurl
ために libcurl
、Gitが少なくとも7libcurl
.64.1を使って libcurl
いることを確認してください。インストールされているバージョンをlibcurl
知るには libcurl
、curl-config --version
.Kerberosトークンを使ったHTTP Gitアクセス(パスワードレス認証)
現在の Git のバージョンにはバグがあるため、git
CLI コマンドは、HTTP サーバーがnegotiate
認証方法を提供している場合にのみ、この方法が失敗した場合 (クライアントが Kerberos トークンを持っていない場合など) にも使用します。そのため、Kerberos認証に失敗した場合に、ユーザー名とパスワードを埋め込んだ認証(basic
)にフォールバックすることはできません。
GitLabユーザーが現在のGitバージョンでbasic
とnegotiate
のどちらの認証も使えるようにするには、Kerberosチケットベースの認証を別のポート(例えば8443
)で提供し、標準ポートではbasic
認証のみを提供するようにします。
basic
認証にフォールバックすることができます。ユーザー名とパスワードが URL の一部として渡された場合は、フォールバックに失敗します。たとえば、basic
CI/CD ジョブトークンで認証basic
する GitLab CI/CD ジョブでこのようなことが起こる可能性があります。-
/etc/gitlab/gitlab.rb
を編集します:gitlab_rails['kerberos_use_dedicated_port'] = true gitlab_rails['kerberos_port'] = 8443 gitlab_rails['kerberos_https'] = true
-
変更を有効にするには、GitLabを再設定してください。
-
GitLab用のNGINX設定ファイル(例えば、
/etc/nginx/sites-available/gitlab-ssl
)を編集し、標準のHTTPSポートに加えて、ポート8443
をリッスンするようにNGINXを設定します:server { listen 0.0.0.0:443 ssl; listen [::]:443 ipv6only=on ssl default_server; listen 0.0.0.0:8443 ssl; listen [::]:8443 ipv6only=on ssl;
-
gitlab.yml
のkerberos
セクションを更新します:kerberos: # Dedicated port: Git before 2.4 does not fall back to Basic authentication if Negotiate fails. # To support both Basic and Negotiate methods with older versions of Git, configure # nginx to proxy GitLab on an extra port (for example: 8443) and uncomment the following lines # to dedicate this port to Kerberos authentication. (default: false) use_dedicated_port: true port: 8443 https: true
この変更後、Kerberosチケットベースの認証を使用するには、GitリモートURLをhttps://gitlab.example.com:8443/mygroup/myproject.git
。
パスワードベースからチケットベースの Kerberos サインインへのアップグレード
GitLabの以前のバージョンでは、ユーザーはサインイン時にKerberosのユーザー名とパスワードをGitLabに送信する必要がありました。
GitLab 14.3でパスワードベースのKerberosサインインを非推奨とし、GitLab 15.0で削除しました。チケットベースのサインインに切り替える必要があります。
既存のGitLab設定によっては、Sign in with:KerberosはすでにGitLabサインインページに表示されているかもしれません。そうでない場合は、上記の設定を追加してください。
パスワードベースのKerberosサインインを無効にするには、gitlab.yml
/gitlab.rb
ファイルからOmniAuthプロバイダkerberos
を削除してください。
-
/etc/gitlab/gitlab.rb
を編集し、gitlab_rails['omniauth_providers']
の下の{ "name" => "kerberos" }
行を削除します:gitlab_rails['omniauth_providers'] = [ { "name" => "kerberos" } # <-- remove this entry ]
-
変更を有効にするには、GitLabを再設定してください。
-
gitlab.yml
を編集し、OmniAuth providers の下にある- { name: 'kerberos' }
行を削除します:omniauth: # Rest of configuration omitted # ... providers: - { name: 'kerberos' } # <-- remove this line
-
変更を有効にするためにGitLabを再起動してください。
kerberos
OmniAuthプロバイダを削除することで、HTTPS経由でクローンしようとしたときに稀に発生するKrb5Auth::Krb5::Exception (No credentials cache found)
エラー(500
error in GitLab)を解決することもできます。Active Directory Kerberos環境のサポート
Active DirectoryドメインでKerberosチケットベースの認証を使用する場合、Kerberosプロトコルの拡張によりHTTP認証ヘッダーのサイズがデフォルトの8kBより大きくなる可能性があるため、NGINXで許可される最大ヘッダーサイズを大きくする必要がある場合があります。NGINXの設定で、large_client_header_buffers
をより大きな値に設定します。
Windows AD で AES のみの暗号化を使用して作成されたキータブを使用します。
Advanced Encryption Standard(AES)- only encryptionを使用してキータブを作成する場合、ADサーバーのそのアカウントに対して、This account supports Kerberos AES <128/256> bit encryptionチェックボックスを選択する必要があります。チェックボックスが128ビットか256ビットかは、keytab作成時に使用した暗号化強度によって異なります。これを確認するには、Active Directoryサーバーで
- ユーザーとグループツールを開きます。
- キータブの作成に使用したアカウントを探します。
- アカウントを右クリックし、プロパティを選択します。
- アカウント] タブの [アカウント オプション] で、適切な [AES 暗号化サポート] チェックボックスを選択します。
- 保存して閉じます。
トラブルシューティング
Windows ADに対するKerberos認証でGoogle Chromeを使用する場合
Google Chrome を使って Kerberos 認証で GitLab にサインインする場合は、完全なユーザー名を入力しなければなりません。例えば、username@domain.com
。
完全なユーザー名を入力しないと、サインインに失敗します。ログをチェックすると、サインインに失敗した証拠として次のようなイベントメッセージが表示されます:
"message":"OmniauthKerberosController: failed to process Negotiate/Kerberos authentication: gss_accept_sec_context did not return GSS_S_COMPLETE: An unsupported mechanism was requested\nUnknown error"`.
GitLabとKerberosサーバー間の接続をテストしてください。
kinit
やklist
のようなユーティリティを使って、GitLabサーバーとKerberosサーバー間の接続性をテストすることができます。これらのインストール方法はOSによって異なります。
klist
を使って、klist
ファイルで利用可能なサービスプリンシパル名(SPN) と、各 SPN の暗号化タイプを確認します:
klist -ke /etc/http.keytab
Ubuntuサーバーの場合、出力は以下のようになります:
Keytab name: FILE:/etc/http.keytab
KVNO Principal
---- --------------------------------------------------------------------------
3 HTTP/my.gitlab.domain@MY.REALM (des-cbc-crc)
3 HTTP/my.gitlab.domain@MY.REALM (des-cbc-md5)
3 HTTP/my.gitlab.domain@MY.REALM (arcfour-hmac)
3 HTTP/my.gitlab.domain@MY.REALM (aes256-cts-hmac-sha1-96)
3 HTTP/my.gitlab.domain@MY.REALM (aes128-cts-hmac-sha1-96)
verboseモードでkinit
。GitLabがkeytabファイルを使ってKerberosサーバーに接続できるかどうかをテストします:
KRB5_TRACE=/dev/stdout kinit -kt /etc/http.keytab HTTP/my.gitlab.domain@MY.REALM
このコマンドは認証プロセスの詳細な出力を表示します。
サポートされていない GSSAPI メカニズム
Kerberos SPNEGO認証では、ブラウザはサポートしているメカニズムのリストをGitLabに送ることになっています。GitLab がサポートしているメカニズムのどれにも対応していない場合は、認証に失敗してログにこのようなメッセージが表示されます:
OmniauthKerberosController: failed to process Negotiate/Kerberos authentication: gss_accept_sec_context did not return GSS_S_COMPLETE: An unsupported mechanism was requested Unknown error
このエラーメッセージにはいくつかの原因と解決策が考えられます。
専用ポートを使用していないKerberosインテグレーション
GitLab CI/CDは、Kerberosインテグレーションが専用ポートを使用するように設定されていない限り、Kerberos対応のGitLabインスタンスでは動作しません。
クライアントマシンとKerberosサーバー間の接続性の欠如
これは通常、ブラウザが直接Kerberosサーバーに接続できない場合に起こります。この場合、IAKERB
として知られているサポートされていないメカニズムに戻ります。このメカニズムは、Kerberosサーバーへの仲介としてGitLabサーバーを使おうとします。
このエラーが発生する場合は、クライアントマシンと Kerberos サーバーが接続されていることを確認してください!ファイアウォールによってトラフィックがブロックされているか、DNSレコードが正しくない可能性があります。
GitLab DNS record is a CNAME record
エラー
GitLabがCNAME
レコードで参照されている場合、Kerberosはこのエラーで失敗します。このイシューを解決するには、GitLabのDNSレコードがA
レコードであることを確認してください。
GitLabインスタンスのホスト名の順方向DNSレコードと逆方向DNSレコードが不一致です。
もう一つの失敗モードは、GitLabサーバーのフォワードDNSレコードとリバースDNSレコードが一致しない場合に起こります。この場合、Windowsクライアントは動作しますが、Linuxクライアントは失敗することがよくあります。逆引きDNSを使ってKerberosレルムを検出します。もし間違ったレルムを取得すると、通常のKerberosメカニズムが失敗し、クライアントはIAKERB
、上記のエラーメッセージにつながるネゴシエーションを試みます。
これを解決するには、GitLabサーバーのフォワードDNSとリバースDNSが一致していることを確認します。例えば、GitLab にgitlab.example.com
としてアクセスし、IP アドレス10.0.2.2
に解決する場合、2.2.0.10.in-addr.arpa
はgitlab.example.com
のPTR
レコードでなければなりません。
ブラウザやクライアントマシンにKerberosライブラリがない
最後に、ブラウザまたはクライアント・マシンがKerberosを完全にサポートしていない可能性があります。Kerberosライブラリがインストールされ、他のKerberosサービスに認証できることを確認してください。
HTTPベーシック:クローン作成時にアクセスが拒否されます
remote: HTTP Basic: Access denied
fatal: Authentication failed for '<KRB5 path>'
Git v2.11以降を使用していてクローン作成時に上記のエラーが発生する場合は、http.emptyAuth
Git オプションをtrue
に設定することで解決します:
git config --global http.emptyAuth true
こちらも参照ください:Git v2.11 リリースノート