セキュリティ: SSH 認証を備えた Git サーバー

セキュリティ: SSH 認証を備えた Git サーバー
  1. ユーザー「git-server」を作成しました
  2. インストール済みopenssh-server
  3. 変更された/etc/ssh/sshd_config追加PasswordAuthentication no
  4. .ssh/authorized_keys同僚の公開ケースに追加

質問:

  • 'git-server' ユーザーは私のシステムにとって安全ですか? 'git-server' が安全であるという事実を前提として、悪意のある人物が 'git-server' にアクセスした場合、システムにとって最悪のシナリオは何ですか?sudoer
  • gitコマンド 以外のすべての操作を 'git-server' に禁止するにはどうすればよいですか?

答え1

ユーザー git-server のデフォルト シェルを git-shell に変更する必要があります。

git-shell のドキュメント

これは、制限された Git アクセスを提供する SSH アカウントのログイン シェルです。プル/プッシュ機能を実装するサーバー側の Git コマンドと、ユーザーのホーム ディレクトリの git-shell-commands というサブディレクトリにあるカスタム コマンドのみの実行を許可します。

答え2

さて、システム上で git-server アカウントを設定する方法を見てみましょう。

/etc/ssh/sshd_config を変更し、PasswordAuthentication を追加した。

パスワード認証を「いいえ」に設定しているため、有効な SSH キーがなければ、その名前でシステムにリモートでログインすることは事実上不可能です。私の知る限り、SSH キーがクラックされたことはないと思いますが、それは、それを判断するのに使用している暗号と暗号の複雑さに依存します。

これで、誰かがそのアカウントにアクセスできたとしても、その事実は明らかです。おそらく、すでにシステムにアクセスでき、su を使用する権限を与えられた誰かがそれを行ったか、システムを適切にロックダウンしていれば、誰かがルートにアクセスできたことになります。これは、git-server アカウントにアクセスするよりも不可能です。しかし、そうではなく、SSH を使用してリモートでそのアカウントにログインした場合、SSH を使用するすべての人が問題を抱えることになります。つまり、ssh を使用するすべての人のシステムが脆弱になるということです。これで、発生する可能性のある最大の損害は、sudo 権限を持つ通常のアカウントで引き起こすことができる損害と同じ程度です。

答え3

提案に従う必要がある場合に設定する変数がいくつかあります...

_git_user='git-user'
_git_group='git-devs'
_git_home_base="/srv/${_git_group}"
_client_certs_root='/home/admin/client-certs'

...これは、サーバー管理者アカウントの観点から記述されます。


  1. ユーザー「git-server」を作成しました

ひょっとして、ロックしてシステムアカウントにしたのでしょうか?

sudo adduser\
 --system\
 --disabled-password\
 --gecos ''\
 --shell "$(which git-shell)"\
 --home "${_git_home_base,,}/${_git_user,,}"\
 --ingroup "${_git_group}"\
 "${_git_user}"

注意:$(which git-shell)ファイル パスに解決されても--shellオプションによってエラーが発生する場合は...

if [ -e "$(which git-shell)" ] && ! grep -q -- "$(which git-shell)" /etc/shells; then
    sudo tee -a /etc/shells 1>/dev/null <<<"$(which git-shell)"
fi

...ファイルgit-shellへのパスを追加すると役立つ場合があります/etc/shells



  1. インストール済みopenssh-server
  2. 変更された/etc/ssh/sshd_config追加PasswordAuthentication no

無効にしましたかrootSSH 経由のパスワード認証?

/etc/ssh/sshd_config役に立つかもしれない情報...

permitrootlogin without-password


## Additionally consider locking-down other unneeded features
Match Group git-devs
  AllowTcpForwarding no
  AllowStreamLocalForwarding no
  PermitOpen none

  1. .ssh/authorized_keys同僚の公開ケースに追加

公開鍵を正確にどこに追加しましたか?

3 つの Git アカウントを設定するためのコマンドの例を次に示します。

declare -a _accounts_keys=(
    ["name-one"]="${_client_certs_root}/${_git_group}/name-one/ssh.pub"
    ["name-two"]="${_client_certs_root}/${_git_group}/name-two/ssh.pub"
    ["name-three"]="${_client_certs_root}/${_git_group}/name-three/ssh.pub"
)



for _name in "${!_accounts_keys[@]}"; do
    sudo su --login "${_name}" --shell /bin/bash <<EOF
mkdir .ssh
tee -a .ssh/authorized_keys 1>/dev/null <<<"$(<"${_accounts_keys[${_name}]}")"
chmod 600 .ssh/authorized_keys
EOF
done

'git-server' ユーザーは私のシステムにとって安全ですか? 'git-server' が安全であるという事実を前提として、悪意のある人物が 'git-server' にアクセスした場合、システムにとって最悪のシナリオは何ですか?sudoer

いいえ、全員のキーを同じアカウントに追加し、そのアカウントが の場合sudoer悪夢の燃料この状況を打開できる手段はほぼ無限にある...


git コマンド以外のすべての操作を 'git-server' に禁止するにはどうすればよいですか?

git-shell-commands/no-interactive-login各 Git アカウントにスクリプトを追加します...

for _name in "${!_accounts_keys[@]}"; do
    sudo su --login "${_name}" --shell /bin/bash <<EOC
tee 'git-shell-commands/no-interactive-login' 1>/dev/null <<'EOF'
#!/usr/bin/env bash
printf 'Hi %s, you have successfully authenticated!\n' "${USER}"
printf 'However, there is not an interactive shell here.\n'
exit 128
EOF

chmod u+x 'git-shell-commands/no-interactive-login'
EOC
done

... ディレクトリ内に他の実行可能ファイルが存在しない限り、git-shell-commandアカウントは非対話型の git コマンドに制限されます。ただし、アカウントのシェルも正しく設定されていることが条件です。


上記は最も安全ではありませんが、利便性とバランスが取れています。

  • git-devsクロスクローンが不要な場合は、アカウントごとにグループが異なる必要があります。たとえばname-one、プライマリ グループがアカウント間で共有されている場合など、git clone name-two@server:/srv/git-devs/name-two/project-nameサーバー側で構造化されている方法がわかっていれば可能です。

600注意:もし、個々のアカウント内でプロジェクトごとにこれを無効にできる権限があり、660それが共有グループpushpullリポジトリの両方に権限を与える権限であれば...個人的に640は、最高git push -f両方のオプションを使用すると、別のアカウントからの侵入者が混乱を招くことをあまり心配せずに、グループ内でコードを共有できます。

  • git-shell-commands他のスクリプトの例については、git-utilities/git-shell-commandsリポジトリ、上記のヒントはそこから適応されましたが、ヒントより便利に。

要するにしないクライアントが信頼できない場合は、上記のリンクされたスクリプトを追加してください。ポッパシェルなぜなら、そのようなものは、必要対話型シェルではそれほど普及していません。

ボーナスポイント

  • man --pager='less -p "ChrootDirectory"' sshd_configSSHサーバーをさらに安全にするために何ができるかについてのヒントを確認してください。

  • man git-shell関連するドキュメントについては、およびを参照してくださいman git-daemon。ロックダウンやサーバーとの通信を少し簡単にするための便利なオプションがいくつかあります。たとえば、、、および--strict-paths--base-path=<path>--listen=<host_or_ipaddr>さらに調べる価値があるかもしれません。


上記について疑問がある場合は、コメントして回答を改善することを検討してください。

関連情報