进程记账是什么
开启进程记账(acct / psacct)后,内核会在每个进程结束时把一条记录写入记账文件,包含命令名、执行用户、终端、起始与结束时间以及耗时。它提供的是 shell 历史之外的执行证据:命令是否真的被执行过、由谁执行、在什么时刻结束,都能从记账文件中查到,而 shell 历史只反映输入过什么。记账必须依赖服务处于运行状态,未开启的系统完全没有数据,这一点要先确认再下结论。
基本信息
| 记账文件 | /var/account/pacct(部分发行版为 /var/log/account/pacct) |
|---|---|
| 查询命令 | lastcomm、sa、ac -p |
| 服务名 | Debian 系 acct,RHEL 系 psacct |
| 记录粒度 | 进程级,通常不含命令参数 |
典型使用场景
- 确认某命令是否真的被执行过,而不是只被输入过
- 核对命令执行用户与终端,识别共用账号下的实际操作者
- 按用户统计 CPU 与执行时间,发现异常的高负载命令
- 与认证日志互证:登录后是否立即执行了可疑程序
- 为清理类动作是否存在提供独立于 shell 历史的证据
查询记账记录
查询记账记录
systemctl is-active acct 2>/dev/null || systemctl is-active psacct 2>/dev/null # 先确认服务状态
lastcomm --user alice | head -20 # 按用户查执行过的命令
sa -u | head -20 # 汇总各用户的资源使用
ac -p | head # 按用户统计连接时长
ls -l /var/account/pacct 2>/dev/null # 记账文件是否存在及大小
lastcomm --command rm | head -10 # 按命令名过滤,例如查看删除动作lastcomm 输出读法
| 列 | 含义 | 判读要点 |
|---|---|---|
| 命令名 | 被执行的程序名 | 受限长度,长名字可能被截断 |
| 标记 | F 表示 fork 未 exec,S 表示以超级用户运行 | S 标记用于识别提权执行 |
| 用户名 | 执行该进程的账号 | 共用账号下可用终端列辅助区分 |
| 终端与时间 | 登录终端与结束时刻 | 用于与认证日志拼接时间线 |
记录内容受配置影响,默认通常只保存命令名而不含参数,因此无法从记账文件得知命令操作了哪些文件,需要配合 shell 历史或审计日志使用。
记账文件会随轮转被替换或压缩,早期记录可能已经不在当前文件中,采集时应优先归档并记录当前文件的时间范围。
开启记账会带来持续的磁盘写入与一定性能开销,生产环境是否启用以运维策略为准,取证时只做读取,不要现场开启服务。