安全性:具有 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-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'

...這將從您的伺服器管理員帳戶的角度編寫。


  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

你有禁用嗎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

  1. 加入到.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-shellman git-daemon相關文件;有一些有用的選項可以鎖定事物和/或使伺服器更容易通信,例如。--strict-paths--base-path=<path>--listen=<host_or_ipaddr>可能值得進一步研究


如果對上述內容有疑問,請考慮發表評論,以便改進這個答案。

相關內容