命令在任何 shell 中执行之前是否可以写入日志文件?我知道有一个 ssh 补丁可以记录 ssh 会话中的所有命令,但我想记录甚至通过 cgi 或 php 脚本从网络服务器执行的命令。
答案1
命令在任何 shell 中执行之前是否可以写入日志文件?
考虑到其他问题,我认为思考这个问题的另一种方式可能是“我能做些什么来确保我获得已执行的每个命令的记录?”
auditd
由 RedHat 开发但可用于任何 Linux 的守护进程提供的记账工具可以做到这一点。该软件提供的机制不仅可以记录已执行的命令,还可以记录消耗的资源、会话长度、SUID 二进制文件的使用、重要系统文件的更改、文件权限的更改、系统时间的更改等。它很全面,能够监视文件和系统调用。它甚至可以在引导时使用参数在内核中打开audit=1
。执行的命令是来自控制台、SSH 会话还是守护进程并不重要。它的日志文件通常配置为存储在 中/var/log/audit
,如果您正在查找已执行的命令,可以使用grep exec /var/log/audit/audit.log
例如 找到它们。
安全和日志记录的通用概念
其余部分超出了问题的范围,但由于问题或未来读者上的安全标签,这可能很重要。您可以获得良好的整体安全性基线通过以下方式可能与您的 Linux 系统最相关的配置迪莎 RHEL-6 STIG(为了方便查看而给出的非官方链接),还有许多与审计相关的条目,您也可以将其用于您的系统。这些概念的精确实现在 Linux 的主要发行版中可能有所不同,但作为实际情况的总结仍然有用。基线安全实践。 (DISA 还为许多其他系统和软件产品提供了许多其他良好的基准。)
考虑一下,虽然监控和日志记录非常棒,但您真的会跟上阅读每一行日志的任务,并在消息继续流动时在您的脑海中有效地将一个事件与另一个事件关联起来吗?还要考虑到记录数据的完整性是最重要的。您能否相信安装和配置会计软件的系统永远不会受到损害?像这样的爆料呢?炮弹休克?
因此,我们应该尽量减少日志文件数据被篡改的可能性,并使用软件来帮助我们分析和响应日志中的信息。
保持记录数据完整性的一种策略是确保所有日志记录不仅存储在本地,而且还通过转发到中央日志服务器进行远程存储。
[Production Server] <---> [NIC 1] <--production traffic--> [Internet]
<---> [NIC 2] <--management traffic--> [Log Server]
确保日志服务器仅在日志记录软件使用的端口上接受来自生产服务器的流量,例如用于 syslog 的 TCP/UDP 514。使用任何可用的方式使管理网络尽可能私有,例如使用管理网络的专用网络 (RFC 1918)。如果可能的话,实施 VLAN ID,当然还要进行拒绝所有允许例外的防火墙配置。为网络提供尽可能多的带宽并尽可能少地利用它,甚至可能设计一个单独的“系统日志网络”,因为根据网络中设备的数量,中央系统日志服务器可能会变得过度。加载系统日志消息。反过来,这可能会导致使用 UDP 时消息被丢弃。您可能会考虑改用 TCP,但这也可能会成为一个问题,因为系统日志消息会在系统日志客户端的队列中堆积起来,直到所有磁盘空间都被耗尽,这实际上是“搬起石头砸自己的脚”。 (因此,创建一个单独的分区或逻辑卷来定义本地日志文件可用的最大磁盘空间并防止系统分区或卷上的磁盘使用失控是明智的。)如果我们使用 rsyslog,那么,除了在 rsyslog 客户端中指定中央日志记录服务器之外,还必须在 rsyslog 中启用 audispd 插件,以便转发与记帐相关的日志记录。
如果我们不打算严格检查并可能对信息做出回应,为什么我们会出于安全考虑而记录任何内容呢?仅此一项就可能成为一项艰巨的任务。因此,日志文件分析软件的选择也很重要。它应该能够知道或被配置为知道什么构成了威胁,以及如何将其呈现给我们以供我们了解,以便我们及时做出反应。否则,我们的安全日志没有多大用处,除非用于事件后分析。该软件应该能够分析中央日志服务器上所有已配置为向其发送系统日志数据的设备(服务器、工作站、路由器)或任何可以发送日志数据的设备的数据。
答案2
您可以设置会计
然后使用 awk 或 sed 来提取你想要的字符串
答案3
如果该命令返回任何输出,您可以执行该命令并将返回的输出保存到文件日志中
例如
$ ls > ls.log
对不返回输出的命令使用 verbose
$ mv -v foo bar > mv.log
因为php-scripts
您可以使用echo
、函数或 php 自己的函数执行相同的>
操作。system