发现运行命令 X 的具有 root 权限的 sudoer 用户?

use*_*633 7 security logs sudo audit

我是一个系统的主要系统管理员。系统中有3个具有root权限的sudoers用户。

系统在后台运行一个脚本,该脚本检查系统实用程序的哈希值以检测可能的恶意更改。今天我收到警报,该ssh实用程序的哈希值已更改。

直到现在还没有任何更新,我认为其中一个 sudoers 对此负责。是否可以检测哪个 sudoer 更改了ssh实用程序?

Bra*_*ley 6

我将在考虑 RHEL 的情况下写一个答案,但要知道,如果您使用的是 SuSE 或基于 Debian 的发行版,那么我所描述的将会有类似物。

首先,如果您只想验证它是系统更新而不是有人试图对机器进行 rootkit,您可以openssh-clients像这样“验证”包:

[root@hypervisor scsd]# rpm -V openssh-clients
[root@hypervisor scsd]#
[root@hypervisor scsd]# rpm -V openssh-server
S.5....T.  c /etc/pam.d/sshd
S.5....T.  c /etc/ssh/sshd_config
[root@hypervisor scsd]#
Run Code Online (Sandbox Code Playgroud)

我也openssh-server这样做了,这样你就可以看到发生变化时的样子。重要的部分是“5”,它告诉我们文件的 md5sum 与 RPM 数据库中存在的不同。如果检查出来,则可能是由于系统更新。

如果他们使用 yum(很有可能),将会更新该 RPM 的 /var/log/yum.log 条目。这对于获取更新发生的具体时间以供以后使用yum history.

如果他们rpm直接使用,您可以做一些queryformat魔术或rpm -q openssh-clients --last获取它发生的日期(尽管听起来您已经知道那一点信息)

有一个yum子命令叫做history记录调用用户的 auid/loginuid:

[root@hypervisor scsd]# yum history
Loaded plugins: product-id, refresh-packagekit, rhnplugin, security, subscription-manager
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
This system is receiving updates from RHN Classic or RHN Satellite.
ID     | Login user               | Date and time    | Action(s)      | Altered
-------------------------------------------------------------------------------
    54 |  <jadavis6>              | 2013-07-15 09:03 | Install        |    2
    53 |  <jadavis6>              | 2013-07-09 17:25 | Update         |   23
    52 |  <jadavis6>              | 2013-06-24 10:10 | Install        |    3  <
    51 |  <jadavis6>              | 2013-06-14 22:33 | Install        |    1 >
    50 |  <jadavis6>              | 2013-06-14 07:47 | E, I, U        |   90
    49 | root <root>              | 2013-06-14 00:58 | Update         |    1
    48 |  <jadavis6>              | 2013-06-03 08:28 | Install        |    3
    47 |  <jadavis6>              | 2013-05-28 11:57 | Install        |    3  <
    46 |  <jadavis6>              | 2013-05-20 18:25 | Install        |    1 >
    45 |  <jadavis6>              | 2013-05-20 12:00 | Install        |    1
    44 |  <jadavis6>              | 2013-05-19 15:29 | Install        |    6
    43 |  <jadavis6>              | 2013-05-18 20:16 | Install        |    3
    42 |  <jadavis6>              | 2013-05-16 16:21 | Install        |    2  <
    41 |  <jadavis6>              | 2013-05-16 12:48 | Install        |    1 >
    40 |  <jadavis6>              | 2013-05-10 09:28 | Install        |    1
    39 |  <jadavis6>              | 2013-05-10 09:28 | Install        |    1
    38 |  <jadavis6>              | 2013-04-29 19:45 | Install        |    2  <
    37 |  <jadavis6>              | 2013-04-29 18:51 | Install        |    8 >
    36 |  <jadavis6>              | 2013-04-29 18:35 | Update         |   11
    35 |  <jadavis6>              | 2013-04-27 15:44 | E, I, O, U     |  429 EE
history list
[root@hypervisor scsd]#
Run Code Online (Sandbox Code Playgroud)

loginuid 是不可伪造的,因为作为 init 的子代,它们以 -1(负值)的 loginuid 开始。当您通过 tty 或sshdpam_loginuid(还有其他模块也这样做)登录时,将其设置为经过身份验证的用户的 UID。一旦设置为-1root以外的其他值就无法更改此值(尽管仅在较新的内核中),因为它是非功能性的/仅用于会计的,并且需要考虑到攻击者可能已经获得了 root 权限。所有子级都继承父级的 loginuid,因此即使sudo生成一个 EUID 为零(或任何用户)的程序,您仍将拥有相同的 loginuid。

您可以通过执行您的 sudo 份额并在cat /proc/self/loginuid每次您最初登录的用户时执行此操作来测试这一点,无论您此后进行了多少次susudo调用。尽管我以 root 用户身份完成了所有操作,但上面是yum history这样知道jadavis6yum update

如果两个 yum 事务之间存在一些歧义,yum history info <transID>如果我想了解有关最后一个事务的更多信息,您可以这样做:

[root@hypervisor scsd]# yum history info 35
Loaded plugins: product-id, refresh-packagekit, rhnplugin, security,
              : subscription-manager
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
This system is receiving updates from RHN Classic or RHN Satellite.
Transaction ID : 35
Begin time     : Sat Apr 27 15:44:57 2013
Begin rpmdb    : 959:3d300ae2e8dc239f9f972306ba2406bd22ba29bc
End time       :            15:50:39 2013 (5 minutes)
End rpmdb      : 972:381cb76592ea2f779ee4521a4e7221196520486a
User           :  <jadavis6>
Return-Code    : Success
Command Line   : update -y
Transaction performed with:
    Updated       rpm-4.8.0-27.el6.x86_64                       @anaconda-RedHatEnterpriseLinux-201206132210.x86_64/6.3
    Updated       subscription-manager-0.99.19.4-1.el6_3.x86_64 @rhel-x86_64-server-6
    Updated       yum-3.2.29-30.el6.noarch                      @anaconda-RedHatEnterpriseLinux-201206132210.x86_64/6.3
    Installed     yum-metadata-parser-1.1.2-16.el6.x86_64       @anaconda-RedHatEnterpriseLinux-201206132210.x86_64/6.3
Packages Altered:
    Updated     NetworkManager-glib-1:0.8.1-34.el6_3.x86_64                    @rhel-x86_64-server-6
    Update                          1:0.8.1-43.el6.x86_64                      @rhel-x86_64-server-6
    Updated     PackageKit-0.5.8-20.el6.x86_64                                 @rhel-x86_64-server-6
    Update                 0.5.8-21.el6.x86_64                                 @rhel-x86_64-server-6
    Updated     PackageKit-device-rebind-0.5.8-20.el6.x86_64                   @rhel-x86_64-server-6

[...snip...]

    Updated     yum-3.2.29-30.el6.noarch                                       @anaconda-RedHatEnterpriseLinux-201206132210.x86_64/6.3
    Update          3.2.29-40.el6.noarch                                       @rhel-x86_64-server-6
    Updated     yum-rhn-plugin-0.9.1-40.el6.noarch                             @anaconda-RedHatEnterpriseLinux-201206132210.x86_64/6.3
    Update                     0.9.1-43.el6.noarch                             @rhel-x86_64-server-6
Scriptlet output:
   1 warning: /etc/shadow created as /etc/shadow.rpmnew
   2 No input from event server.
   3 warning: %postun(wdaemon-0.17-2.el6.x86_64) scriptlet failed, exit status 1
history info
Run Code Online (Sandbox Code Playgroud)

我截断了它,因为它看起来像是一个相当冗长的系统更新。

AFAIK 如果他们通过rpm直接在配置之外进行更新auditd以监控对 RPM 数据库文件的更改,则无法对其进行追溯。这样做ausearch可以让您看到进行更改的 PID 列表和关联的 loginuid(将显示为auid)。

如果他们在 RPM 之外直接更改它,那么在进行更改之前,您必须监视要监视的每个文件的更改。事实上,您无能为力,但您可能会考虑做一些事情auditd来监视您认为是 rootkit 目标的文件。做得太多会使系统陷入困境。还值得一提的是,您应该将这些日志发送到服务器之外的某个地方,以防止恶意篡改。

希望有帮助。

编辑:

需要注意的一件事是,如果有的话,root 似乎可以更改 loginuid CAP_SYS_AUDITCONTROL(如果 loginuid 当前为,则不需要-1),但您应该能够从系统的边界集中删除该功能,这将要求攻击者重新启动系统以获得这种能力,这是一个嘈杂的地狱操作,会在各处留下可审计的事件,因此他们不太可能这样做。


Yuu*_*ian 1

你检查了吗syslog?根据man sudo: sudo 可以将成功和不成功的尝试(以及错误)记录到 syslog(3)、日志文件或两者。默认情况下,sudo 将通过 syslog(3) 进行记录,但这可以在配置时或通过 sudoers 文件进行更改。

我认为,除非他们故意删除日志文件,否则您应该能够在那里获取信息。要缩小时间范围,您可以检查 SSH 实用程序上的修改日期戳。