Git提交审计

yan*_*isf 16 security audit git

我有一个通过 ssh 运行的 git 服务器,每个用户在系统上都有一个 unix 帐户。

鉴于两个用户有权访问一个 repo,我如何确定哪个用户执行了哪个提交,因为提交用户名和电子邮件是由 git 客户端提交和控制的。

我担心用户可能会尝试冒充另一个用户,即使他们拥有相同的授权权限。

小智 13

如果您对此很担心,有几种方法可以解决这个问题。

  1. 让您的用户签署您的提交,支持 GPG 签名。
  2. 不要授予用户提交到主存储库的权利,让他们提交到他们自己的子存储库,然后让受信任的用户将更改带入主存储库。这就是为什么如果您查看某些 git 项目(例如 git 本身)的日志消息,您会看到它们是“作者”(创建更改的人)的单独字段。和“提交者” - 将更改提交到存储库的人。


Sco*_*ack 9

我看到了两种获取此类信息的好方法。一种是通过 sshd 本身增加日志记录,另一种是通过对磁盘上的 git 存储库进行更深入的监视。由于没有一个单独为您提供您想要的信息,您可能希望同时使用外部日志分析引擎或使用人眼和时间戳按需关联日志数据。

sshd 修改

默认情况下,正如您所看到的,您可以使用 ssh 身份验证日志查看用户何时登录以及从何处登录。您想要做的是在退出 sshd 时更改级别。所以编辑你的/etc/ssh/sshd_config并找到看起来像的行

#LogLevel INFO
Run Code Online (Sandbox Code Playgroud)

并将其更改为

LogLevel VERBOSE
Run Code Online (Sandbox Code Playgroud)

然后重启sshd服务。这会将 sshd 的日志记录级别提高 1 步,从而提供更多信息。进行更改后,请查看我的远程访问的此日志片段。

Nov  2 08:37:09 node1 sshd[4859]: Connection from 10.10.10.5 port 50445
Nov  2 08:37:10 node1 sshd[4859]: Found matching RSA key: f2:9e:a1:ca:0c:33:02:37:9b:de:e7:63:d5:f4:25:06
Nov  2 08:37:10 node1 sshd[4860]: Postponed publickey for scott from 10.10.10.5 port 50445 ssh2
Nov  2 08:37:10 node1 sshd[4859]: Found matching RSA key: f2:9e:a1:ca:0c:33:02:37:9b:de:e7:63:d5:f4:25:06
Nov  2 08:37:10 node1 sshd[4859]: Accepted publickey for scott from 10.10.10.5 port 50445 ssh2
Nov  2 08:37:10 node1 sshd[4859]: pam_unix(sshd:session): session opened for user scott by (uid=0)
Nov  2 08:37:10 node1 sshd[4859]: User child is on pid 4862
Nov  2 08:40:27 node1 sshd[4862]: Connection closed by 10.10.10.5
Nov  2 08:40:27 node1 sshd[4862]: Transferred: sent 30632, received 7024 bytes
Nov  2 08:40:27 node1 sshd[4862]: Closing connection to 10.10.10.5 port 50445
Nov  2 08:40:27 node1 sshd[4859]: pam_unix(sshd:session): session closed for user scott 
Run Code Online (Sandbox Code Playgroud)

这里要注意的重要事项有两个

  1. 我们看到用于验证我的公钥的指纹
  2. 我们看到我注销的时间戳

使用默认的 LogLevel (INFO) sshd 不会记录这些项目。获取钥匙的指纹是一个额外的步骤。您必须authorized_keys像这样使用 ssh-keygen处理适当的文件。

[root@node1 ssh]# ssh-keygen -l -f /home/scott/.ssh/authorized_keys
4096 f2:9e:a1:ca:0c:33:02:37:9b:de:e7:63:d5:f4:25:06 /home/scott/.ssh/authorized_keys (RSA)
Run Code Online (Sandbox Code Playgroud)

所以现在您知道以下信息:

  1. 登录的用户名
  2. 用户登录时间
  3. 哪个公钥用于身份验证
  4. 用户注销的时间

现在我们有一种方法可以在特定时间归因于用户的操作,假设两个用户没有同时登录,我们可以开始查看对存储库所做的更改。

使用 Auditd 进行目录监控

正如 sysadmin1138 所说,这可能是 auditd 子系统的绝佳用例。如果您没有使用基于 RedHat 的发行版,那么可能有一个类似版本,但您必须找到它。auditd 的配置非常密集,并且有大量的配置选项。要了解一些选项,请在我们的信息安全专业人员姊妹网站上查看此问题

至少,我建议在包含相关 git 存储库的磁盘目录上设置所谓的“监视”。它的作用是指示内核模块报告对指向我们列出的文件或目录的文件句柄执行文件访问调用的尝试,例如open()creat()

这是一个可以执行此操作的示例配置,并且仅此而已。因此,请仔细阅读并理解您的现有内容/etc/audit/audit.rules,以便适当地集成更改。

# This file contains the auditctl rules that are loaded
# whenever the audit daemon is started via the initscripts.
# The rules are simply the parameters that would be passed
# to auditctl.

# First rule - delete all
-D

# Increase the buffers to survive stress events.
# Make this bigger for busy systems
-b 1024

-w /path/to/git/repos-p wa

# Disable adding any additional rules - note that adding *new* rules will require a reboot
-e 2
Run Code Online (Sandbox Code Playgroud)

  • 好吧,你确实在系统管理网站上问过,我是一名取证检查员...... :) (2认同)

小智 5

您可以采用的唯一技术方法是信任 ssh 连接的身份。然后,您可以强制每个用户仅通过验证每个新推送提交的提交者来推送他所做的提交。

为了保证这一点,您几乎肯定不想让您的用户不受限制地访问存储库所在的框;你会想要确保使用类似的东西,git-shell否则这些限制很容易解决。

不过,用户仍然可以互相冒充作者。您也可以限制这一点,但这会丢失常见的工作流程,例如挑选和重新定位甚至可能分支(取决于您的钩子实现),因此您可能不想这样做。

在某些时候,在某种程度上,您需要信任您的开发人员。