- 我創建了用戶“git-server”
- 已安裝
openssh-server
- 修改
/etc/ssh/sshd_config
新增PasswordAuthentication no
- 加入到
.ssh/authorized_keys
我同事的公開案例中
問題:
- “git-server”用戶對我的系統安全嗎?如果犯罪分子能夠存取“git-server”,那麼系統最糟糕的情況是什麼,假設“git-server”是
sudoer
- 如何禁止「git-server」
git
指令之外的所有操作?
答案1
您應該將使用者 git-server 的預設 shell 變更為 git-shell。
https://git-scm.com/docs/git-shell.html
這是 SSH 帳戶的登入 shell,用於提供受限的 Git 存取。它僅允許執行實作拉/推功能的伺服器端 Git 命令,以及用戶主目錄中名為 git-shell-commands 的子目錄中存在的自訂命令。
答案2
好吧,讓我們看看如何在系統上設定 git-server 帳戶。
修改/etc/ssh/sshd_config 新增PasswordAuthentication no
因為您將密碼身份驗證設為 no,那麼如果沒有有效的 SSH 金鑰,嘗試以該名稱遠端登入系統幾乎是不可能的。據我所知,我不認為 ssh 密鑰已被破解,因為它確實取決於您用來確定這一點的密碼和密碼複雜性。
因此,如果有人設法存取該帳戶,那麼這個事實就不再是問題了。這很可能意味著,已經有權訪問您的系統並被授予使用su 權限的人會這樣做,或者如果您正確鎖定係統,某人會獲得root 的訪問權限,這比獲得root 的訪問權限更不可能git 伺服器帳號。但如果情況並非如此,而且他們確實使用 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
我同事的公開案例中
您到底在哪裡加入了他們的公鑰?
以下是設定三個 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
否,如果您已將每個人的金鑰新增至同一個帳戶,且該帳戶是 a sudoer
,則金額惡夢燃料我可以用近乎無限的方式來消除這種情況...
如何禁止「git-server」除了 git 指令之外的所有操作?
將腳本新增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 命令;前提是帳戶的 shell 也要正確設定。
以上並不是最安全的,但與便利性相平衡;
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
儲存庫,上面的技巧是從中改編而來的,儘管那會提示事情變得更加方便。
簡而言之不如果您無法信任客戶端不嘗試,請添加上面的連結腳本pop-ah-shell因為這些東西的設計目的是為了需要因為互動式 shell 就沒那麼受歡迎。
獎勵積分
查看
man --pager='less -p "ChrootDirectory"' sshd_config
有關如何進一步保護 SSH 伺服器的提示檢查
man git-shell
和man git-daemon
相關文件;有一些有用的選項可以鎖定事物和/或使伺服器更容易通信,例如。--strict-paths
、--base-path=<path>
、--listen=<host_or_ipaddr>
可能值得進一步研究
如果對上述內容有疑問,請考慮發表評論,以便改進這個答案。