关键在于分层采集指令级行为:ssh/telnet用prompt_command+auditd捕获命令,数据库启用通用日志或log_statement=all,api通过nginx扩展日志记录请求体并结合waf敏感词标记。

要实现对所有进出网络的异常指令操作进行全量记录,关键不是“抓所有流量”,而是聚焦在可审计、可关联、可溯源的指令级行为上。真正的全量记录依赖分层采集:网络层捕获原始通信(如命令通道),应用层解析具体指令(如SSH命令、数据库SQL、API调用),系统层绑定执行主体(用户、终端、时间)。下面分三类典型场景给出可落地的操作路径。
一、SSH/Telnet等远程指令操作全量审计
这是最常见也最容易漏审的高危入口。Linux默认只记录登录行为,不记录具体执行了什么命令。
- 启用bash或zsh的命令历史持久化并强制落盘:编辑/etc/profile,追加export PROMPT_COMMAND='RETRN_VAL=$?;logger -p local6.info "$(whoami) [$$] $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//") [$RETRN_VAL]"',再重启shell;
- 配合auditd监听execve系统调用:执行echo "-a always,exit -F arch=b64 -S execve -k remote_cmd" >> /etc/audit/rules.d/cmd.rules,然后augenrules --load && systemctl restart auditd;
- 验证方法:ausearch -k remote_cmd | grep -E "(ssh|telnet)" | head -n3,应能看到类似/usr/bin/ssh -o StrictHostKeyChecking=no user@10.0.1.5的完整指令。
二、数据库与中间件指令操作审计
SQL注入、误删表、越权查询等风险都藏在指令里,不能只靠网络包还原。
- MySQL开启通用查询日志(仅限审计期):SET GLOBAL general_log = 'ON'; SET GLOBAL log_output = 'TABLE';,之后查SELECT * FROM mysql.general_log ORDER BY event_time DESC LIMIT 10;;
- PostgreSQL启用log_statement = 'all',并在postgresql.conf中配置log_destination = 'csvlog'和logging_collector = on;
- Redis建议启用MONITOR命令(生产慎用),或更稳妥地部署代理层(如redis-proxy)统一记录所有client输入指令。
三、API与Web管理后台指令操作审计
宝塔、Jenkins、K8s Dashboard等平台的操作本质是HTTP请求,但默认access_log不记录请求体(即真正执行的指令)。
- 在Nginx配置中扩展log_format,加入$request_body字段(需开启client_body_buffer_size和large_client_header_buffers);
- 对关键接口做条件记录,例如只对/api/v1/exec或/panel/api路径启用完整body日志,避免全量写入性能损耗;
- 搭配WAF(如ModSecurity)规则,对含rm -rf、DROP TABLE、kubectl delete等敏感词的请求自动打标并写入独立审计日志文件。











