- ユーザー「git-server」を作成しました
- インストール済み
openssh-server
- 変更された
/etc/ssh/sshd_config
追加PasswordAuthentication no
.ssh/authorized_keys
同僚の公開ケースに追加
質問:
- 'git-server' ユーザーは私のシステムにとって安全ですか? 'git-server' が安全であるという事実を前提として、悪意のある人物が 'git-server' にアクセスした場合、システムにとって最悪のシナリオは何ですか?
sudoer
git
コマンド 以外のすべての操作を 'git-server' に禁止するにはどうすればよいですか?
答え1
ユーザー git-server のデフォルト シェルを 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'
...これは、サーバー管理者アカウントの観点から記述されます。
- ユーザー「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
- インストール済み
openssh-server
- 変更された
/etc/ssh/sshd_config
追加PasswordAuthentication no
無効にしましたかroot
SSH 経由のパスワード認証?
/etc/ssh/sshd_config
役に立つかもしれない情報...
permitrootlogin without-password
## Additionally consider locking-down other unneeded features
Match Group git-devs
AllowTcpForwarding no
AllowStreamLocalForwarding no
PermitOpen none
.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
それが共有グループpush
とpull
リポジトリの両方に権限を与える権限であれば...個人的に640
は、最高git push -f
両方のオプションを使用すると、別のアカウントからの侵入者が混乱を招くことをあまり心配せずに、グループ内でコードを共有できます。
git-shell-commands
他のスクリプトの例については、git-utilities/git-shell-commands
リポジトリ、上記のヒントはそこから適応されましたが、ヒントより便利に。
要するにしないクライアントが信頼できない場合は、上記のリンクされたスクリプトを追加してください。ポッパシェルなぜなら、そのようなものは、必要対話型シェルではそれほど普及していません。
ボーナスポイント
man --pager='less -p "ChrootDirectory"' sshd_config
SSHサーバーをさらに安全にするために何ができるかについてのヒントを確認してください。man git-shell
関連するドキュメントについては、およびを参照してくださいman git-daemon
。ロックダウンやサーバーとの通信を少し簡単にするための便利なオプションがいくつかあります。たとえば、、、および--strict-paths
は--base-path=<path>
、--listen=<host_or_ipaddr>
さらに調べる価値があるかもしれません。
上記について疑問がある場合は、コメントして回答を改善することを検討してください。