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- OpenSSH
サービスごとに個別のポートを使用することで、両方のサービスを同時に実行できます。
gitlab-sshdを使用する場合
gitlab-sshdを設定するには、gitlab-sshdドキュメントを参照してください。gitlab-sshdを有効にすると、GitLab Shellとgitlab-sshdが自動的に高速ルックアップを使用するように構成されます。
OpenSSHの場合
前提要件:
AuthorizedKeysCommandがフィンガープリントを受け入れる必要があるため、OpenSSH 6.9以降が必要です。バージョンを確認するには、sshd -Vを実行します。
OpenSSHで高速ルックアップを設定するには:
次の内容を
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のアップグレード中に一時的な所有権の変更が必要になる場合があります。
- Linuxパッケージのインストール:
OpenSSHをリロードします:
# Debian or Ubuntu installations sudo service ssh reload # CentOS installations sudo service sshd reloadSSHが機能していることを確認します:
authorized_keysファイルで、ユーザーのキーをコメントアウトします。これを行うには、行を#で開始します。ローカルマシンから、リポジトリをプルするか、以下を実行します:
ssh -T git@gitlab.example.comプルが成功するか、ウェルカムメッセージは、キーがファイルに存在しないため、GitLabがデータベースでキーを見つけたことを意味します。
ルックアップに失敗した場合でも、authorized_keysファイルはスキャンされます。ファイルが大きい限り、多くのユーザーにとってGit SSHのパフォーマンスは依然として遅い可能性があります。
これを解決するには、authorized_keysファイルへの書き込みを無効にすることができます:
SSHが動作することを確認してください。そうしないと、ファイルがすぐに最新ではない状態になるため、この手順は重要です。
authorized_keysファイルへの書き込みを無効にします:- 左側のサイドバーの下部で、管理者を選択します。
- 左側のサイドバーの下部にある設定 > ネットワークを選択します。
- パフォーマンスの最適化を展開します。
- Use
authorized_keysfile to authenticate SSH keysチェックボックスをオフにします。 - 変更を保存を選択します。
変更を確認します:
- UIでSSHキーを削除します。
- 新しいキーを追加します。
- リポジトリをプルしてみてください。
authorized_keysファイルをバックアップして削除します。現在のユーザーのキーはすでにデータベースに存在するため、移行やユーザーがキーを再追加する必要はありません。
authorized_keysファイルの使用に戻る方法
この概要は簡単です。詳細については、前の手順を参照してください。
authorized_keysファイルへの書き込みを有効にします。- 左側のサイドバーの下部で、管理者を選択します。
- 左側のサイドバーで、設定>ネットワークを選択します。
- パフォーマンスの最適化を展開します。
- Use
authorized_keysfile to authenticate SSH keysチェックボックスをオンにします。
authorized_keysファイルを再構築します。- LinuxパッケージのインストールからDockerを使用している場合は、
/etc/ssh/sshd_configまたは/assets/sshd_configからAuthorizedKeysCommand行を削除します。 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を完全に読み取らないように、UsePAMをsshd_configで無効にすることを検討してください。
実行中のsshd: gitプロセスでstraceとlsofを実行すると、デバッグ情報が返されます。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#/.*##')