服务账号本不应交互登录
为运行服务而创建的账号(Nginx、Tomcat、数据库、消息队列等对应的账号)通常把登录 shell 设为不可登录的程序,或者根本不设家目录,目的就是防止被当作人类账号使用。一旦这类账号出现在交互会话记录里,或者它的家目录里突然出现文件,就说明这个账号被借用了——借用的主体可能是运维脚本,也可能是攻击者。
切换用户不产生登录记录
需要特别注意:通过 sudo 或 su 切换到服务账号执行命令,不会在登录记录里留下新的登录条目,只会出现在 sudo 日志或进程审计里。因此「登录记录里没有这个账号」不能证明它没被使用,判定必须结合 sudo 日志、进程创建记录与文件时间。
基本信息
| 适用平台 | Linux(/etc/passwd 的 shell 字段与登录记录) |
|---|---|
| 基线特征 | shell 字段为 /usr/sbin/nologin、/bin/false 等不可登录程序 |
| 异常特征 | 出现交互登录、家目录被写入、SSH 密钥被新增 |
| 查看记录 | last、lastlog、认证日志中的会话记录 |
| 切换场景 | sudo -u 与 su 记录在 sudo 日志或审计日志中 |
典型使用场景
- 提权排查:确认 Web 或数据库账号是否被用来执行命令
- 核查后门账号:检查新增账号的 shell 与家目录是否符合基线
- 排查横向移动:服务账号出现在远程登录记录里值得深查
- 清理与恢复:处置后确认账号的 shell 与密钥恢复基线状态
- 建立基线清单:记录各服务账号的预期属性便于日后比对
核查账号与登录
核查账号与登录
# 找出 shell 字段不是不可登录程序的账号(需人工确认合理性)
awk -F: '$7 !~ /(nologin|false|sync|shutdown|halt)$/ {print $1, $7}' /etc/passwd | head -20
# 服务账号是否出现在登录记录里
last -F | grep -E 'www-data|nginx|tomcat|mysql' | head
lastlog | head -20
# 家目录与授权文件是否被改动
ls -la /var/www /var/lib/mysql /home 2>/dev/null | head -20
find /var/www -name 'authorized_keys' -o -name 'id_rsa*' 2>/dev/null | head
# 通过 sudo 切换的记录(不会出现在 last 里)
grep -E 'sudo.*(www-data|nginx)' /var/log/auth.log 2>/dev/null | tail -20异常特征与判断
| 特征 | 含义 | 核实方式 |
|---|---|---|
| shell 被改为可登录 | 账号可被直接登录 | 与部署文档和变更记录对照 |
| 出现交互登录记录 | 账号被当人类账号使用 | 查来源地址与操作内容 |
| 新增 SSH 密钥 | 建立了持久免密通道 | 检查密钥文件时间与内容 |
| 家目录出现可执行文件 | 可能被用于落地载荷 | 核对文件来源与时间窗 |
| 属于高权限组 | 权限被提升 | 检查组成员变更时间 |
部分应用确实需要可登录 shell 的服务账号(例如某些批处理与运维脚本),判定异常前先查部署文档与现有基线,避免把正常设计当成入侵。
服务账号的密码字段也值得看:能通过密码认证的服务账号风险高于仅用不可登录 shell 的账号,结合认证日志判断是否有实际登录尝试。