记录管理员在生产服务器上运行的所有命令

Sov*_*ero 80 bash logging centos sudo

管理员通过个人用户名登录服务器,然后运行sudo -i成为 root ,这是公司的政策。运行时sudo -i,sudo 将创建一个名为 的环境变量SUDO_USER,其中包含原始用户的用户名。

有没有办法使用类似于以下语法的内容在 syslog 中记录所有命令:

${TIME/DATE STAMP}: [${REAL_USER}|${SUDO_USER}]: ${CMD}
Run Code Online (Sandbox Code Playgroud)

一个示例条目是:

Sat Jan 19 22:28:46 CST 2013: [root|ksoviero]: yum install random-pkg
Run Code Online (Sandbox Code Playgroud)

显然它不必完全是上述语法,它只需要包含最少的真实用户(例如 root)、sudo 用户(例如 ksoviero)和运行的完整命令(例如 yum安装随机包)。

我已经试过了snoopy,但它不包括SUDO_USER变量。

fue*_*ero 100

更新:评论和后续问题中还出现了另外 2 件事:

  • 使用auditd这种方式将大大增加您的日志量,尤其是当系统通过命令行大量使用时。调整您的日志保留策略。
  • Auditd创建它们的主机上的日志与同一台机器上的其他文件一样安全。将您的日志转发到远程日志收集服务器,如 ELK 或 Graylog,以保持日志的完整性。另外,除了上面的一点之外,它还允许更积极地删除旧日志。

正如迈克尔汉普顿所建议的那样,auditd是这里工作的正确工具。

我在 Ubuntu 12.10 安装上对此进行了测试,因此您的里程在其他系统上可能会有所不同。

  • 安装auditd

    apt-get install auditd

  • 将这两行添加到/etc/audit/audit.rules

    -a 退出,总是 -F arch=b64 -F euid=0 -S execve
    -a 退出,总是 -F arch=b32 -F euid=0 -S execve

这些将跟踪由 root ( euid=0)运行的所有命令。为什么有两条规则?的execve系统调用必须在32位和64位代码进行跟踪。

  • 要删除auid=4294967295日志中的消息,请添加audit=1到内核​​的 cmdline(通过编辑/etc/default/grub

  • 放置线

    session required pam_loginuid.so

在与登录 ( /etc/pam.d/{login,kdm,sshd})相关的所有 PAM 配置文件中,但不在与su或相关的文件中sudo。这将允许在调用或时正确auditd获取调用用户的信息。uidsudosu

  • 现在重新启动您的系统。

  • 让我们登录并运行一些命令:

    $ id -u
    1000
    $ sudo ls /
    bin boot data dev etc home initrd.img initrd.img.old lib lib32 lib64 lost+found media mnt opt proc root run sbin scratch selinux srv sys tmp usr var vmlinuz vmlinuz.old
    $ sudo su -
    #ls /etc
    [...]

这将产生如下内容/var/log/audit/auditd.log

----
time->Mon Feb  4 09:57:06 2013
type=PATH msg=audit(1359968226.239:576): item=1 name=(null) inode=668682 dev=08:01 mode=0100755 ouid=0 ogid=0 rdev=00:00
type=PATH msg=audit(1359968226.239:576): item=0 name="/bin/ls" inode=2117 dev=08:01 mode=0100755 ouid=0 ogid=0 rdev=00:00
type=CWD msg=audit(1359968226.239:576):  cwd="/home/user"
type=EXECVE msg=audit(1359968226.239:576): argc=2 a0="ls" a1="/"
type=SYSCALL msg=audit(1359968226.239:576): arch=c000003e syscall=59 success=yes exit=0 a0=10cfc48 a1=10d07c8 a2=10d5750 a3=7fff2eb2d1f0 items=2 ppid=26569 pid=26570 auid=1000 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=1 comm="ls" exe="/bin/ls" key=(null)
----
time->Mon Feb  4 09:57:06 2013
type=PATH msg=audit(1359968226.231:575): item=1 name=(null) inode=668682 dev=08:01 mode=0100755 ouid=0 ogid=0 rdev=00:00
type=PATH msg=audit(1359968226.231:575): item=0 name="/usr/bin/sudo" inode=530900 dev=08:01 mode=0104755 ouid=0 ogid=0 rdev=00:00
type=CWD msg=audit(1359968226.231:575):  cwd="/home/user"
type=BPRM_FCAPS msg=audit(1359968226.231:575): fver=0 fp=0000000000000000 fi=0000000000000000 fe=0 old_pp=0000000000000000 old_pi=0000000000000000 old_pe=0000000000000000 new_pp=ffffffffffffffff new_pi=0000000000000000 new_pe=ffffffffffffffff
type=EXECVE msg=audit(1359968226.231:575): argc=3 a0="sudo" a1="ls" a2="/"
type=SYSCALL msg=audit(1359968226.231:575): arch=c000003e syscall=59 success=yes exit=0 a0=7fff327ecab0 a1=7fd330e1b958 a2=17cc8d0 a3=7fff327ec670 items=2 ppid=3933 pid=26569 auid=1000 uid=1000 gid=1000 euid=0 suid=0 fsuid=0 egid=1000 sgid=1000 fsgid=1000 tty=pts0 ses=1 comm="sudo" exe="/usr/bin/sudo" key=(null)
----
time->Mon Feb  4 09:57:09 2013
type=PATH msg=audit(1359968229.523:578): item=1 name=(null) inode=668682 dev=08:01 mode=0100755 ouid=0 ogid=0 rdev=00:00
type=PATH msg=audit(1359968229.523:578): item=0 name="/bin/su" inode=44 dev=08:01 mode=0104755 ouid=0 ogid=0 rdev=00:00
type=CWD msg=audit(1359968229.523:578):  cwd="/home/user"
type=EXECVE msg=audit(1359968229.523:578): argc=2 a0="su" a1="-"
type=SYSCALL msg=audit(1359968229.523:578): arch=c000003e syscall=59 success=yes exit=0 a0=1ceec48 a1=1cef7c8 a2=1cf4750 a3=7fff083bd920 items=2 ppid=26611 pid=26612 auid=1000 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=1 comm="su" exe="/bin/su" key=(null)
----
time->Mon Feb  4 09:57:09 2013
type=PATH msg=audit(1359968229.519:577): item=1 name=(null) inode=668682 dev=08:01 mode=0100755 ouid=0 ogid=0 rdev=00:00
type=PATH msg=audit(1359968229.519:577): item=0 name="/usr/bin/sudo" inode=530900 dev=08:01 mode=0104755 ouid=0 ogid=0 rdev=00:00
type=CWD msg=audit(1359968229.519:577):  cwd="/home/user"
type=BPRM_FCAPS msg=audit(1359968229.519:577): fver=0 fp=0000000000000000 fi=0000000000000000 fe=0 old_pp=0000000000000000 old_pi=0000000000000000 old_pe=0000000000000000 new_pp=ffffffffffffffff new_pi=0000000000000000 new_pe=ffffffffffffffff
type=EXECVE msg=audit(1359968229.519:577): argc=3 a0="sudo" a1="su" a2="-"
type=SYSCALL msg=audit(1359968229.519:577): arch=c000003e syscall=59 success=yes exit=0 a0=7fff327ecab0 a1=7fd330e1b958 a2=17cc8d0 a3=7fff327ec670 items=2 ppid=3933 pid=26611 auid=1000 uid=1000 gid=1000 euid=0 suid=0 fsuid=0 egid=1000 sgid=1000 fsgid=1000 tty=pts0 ses=1 comm="sudo" exe="/usr/bin/sudo" key=(null)
----
time->Mon Feb  4 09:57:09 2013
type=PATH msg=audit(1359968229.543:585): item=1 name=(null) inode=668682 dev=08:01 mode=0100755 ouid=0 ogid=0 rdev=00:00
type=PATH msg=audit(1359968229.543:585): item=0 name="/bin/bash" inode=6941 dev=08:01 mode=0100755 ouid=0 ogid=0 rdev=00:00
type=CWD msg=audit(1359968229.543:585):  cwd="/root"
type=EXECVE msg=audit(1359968229.543:585): argc=1 a0="-su"
type=SYSCALL msg=audit(1359968229.543:585): arch=c000003e syscall=59 success=yes exit=0 a0=13695a0 a1=7fffce08a3e0 a2=135a030 a3=7fffce08c200 items=2 ppid=26612 pid=26622 auid=1000 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=1 comm="bash" exe="/bin/bash" key=(null)
----
time->Mon Feb  4 09:57:11 2013
type=PATH msg=audit(1359968231.663:594): item=1 name=(null) inode=668682 dev=08:01 mode=0100755 ouid=0 ogid=0 rdev=00:00
type=PATH msg=audit(1359968231.663:594): item=0 name="/bin/ls" inode=2117 dev=08:01 mode=0100755 ouid=0 ogid=0 rdev=00:00
type=CWD msg=audit(1359968231.663:594):  cwd="/root"
type=EXECVE msg=audit(1359968231.663:594): argc=3 a0="ls" a1="--color=auto" a2="/etc"
type=SYSCALL msg=audit(1359968231.663:594): arch=c000003e syscall=59 success=yes exit=0 a0=7fff8c709950 a1=7f91a12149d8 a2=1194c50 a3=7fff8c709510 items=2 ppid=26622 pid=26661 auid=1000 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=1 comm="ls" exe="/bin/ls" key=(null)
Run Code Online (Sandbox Code Playgroud)

auid列包含调用用户的uid,它允许您过滤此用户运行的命令

 ausearch -ua 1000
Run Code Online (Sandbox Code Playgroud)

这甚至会列出用户以 root 身份运行的命令。

资料来源:


mdp*_*dpc 11

请记住,sudo 本身会将所有 sudo 命令记录在 syslog 中,因此应该教育所有 priv'd 用户不仅仅是 sudo 来获取 root shell,而是:

sudo command p1 p2 ... pn
Run Code Online (Sandbox Code Playgroud)

这种或我想到的任何方法的问题在于,作为root用户,很难阻止用户逃避任何特定类型的日志记录。因此,您尝试的任何事情都将 < 100% 我很抱歉地说。

教育、文件、执法和最重要的信任是必要的。

  • 不是真的....至少有两家我个人合作过的非常大的公司由大量系统管理员组成,有这个政策!同样,通过教育和执法,它是有效的。 (4认同)
  • -1 教育永远不会这样做。我们生活在外包世界中,您只是系统管理员众多客户中的一员。 (4认同)
  • 我知道没有什么是完美的,但我们永远无法让每个人都像您描述的那样工作。这些是我们正在谈论的系统管理员;) (3认同)
  • mdpc 是 100% 正确的。这正是 sudo 命令的用途。我在一个拥有数百台主机的十个系统管理员的商店里,我们对所有事情都使用单独的 sudo 命令 - 有一个特定的策略禁止通过 su - 成为 root。这是确保正确审核管理员操作的唯一合理方法。 (3认同)

Dan*_* t. 7

我曾经遇到过同样的问题,不得不想出一个快速而肮脏的解决方案 - 每个 sudo 用户在运行命令后都会有自己的历史文件 sudo -i

/root/.bashrc我添加了以下行 -

 export HISTFILE=/root/.bash_history-$SUDO_USER
 export HISTTIMEFORMAT="%F %T "
Run Code Online (Sandbox Code Playgroud)

所以每个 sudos 到 root 的用户都会有一个历史文件 .bash_history-username。

另一种方法——

添加以下代码/root/.bashrc,它会将用户名、sudo-user 和命令附加到日志文件中,无论在哪里设置通知级别,最有可能是 /var/log/messages。

function log2syslog
{
   declare COMMAND
   COMMAND=$(fc -ln -0)
   logger -p local1.notice -t bash -i -- "${USER}:${SUDO_USER}:${COMMAND}"
}
trap log2syslog DEBUG
Run Code Online (Sandbox Code Playgroud)

归功于 - http://backdrift.org/logging-bash-history-to-syslog-using-traps

  • 对于合法用户来说,这是有效的。但是,如果该帐户被破解,破解者可以通过运行 `/bin/sh`、`unset HISTFILE` 或 `/bin/bash --norc` 来快速禁用 bash 历史记录。 (3认同)