Git:通过 ssh 推送到 root 拥有的存储库,并禁用 ssh root 登录

Git:通过 ssh 推送到 root 拥有的存储库,并禁用 ssh root 登录

这可能吗?

摘要,我在服务器上运行 Puppet Master,理想情况下,我们希望禁用通过 ssh 进行 root 登录,如果需要 root 访问权限,我们希望强制通过 sudo 进行所有访问

但是,我们已经安装了 puppet,使用 git repo 来管理清单,这个 repo 目前由 root 拥有,目前我只知道 2 个解决方案

  1. (不太理想)仅允许通过密钥认证进行 root 访问 - 如果是这样,我可以将其锁定为仅允许 git push 命令?
  2. 以不同的所有者身份拥有 /etc/puppet 中的 repo - puppet 能否可靠地与此协同工作?
  3. 相关的 Sudo 配置和命令可以解决这个问题吗?

答案1

Git repos 可以配置为保留组写入权限(--shared创建存储库时的选项)。使用此选项,您可以将任何需要访问存储库的帐户添加到特定组,以便他们可以访问它。

我为我们的 git 服务器做了这件事。我还在每个用户的主目录中放置了一个指向他们有权访问的每个存储库的符号链接,这样每个人都可以使用相对 URL 进行访问。

答案2

为了回答我自己的问题,我查看了 Daniel 提供的信息,但没有找到答案,我研究了 git group write,然后发现了http://andyregan.net/blog/archives/504

通过授予我的存储库组所有权给一个公共组(puppet)并将相关用户添加到该组,然后运行:

chmod -R g+swX /etc/puppet/
cd /etc/puppet
git repo-config core.sharedRepository true

对我来说非常完美,我可以推送到 root 拥有的存储库,puppet 仍然可以工作,而且我不需要使用 root ssh 登录来执行此操作

胜利,胜利

更新

我在使用 puppet 时也再次遇到了这个问题,但我希望找到一种更好的方法来处理它,并通过在 env_reset 行后添加以下内容,使用正确的 sudoers 配置来解决这个问题:

Defaults    env_keep += SSH_AUTH_SOCK

这使我能够运行如下命令:

cd /etc/puppet && sudo git pull && sudo git submodule sync && sudo git submodule update --init --recursive

比如说,在 Rakefile 中(我的用户已经通过 Sudo 获得了 nopasswd 权限),一切都按计划进行。我所做的基本上就是将我的 ssh-agent 转发的 ssh 密钥传递给 root 用户,然后执行 git pull,就好像我以非 root 用户身份连接一样,而无需将我的 ssh 密钥存储在 root 用户(或服务器上的非特权帐户)下。双赢

答案3

我喜欢在 Puppet Master 上安装一个“暂存”裸 git 仓库,然后将其推送到该仓库,运行各种提交前和提交后挂钩。提交前挂钩检查 Puppet 语法(这样语法错误的代码就无法提交),提交后挂钩实际上将代码放入 /etc/puppet,然后重新启动 Apache(以修复 Puppet 2.6 中的一个旧缓存错误)

拥有一个可以推送到的暂存区,可以让部署 puppet 代码的过程更加原子化。否则,你的 puppetmaster 可能会向客户端提供半提交的代码。

相关内容