将 bash 历史记录发送到 syslog

将 bash 历史记录发送到 syslog

Bash 版本 4.N 显然能够将命令历史记录写入系统日志,但我找不到有关如何配置此功能的信息。

我已经阅读了几页提供使用PROMPT_COMMAND, 和 trap 进行黑客攻击的页面,并且我知道有一个可用的补丁,但这应该是不必要的,因为它现在是内置的。

我知道我可以用来auditd捕获命令,但我想使用 bash/syslog 组合。

答案1

这种方法似乎正是您正在寻找的。本文对此进行了讨论,标题为:提高 Bash 取证能力

摘抄:

在与他讨论这个主题时,我意识到有一些方法可以微调命令历史记录以改进取证调查。 2009年,我还写过一篇博客关于 Bash 的帖子给出了一些将 Bash 命令历史记录发送到远程 Syslog 服务器的想法。我检查了我的网络日志,这篇博文在过去 30 天内仍然很受欢迎,访问量超过 1000 次!请注意,我的博客文章已经过时了:从 4.1 版本开始,Bash 原生支持 Syslog,但在大多数发行版中,它并未启用。要使用此功能,您需要重新编译 shell。

我发现这不是很方便,但好处是用户不能禁用它(除非他将 shell 切换到另一个 shell 或另一个 Bash 二进制文件)。您只需在 config-top.h 中定义“SYSLOG_HISTORY”:

$ vi config-top.h
#define SYSLOG_HISTORY
#if defined (SYSLOG_HISTORY)
#  define SYSLOG_FACILITY LOG_USER
#  define SYSLOG_LEVEL LOG_INFO
#endif

./configure
make install

因此,虽然该功能在 Bash 4.1+ 中可用,但在大多数流行发行版中,默认情况下可能不会使用 Bash 进行编译。

我还没有找到一种方法来查看给定的 Bash 是使用哪些选项进行编译的,因此要回答这个问题,您可能需要查看.spec构建 Bash RPM 时使用的上游文件,例如,在 Redhat 发行版上,同样的方法也可用于基于 Debian 的发行版。

作为确认,我在 Bash.spec文件中查找了 CentOS 7.2.1511 附带的 Bash,但它没有启用此功能:

$ grep configure bash.spec
%configure --with-bash-malloc=no --with-afs
- Use the configure macro instead of calling ./configure directly

滚动你自己的 RPM

以下是我根据上述详细信息的要点构建自己的 Bash 的步骤。

下载并安装源

开始我下载了一个源转速 (SRPM)适用于 CentOS 7.x 的 Bash。下载后我将其安装到我的rpmbuild目录中:

$ rpmdev-setuptree
$ rpm -ivh bash-4.2.46-20.el7_2.src.rpm
修补

这会将文件解压到rpmbuild/SPEC&中rpmbuild/SOURCES。现在我们将tar.gz使用以下步骤复制解压的 Bash 文件的内容:

$ cd rpmbuild/SOURCES
$ tar zxf bash-4.2.tar.gz
$ cp -prf bash-4.2 bash-4.2-orig
$ cd bash-4.2

编辑rpmbuild/SOURCES/bash-4.2/config-top.h并使其看起来像这样:

/* Define if you want each line saved to the history list in bashhist.c:
   bash_add_history() to be sent to syslog(). */
#define SYSLOG_HISTORY
#if defined (SYSLOG_HISTORY)
#  define SYSLOG_FACILITY LOG_LOCAL1
#  define SYSLOG_LEVEL LOG_DEBUG
#endif

编辑rpmbuild/SOURCES/bash-4.2/bashhist.c并使bash_syslog_history函数如下所示:

void
bash_syslog_history (line)
     const char *line;
{
  char trunc[SYSLOG_MAXLEN];

  if (strlen(line) < SYSLOG_MAXLEN)
    syslog (SYSLOG_FACILITY|SYSLOG_LEVEL, "HISTORY: PID=%d UID=%d USER=%s CMD=%s", getpid(), current_user.uid, current_user.user_name, line);
  else
    {
      strncpy (trunc, line, SYSLOG_MAXLEN);
      trunc[SYSLOG_MAXLEN - 1] = '\0';
      syslog (SYSLOG_FACILITY|SYSLOG_LEVEL, "HISTORY: PID=%d UID=%d USER=%s CMD(TRUNCATED)=%s", getpid(), current_user.uid, current_user.user_name, trunc);
    }
}

现在生成一个.patch文件,其中包含我们对这两个文件的更改:

$ cd $HOME/rpmbuild/SOURCES
$ diff -Npru bash-4.2-orig bash-4.2 > bash_history_rsyslog.patch

将这些行添加到$HOME/rpmbuid/SPEC/bash.spec.将这些行放入 SPEC 文件中的适当位置:

# history syslog
Patch144: bash_history_rsyslog.patch
...
...
%patch144 -p1 -b .history_rsyslog
建造

现在构建它:

$ cd $HOME/rpmbuild/SPEC
$ rpmbuild -ba bash.spec

该构建的尾部将如下所示:

...
Processing files: bash-debuginfo-4.2.46-20.el7.centos.x86_64
Provides: bash-debuginfo = 4.2.46-20.el7.centos bash-debuginfo(x86-64) = 4.2.46-20.el7.centos
Requires(rpmlib): rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1 rpmlib(CompressedFileNames) <= 3.0.4-1
Checking for unpackaged file(s): /usr/lib/rpm/check-files /home/vagrant/rpmbuild/BUILDROOT/bash-4.2.46-20.el7.centos.x86_64
Wrote: /home/vagrant/rpmbuild/RPMS/x86_64/bash-4.2.46-20.el7.centos.x86_64.rpm
Wrote: /home/vagrant/rpmbuild/RPMS/x86_64/bash-doc-4.2.46-20.el7.centos.x86_64.rpm
Wrote: /home/vagrant/rpmbuild/RPMS/x86_64/bash-debuginfo-4.2.46-20.el7.centos.x86_64.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.nGworU
+ umask 022
+ cd /home/vagrant/rpmbuild/BUILD
+ cd bash-4.2
+ rm -rf /home/vagrant/rpmbuild/BUILDROOT/bash-4.2.46-20.el7.centos.x86_64
+ exit 0
安装

完成后,我们可以安装生成的 RPM:

$ sudo rpm -ivh --force $HOME/rpmbuild/RPMS/x86_64/bash-4.2.46-20.el7.centos.x86_64.rpm
Preparing...                          ################################# [100%]
Updating / installing...
   1:bash-4.2.46-20.el7.centos        ################################# [100%]
配置rsyslog

现在修改rsyslog的/etc/rsyslog.conf配置:

$ sudo vim /etc/rsyslog.conf
...
...
$ModLoad imudp
$UDPServerRun 514

$ModLoad imtcp
$InputTCPServerRun 514

...
...

#### 全球指令 ####
$template IpTemplate,"/var/log/bash-log/%FROMHOST-IP%.log"
*.* ?Ip模板
&~

...
...

然后重新启动Rsyslog:

$ sudo systemctl restart rsyslog
测试并确认

现在以 root 身份运行一个新的 Bash 实例,并运行几个命令:

$ sudo -Es
$ ls

并跟踪日志文件/var/log/bash-log/127.0.0.1.log

$ tail /var/log/bash-log/127.0.0.1.log
2018-07-19T23:23:37.568131-04:00 centos7 bash: HISTORY: PID=12511 UID=1000 USER=vagrant CMD=sudo -Es
2018-07-19T23:23:37.573825-04:00 centos7 sudo: vagrant : TTY=pts/0 ; PWD=/home/vagrant/rpmbuild/SOURCES ; USER=root ; COMMAND=/bin/bash
2018-07-19T23:23:37.589258-04:00 centos7 systemd-logind: Got message type=signal sender=org.freedesktop.DBus destination=n/a object=/org/freedesktop/DBus interface=org.freedesktop.DBus member=NameOwnerChanged cookie=4454 reply_cookie=0 error=n/a
2018-07-19T23:23:37.590633-04:00 centos7 dbus[588]: [system] Activating service name='org.freedesktop.problems' (using servicehelper)
2018-07-19T23:23:37.590806-04:00 centos7 dbus-daemon: dbus[588]: [system] Activating service name='org.freedesktop.problems' (using servicehelper)
2018-07-19T23:23:37.592160-04:00 centos7 dbus[588]: [system] Activated service 'org.freedesktop.problems' failed: Failed to execute program /lib64/dbus-1/dbus-daemon-launch-helper: Success
2018-07-19T23:23:37.592311-04:00 centos7 dbus-daemon: dbus[588]: [system] Activated service 'org.freedesktop.problems' failed: Failed to execute program /lib64/dbus-1/dbus-daemon-launch-helper: Success
2018-07-19T23:23:37.602174-04:00 centos7 systemd-logind: Got message type=signal sender=org.freedesktop.DBus destination=n/a object=/org/freedesktop/DBus interface=org.freedesktop.DBus member=NameOwnerChanged cookie=4455 reply_cookie=0 error=n/a
2018-07-19T23:23:38.520300-04:00 centos7 bash: HISTORY: PID=12585 UID=0 USER=root CMD=ls
2018-07-19T23:23:49.210406-04:00 centos7 bash: HISTORY: PID=12585 UID=0 USER=root CMD=tail /var/log/bash-log/127.0.0.1.log

注意到CMD=...这个日志中的几行了吗?这些是我们刚刚运行的命令,a ls& tail

预建?

为了帮助人们解决这个问题,我冒昧地使用 Copr 中的修改构建了 Bash RPM。

相关内容