Linux 审计在安全管理中至关重要,不仅能检测和预防潜在的安全威胁,还能追踪用户行为、确保合规性并提供详尽的操作记录。这些审计功能为系统管理员和安全专家提供了维护系统完整性和安全性所需的重要信息。

PROMPT_COMMAND是一个在 Bash shell 中非常有用的环境变量。它允许用户在每次显示命令提示符之前执行指定的命令。这可以用于多种用途,例如自动更新命令提示符的内容、记录命令历史、监视系统状态等,今天通过配置PROMPT_COMMAND实现审计命令行所有操作。最终实现的效果如下图:

什么是PROMPT_COMMAND?

PROMPT_COMMAND 是一个 Bash 环境变量,它包含一个命令或一组命令。这些命令在每次显示命令提示符之前执行。通过使用 PROMPT_COMMAND,可以动态地更改提示符的内容或执行其他自动化任务。

实现审计命令行所有操作

配置环境变量

编辑/etc/profile,在改文件中导出一个变量,并设置改变量为只读模式。如下图所示:

该命令太长,可能不太容易理解。别担心,接下来我们将通过拆解,详细解析这个命令的作用和用法。

export PROMPT_COMMAND='RETRN_VAL=$?;logger -p local6.debug "$(whoami) [$$]: $(history 1 | sed "s/^[]*[0-9]\+[ ]*//") [$RETRN_VAL]"'
readonly PROMPT_COMMAND

命令拆解与解析

  • RETRN_VAL=$?

$?是一个特殊变量,它存储了上一个命令的退出状态(返回值)。将其赋值给RETRN_VAL变量,以便在后续使用。

  • logger -p local6.debug

logger是一个命令,用于将消息写入系统日志。选项-p指定消息的优先级。local6.debug表示使用 local6这个本地设施(facility),并且日志级别为debug

  • "$(whoami) [$$]: $(history 1 | sed "s/^[]*[0-9]\+[ ]*//") [$RETRN_VAL]"

    这是传递给 logger 命令的日志消息。它包含以下几部分:

    • $(whoami): 这个命令返回当前用户的用户名。
    • [$$]: 这个特殊变量表示当前进程的进程ID
    • $(history 1 | sed "s/^[]*[0-9]\+[ ]*//"): 这部分命令获取最近执行的命令,并使用sed删除历史编号。
    • [$RETRN_VAL]: 包含上一个命令的退出状态。
  • readonly:将环境变量设置为只读以防止被修改。

自定义日志路径

然后在/etc/rsyslog.d目录下创建一个history.conf,内容如下;

local6.debug /var/log/users-command.log

该配置的意思是将local6.debug的日志指定到自定义的文件目录下。

重启rsyslog服务

重启rsyslog服务,执行如下命令:

systemctl restart rsyslog

完成了上述配置后,每个用户登录系统上做了什么操作都一目了然了。如下图:

总结

PROMPT_COMMAND是一个强大的工具,可以用来定制 Bash 提示符并实现自动化任务。通过正确配置 PROMPT_COMMAND,你可以提高命令行的效率和信息可见性。希望本教程能帮助你更好地理解和使用 PROMPT_COMMAND