AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 470755
Accepted
Soviero
Soviero
Asked: 2013-01-20 20:35:22 +0800 CST2013-01-20 20:35:22 +0800 CST 2013-01-20 20:35:22 +0800 CST

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

  • 772

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

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

${TIME/DATE STAMP}: [${REAL_USER}|${SUDO_USER}]: ${CMD}

一个示例条目是:

Sat Jan 19 22:28:46 CST 2013: [root|ksoviero]: yum install random-pkg

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

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

centos logging bash sudo
  • 7 7 个回答
  • 112639 Views

7 个回答

  • Voted
  1. Best Answer
    fuero
    2013-02-05T01:16:39+08:002013-02-05T01:16:39+08:00

    更新:在评论和后续问题中又出现了 2 件事:

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

    正如 Michael Hampton 所建议的那样,auditd是完成此处工作的正确工具。

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

    • 安装auditd:

      apt-get install auditd

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

      -a exit,always -F arch=b64 -F euid=0 -S execve
      -a exit,always -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

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

    • 立即重新启动系统。

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

        $ id -u
        1000
        $须藤/
        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
        $须藤须 -
        #ls/等
        [...]
    

    这将产生类似这样的东西/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)
    

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

     ausearch -ua 1000
    

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

    资料来源:

    • http://www.woitasen.com.ar/2011/11/auditing-user-actions-after-sudo/
    • http://linux.die.net/man/8/pam_loginuid
    • http://linux.die.net/man/8/auditd
    • 103
  2. mdpc
    2013-01-20T22:46:07+08:002013-01-20T22:46:07+08:00

    请记住,sudo 本身会在系统日志中记录所有 sudo 命令,因此应该教育所有特权用户不要简单地通过 sudo 来获得 root shell,而是要:

    sudo command p1 p2 ... pn
    

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

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

    • 11
  3. Daniel t.
    2013-02-01T12:03:03+08:002013-02-01T12:03:03+08:00

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

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

     export HISTFILE=/root/.bash_history-$SUDO_USER
     export HISTTIMEFORMAT="%F %T "
    

    所以每个 sudo 到 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
    

    感谢 - http://backdrift.org/logging-bash-history-to-syslog-using-traps

    • 8
  4. Mike McManus
    2013-02-07T11:28:13+08:002013-02-07T11:28:13+08:00

    许多机构实际上禁止使用 auditd,因为它是资源密集型的,并且可能导致拒绝服务攻击的机会。

    一种解决方案是配置最新的 Korn shell(ksh-93,有关详细信息,请参阅http://kornshell.com/)以将所有以 root 身份执行的命令记录到远程系统日志服务器,然后根据策略要求,除非在紧急情况下在某些情况下,系统管理员使用个人帐户登录并通过 sudo 执行增强的 Korn shell。检查日志可以检测管理员何时从批准的 shell 启动另一个 shell 以掩盖他们的踪迹,然后可以根据需要对 SA 进行教育。

    • 3
  5. nighter
    2016-04-22T13:09:33+08:002016-04-22T13:09:33+08:00

    当启用的会话被记录并且可以稍后重播时,Sudo 有一个叫做sudoreplayscript的东西,其工作方式类似于制作终端会话打字稿的命令,稍后可以使用该scriptreplay命令重播。

    • 3
  6. MadHatter
    2013-02-05T01:27:18+08:002013-02-05T01:27:18+08:00

    到目前为止,并不是说其他​​答案有任何问题,但是如果您认为sudo通过的日志记录syslog令人满意,我可以建议一个皱纹:通过网络将其记录到远程审计主机。

    这解决了“现在我已经成为 root,我可以从日志中删除任何我渎职的痕迹”的问题。您现在可能是本地机器上的 root 用户,但您不能从网络中调用该日志数据包,而且您(大概)在远程审计主机上没有 root 权限。

    多年来,我一直在用我管理的一些网络这样做,它还有另外两个信号优势:

    首先,网络上有一个地方可以检查所有系统日志,这样可以更容易地关联事件,因此是一个一站式调查商店,例如“当juno抱怨 NFS 服务器hera没有响应时,是否有其他人抱怨同时做同样的事情?如果是这样,hera很可能是问题所在,让我们看看她记录了什么;如果不是,则juno网络连接更值得怀疑,让我们看看当时还juno记录了什么。”。

    其次,syslog 日志轮换变得更容易:您不会在本地主机上保留日志副本超过几天,但您要确保审计服务器有大量磁盘空间,并将所有 syslog 保留在那里数年。另外,如果您想将它们写入 WORM 介质以用于法医审计等目的,您只需购买一个 WORM 驱动器。

    • 2
  7. Bostjan Skufca Jese
    2014-11-06T15:20:45+08:002014-11-06T15:20:45+08:00

    从 2.0.0 版本开始,Snoopy 能够记录任意环境变量。这是 Snoopy 示例配置文件的链接,您可以在其中找到有关%{env:NAME_OF_MY_ENV_VAR_I_WANT_LOGGED}语法的所有信息。

    然而,最近的贡献指出,记录 tty 的所有者是对“谁以 root 身份执行该命令?”这个问题的一个相当有效和优雅的答案。

    披露:我是史努比的维护者。

    编辑:更改链接以直接指向相关文档(显然,某些人无法在回购中找到它)+ 轻微改写。

    • 2

相关问题

  • 如何在 Linux 机器上找到有关硬件的详细信息?

  • 使用 crontab 和 /etc/cron.hourly,daily,weekly 的区别

  • 持续监控许多服务器运行状况的简单方法?

  • Hudson 无法在 tomcat5 中启动

  • CentOS 的依赖挑战

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve