正式なドキュメントは英語版であり、この日本語訳はAI支援翻訳により作成された参考用のものです。日本語訳の一部の内容は人間によるレビューがまだ行われていないため、翻訳のタイミングにより英語版との間に差異が生じることがあります。最新かつ正確な情報については、英語版をご参照ください。

SSHキーの高速ルックアップ

  • プラン: Free、Premium、Ultimate
  • 提供形態: GitLab Self-Managed

ユーザー数が増加すると、OpenSSHが認証済みユーザーを認証するために、authorized_keysファイル全体を線形検索するため、SSH操作が遅くなります。このプロセスにはかなりの時間とディスクI/Oが必要となり、ユーザーがリポジトリにプッシュまたはプルする際に遅延が発生します。ユーザーがキーを頻繁に追加または削除すると、オペレーティングシステムがauthorized_keysファイルをキャッシュしない場合があり、ディスクI/Oが繰り返し発生します。

authorized_keysファイルを使用する代わりに、GitLab Shellを設定してSSHキーをルックアップできます。GitLabデータベースでルックアップがインデックス化されているため、より高速です。

標準(デプロイキーではない)認証済みユーザーの場合は、SSH証明書の使用を検討してください。データベースルックアップよりも高速ですが、authorized_keysファイルのドロップイン代替にはなりません。

Geoには高速ルックアップが必要です

  • プラン: Premium、Ultimate
  • 提供形態: GitLab.com、GitLab Self-Managed、GitLab Dedicated

Cloud Native GitLabとは異なり、Linuxパッケージのインストールでは、gitユーザーのホームディレクトリにあるauthorized_keysファイルがデフォルトで管理されます。ほとんどのインスタンスでは、このファイルは/var/opt/gitlab/.ssh/authorized_keysにあります。システム上のauthorized_keysを特定するには、次のコマンドを使用します:

getent passwd git | cut -d: -f6 | awk '{print $1"/.ssh/authorized_keys"}'

authorized_keysファイルには、GitLabへのアクセスを許可されたユーザーのすべての公開SSHキーが含まれています。ただし、信頼できる唯一の情報源を維持するには、Geoを構成して、データベースルックアップでSSHのフィンガープリントルックアップを実行する必要があります。

Geoを設定する場合は、プライマリノードとセカンダリノードの両方について、以下の手順に従う必要があります。プライマリノードでWrite to authorized keys file(ファイルに書き込む) を選択しないでください。データベースレプリケーションが機能している場合、セカンダリで自動的に反映されるためです。

高速ルックアップの設定

GitLab Shellは、GitLabデータベースへの高速なインデックス付きルックアップを使用して、SSHユーザーを認可する方法を提供します。GitLab Shellは、SSHキーのフィンガープリントを使用して、ユーザーがGitLabにアクセスする権限があるかどうかを確認します。

高速ルックアップは、次のSSHサーバーで有効にできます:

サービスごとに個別のポートを使用することで、両方のサービスを同時に実行できます。

gitlab-sshdを使用する場合

gitlab-sshdを設定するには、gitlab-sshdドキュメントを参照してください。gitlab-sshdを有効にすると、GitLab Shellとgitlab-sshdが自動的に高速ルックアップを使用するように構成されます。

OpenSSHの場合

前提要件:

  • AuthorizedKeysCommandがフィンガープリントを受け入れる必要があるため、OpenSSH 6.9以降が必要です。バージョンを確認するには、sshd -Vを実行します。

OpenSSHで高速ルックアップを設定するには:

  1. 次の内容をsshd_configファイルに追加します:

    Match User git    # Apply the AuthorizedKeysCommands to the git user only
      AuthorizedKeysCommand /opt/gitlab/embedded/service/gitlab-shell/bin/gitlab-shell-authorized-keys-check git %u %k
      AuthorizedKeysCommandUser git
    Match all    # End match, settings apply to all users again

    このファイルは通常、次の場所にあります:

    • Linuxパッケージのインストール: /etc/ssh/sshd_config
    • Dockerのインストール: /assets/sshd_config
    • 自己コンパイルによるインストール: ソースからGitLab Shellをインストールする手順に従った場合、コマンドは/home/git/gitlab-shell/bin/gitlab-shell-authorized-keys-checkにあります。このコマンドはrootが所有権を持ち、グループや他のユーザーが書き込み可能でないため、他の場所にラッパースクリプトを作成することを検討してください。必要に応じて、このコマンドの所有権の変更も検討してください。ただし、gitlab-shellのアップグレード中に一時的な所有権の変更が必要になる場合があります。
  2. OpenSSHをリロードします:

    # Debian or Ubuntu installations
    sudo service ssh reload
    
    # CentOS installations
    sudo service sshd reload
  3. SSHが機能していることを確認します:

    1. authorized_keysファイルで、ユーザーのキーをコメントアウトします。これを行うには、行を#で開始します。

    2. ローカルマシンから、リポジトリをプルするか、以下を実行します:

      ssh -T git@gitlab.example.com

      プルが成功するか、ウェルカムメッセージは、キーがファイルに存在しないため、GitLabがデータベースでキーを見つけたことを意味します。

ルックアップに失敗した場合でも、authorized_keysファイルはスキャンされます。ファイルが大きい限り、多くのユーザーにとってGit SSHのパフォーマンスは依然として遅い可能性があります。

これを解決するには、authorized_keysファイルへの書き込みを無効にすることができます:

  1. SSHが動作することを確認してください。そうしないと、ファイルがすぐに最新ではない状態になるため、この手順は重要です。

  2. authorized_keysファイルへの書き込みを無効にします:

    1. 左側のサイドバーの下部で、管理者を選択します。
    2. 左側のサイドバーの下部にある設定 > ネットワークを選択します。
    3. パフォーマンスの最適化を展開します。
    4. Use authorized_keys file to authenticate SSH keysチェックボックスをオフにします。
    5. 変更を保存を選択します。
  3. 変更を確認します:

    1. UIでSSHキーを削除します。
    2. 新しいキーを追加します。
    3. リポジトリをプルしてみてください。
  4. authorized_keysファイルをバックアップして削除します。現在のユーザーのキーはすでにデータベースに存在するため、移行やユーザーがキーを再追加する必要はありません。

authorized_keysファイルの使用に戻る方法

この概要は簡単です。詳細については、前の手順を参照してください。

  1. authorized_keysファイルへの書き込みを有効にします。
    1. 左側のサイドバーの下部で、管理者を選択します。
    2. 左側のサイドバーで、設定>ネットワークを選択します。
    3. パフォーマンスの最適化を展開します。
    4. Use authorized_keys file to authenticate SSH keysチェックボックスをオンにします。
  2. authorized_keysファイルを再構築します。
  3. LinuxパッケージのインストールからDockerを使用している場合は、/etc/ssh/sshd_configまたは/assets/sshd_configからAuthorizedKeysCommand行を削除します。
  4. sshdをリロードします: sudo service sshd reload

SELinuxのサポート

GitLabは、SELinuxを使用したauthorized_keysデータベースルックアップをサポートしています。

SELinuxポリシーは静的であるため、GitLabは内部ウェブサーバーポートの変更をサポートしていません。管理者は、動的に生成されないため、環境用に特別な.teファイルを作成する必要があります。

追加ドキュメント

gitlab-sshdに関する追加の技術ドキュメントは、GitLab Shellドキュメントにあります。

トラブルシューティング

SSHトラフィックが遅いか、CPU負荷が高い

SSHトラフィックが遅いか、CPU負荷が高い場合:

  • /var/log/btmpのサイズを確認してください。
  • 定期的に、または特定のサイズに達した後にローテーションされていることを確認してください。

このファイルが非常に大きい場合、GitLab SSH高速ルックアップにより、ボトルネックがより頻繁に発生し、パフォーマンスがさらに低下する可能性があります。/var/log/btmpを完全に読み取らないように、UsePAMsshd_configで無効にすることを検討してください。

実行中のsshd: gitプロセスでstracelsofを実行すると、デバッグ情報が返されます。IP x.x.x.xの進行中のGit over SSH接続でstraceを取得するには、次を実行します:

sudo strace -s 10000 -p $(sudo netstat -tp | grep x.x.x.x | egrep 'ssh.*: git' | sed -e 's/.*ESTABLISHED *//' -e 's#/.*##')

または、実行中のGit over SSHプロセスのlsofを取得します:

sudo lsof -p $(sudo netstat -tp | egrep 'ssh.*: git' | head -1 | sed -e 's/.*ESTABLISHED *//' -e 's#/.*##')