如何从 gitolite 安全地管理 etckeeper?

如何从 gitolite 安全地管理 etckeeper?

我想通过将等推送到 gitolite 来维护我的 Debian 服务器。

问题是 gitolite 不应该以 root 身份运行,也不应该作为可以从外部对系统进行 shell 访问的用户运行。但是,我需要 gitolite 与挂钩和触发器中的 etckeeper 进行交互(例如,确保在外部用户进行任何 git 操作之前,确保对工作树的所有挂起更改都已提交并推送到裸 gitolite 存储库中),而需要 root 访问权限。

我想知道什么是安全、简约、优雅解决这个问题的方法。

显然有很多解决方案是可能的,但我不太擅长 Linux 系统管理,所以我寻求一些灵感。我考虑过的可能的解决方案:

  • 有两个不同的用户和一些消息系统(生产者/消费者或守护进程),gitolite 留下一个任务由 root 用户执行。 (与 git hook 的奢侈相比,看起来非常复杂,git hook 是一个可以执行任何命令的 shell 脚本,特别是因为我需要等待退出代码)

  • 使用setuid?似乎是为这项任务而设计的,但是仔细阅读它,它似乎很危险,并且不太支持 shell 脚本......

有人能指出我正确的方向吗?

更新:我最终自己找到了这个问题的一些答案,所以在下面发布了答案。欢迎任何其他解决方案/考虑因素......

答案1

我发现这个指南的标题是:gitolite 和 etckeeper但它未经我测试。

摘抄

为了跟踪我的许多 Linux 机器上的更改,我安装了 etckeeper,它跟踪 /etc 的所有更改。它带有一个很好的 apt 挂钩,可以在安装软件包时自动提交。

除了将更改保留在 git 存储库中之外,我还开始推送到由 gitolite 管理的中央存储库。我按照以下步骤设置了 etckeeper:

作为根在/etc

  $ git config –global user.email [email protected]
  $ git config –global user.name “Configuration Admin”
  $ git remote add origin [email protected]:machineconf

将 git 密钥放入/root/.ssh.

作为根用户:

  $ cd /etc/etckeeper/commit.d
  $ (echo ‘#!/bin/sh’ ; echo ‘git push origin’) > 99git-push
  $ chmod +x 99git-push
  $ git add .
  $ git commit -m “automatically push commits to backup repository”

答案2

好吧,满月即将来临,我睡眠不足的大脑开始以超速的创造力旋转。我想我已经解决了这个问题。

在此过程中,我发现了第二个主要安全问题,并将讨论它们。

问题

  • gitolite 必须能够将更改拉入 /etc/.git 并签出它们。因此它必须具有权限,但由于它是一个接受外部 ssh 连接的软件帐户,因此存在安全风险。

  • 第二个问题是,通过让 /etc 在 gitolite 的眼皮子底下通过,我们让它有可能读取和更改它不应该读取和更改的文件。 Gitolite 应该只是一个对两端透明的传输协议。一个不受信任的中间人,幸运的是,这是信息安全中经过充分研究的模式。

解决方案

为了允许 gitolite 使用权限执行一些有限的操作,实际上可以将其用户添加到 sudoers 文件中,并允许它仅以 root 身份运行必须运行的脚本。 sudoers 允许您向规则添加哈希,以避免仅基于文件名进行验证:

etcgit ALL=(root) NOPASSWD: sha224:0GomF8mNN3wlDt1HD9XldjJ3SNgpFdbjO1+NsQ== /etc/gitolitetc/scripts/xxx.sh

这允许用户 etcgit 只做一件事,并且这件事可以防止哈希值被篡改。

现在针对 gitolite 读取和更改 /etc 的问题,一些解决方案到过建议的用于透明地加密 git 端到端。如果它们被证明是可行的,那么所有问题都会立即解决。

如果它们不可行,您仍然可以从 git 存储库中省略某些文件,以避免 gitolite 读取它们,并且您可以编写一个 git 挂钩,该挂钩只会提取由开发人员签名的提交,这意味着您的私有文件需要 pgp 密钥才能让 /etc/.git 接受更改。迈克·格维茨有在他的博客上很好地展示了这一点包括检查签名的脚本以及全面的理论分析。

由于一些深奥的其他选项尚未进行可行性检查,因此可以将 gitolite 应该控制的裸存储库保留在 root 所有权下,并使用 sudoers 来允许 gitolite 仅执行最少的必要命令来完成传递提交的工作,并且向前,而实际上无法读取存储库的内容。我怀疑这是否可能,但如果是的话,它具有加密存储库的所有优点,并且没有任何缺点。

好吧,我觉得当我最终完成服务器的配置时,这将是我当时全新的编程博客上第一篇博客文章的材料。

相关内容