我需要构建一个 git 服务器,其中某些用户对存储库具有读写访问权限,并且使用此存储库运行某些脚本的管理服务器对 git 服务器中的同一存储库具有只读访问权限:
设置应尽可能安全。目前,我使用gitolite完成了此操作,其中devices
存储库具有以下配置:
repo devices
RW = eng1
RW = eng2
RW = eng3
R = graphs
用户的SSH 密钥对graphs
存储在mgmt-svr
用户graphs
主目录的服务器中,私钥仅对用户可读和可写graphs
。此私钥不受密码保护。
有没有更安全的方法来实现这一点?我考虑过使用 HTTPS 访问devices
git 服务器中的存储库和基本访问身份验证,但我看不出与当前基于 SSH 的设置相比有任何优势——我仍然需要将访问凭据存储在用户graphs
主目录中的某个位置。
您可以使用
gitlab
CI 的部署密钥功能。此功能也可用于社区版 (ce)。全局共享部署密钥允许在整个 GitLab 安装中的任何存储库上配置只读或读写(如果启用)访问。
这对于将存储库集成到安全、共享的持续集成 (CI) 服务或其他共享服务非常有用。GitLab 管理员可以在 GitLab 中设置 Global Shared Deploy 密钥并将私钥添加到任何共享系统。当项目维护者(或更高级别)授权全局共享部署密钥用于其项目时,各个存储库选择使用这些密钥公开其存储库。
与按项目部署密钥相比,全局共享密钥可以提供更高的安全性,因为目标集成系统的管理员是唯一需要知道和配置私钥的人。
GitLab 管理员在部署密钥部分下的管理区域中设置全局部署密钥。确保密钥具有有意义的标题,因为这将是项目维护人员和所有者识别要添加的正确 Global Deploy 密钥的主要方式。例如,如果密钥授予对 SaaS CI 实例的访问权限,则在密钥名称中使用该服务的名称(如果这就是它的全部用途)。在创建 Global Shared Deploy 密钥时,请考虑密钥的粒度——它们可能具有非常狭窄的用途,例如仅用于特定服务,也可能具有更广泛的用途,例如“您需要授予对存储库的读取访问权限的任何地方”。
GitLab 管理员添加全局部署密钥后,项目维护者和所有者可以通过展开部署密钥部分并单击任何项目可用的公共部署密钥下列出的相应密钥旁边的启用,将其添加到项目的设置 > 存储库页面中。
https://docs.gitlab.com/ee/ssh/#deploy-keys
编辑:
gitea
与gitlab
. 它只有一个没有任何依赖关系的静态单个二进制文件 - 使用 go 编程(当然,您需要添加配置文件和 systemd 服务或类似服务)。该网站对其功能有一个很好的概述: https ://docs.gitea.io/en-us/您的设置听起来很安全。尽管只要有足够的时间,黑客总会找到方法。 ...如果有人黑了你,不要起诉我。 它可能适合小型设置。对于大型企业中的大型团队,这可能不太合适(请参阅下面的“社会工程”)。
关于它有一些优点,也有一些要点供您考虑以使其变得更好。
关于您的设置的积极点
改进的考虑
未加密的密钥
存储未加密的私钥并不完美,尽管这很常见。正如您所说,您必须将它们存储在某个地方。但是,这可能是备份或物理上不安全的服务器的问题。有些选项要求您在重新启动服务器时手动解密您的私钥。其中最简单的可能是ssh 代理,并在您重新启动时手动将您的加密密钥添加到其中。
SSH服务器加固
请记住,Gitolite 在 OpenSSH 服务器下运行。您可以做很多事情来强化 ssh 服务器本身。
您甚至可以考虑在chroot环境下运行 Gitolite。有很多关于如何
chroot
使用 OpenSSH 进行设置的教程。请记住,结果将需要访问这样的程序,python
因此这将使其在技术上比许多教程让您相信的更复杂。社会工程学
每个系统管理员都在寻找黑客可以进入的技术途径,但现实世界中的许多黑客都归结为人。
也许您的解决方案的最弱点是 ssh 密钥的管理。 这在许多企业中被广泛认为是一个安全问题。Gitolite 将所有 SSH 密钥的管理工作交给管理员。这带来了一些重大影响: