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

因为您将密码验证设置为否,所以如果没有有效的 SSH 密钥,尝试以该名称远程登录系统几乎是不可能的。据我所知,我认为 ssh 密钥还没有被破解,这取决于您使用的密码和密码复杂性。

所以现在事实已经摆在眼前,如果有人设法访问该帐户。这很可能意味着,已经有权访问您的系统并被授予使用 su 权限的人会这样做,或者如果您正确锁定了系统,有人会以某种方式获得 root 访问权限,这比获得 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

您是否已禁用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

不,如果你把所有人的钥匙都添加到同一个账户,而这个账户是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存储库,上面的提示改编自此处,尽管这可能提示事情变得更加方便。

简而言之如果你不能相信客户端不会尝试,请添加上面链接的脚本弹出啊壳因为这些东西的设计是为了需要对于交互式 shell 来说并不那么普遍。

奖励积分

  • 查看man --pager='less -p "ChrootDirectory"' sshd_config有关如何进一步保护 SSH 服务器的提示

  • 检查man git-shellman git-daemon相关文档;有一些有用的选项可以锁定东西和/或使服务器更容易通信,例如,,--strict-paths可能--base-path=<path>值得--listen=<host_or_ipaddr>进一步研究


如果对以上内容有疑问,请考虑发表评论,以便改进这个答案。

相关内容