最可靠方式是实时监控auth.log或secure日志中的用户创建行为。需匹配useradd命令、PAM会话及shadow文件变更三类日志模式,辅以auditd加固和sudo权限控制,确保不漏报绕过行为。

直接监控 /var/log/auth.log(Debian/Ubuntu)或 /var/log/secure(RHEL/CentOS)中新增账户的日志条目,是最可靠、零依赖的实时方式。关键不在于“查用户列表”,而在于“捕获系统调用动作”——比如 useradd、adduser、newusers 的执行记录,以及 shadow 文件变更、PAM 模块日志等隐式痕迹。
识别真实新增账户的关键日志模式
系统创建用户时,内核和用户空间工具会在认证日志中留下明确痕迹。需重点匹配以下三类正则模式:
-
useradd 命令执行:匹配
useradd\[(\d+)\]: new user: name=([^,]+), UID=([0-9]+), GID=([0-9]+) -
PAM 账户创建事件:匹配
pam_unix\(useradd:session\): session opened for user root.*by \(uid=\d+\)后紧跟adduser\[\d+\]: Adding user `([^']+)' -
shadow 文件变更审计:若启用了 auditd,可捕获
type=SYSCALL msg=audit.*comm="useradd".*name="/etc/shadow"
注意:仅靠 cat /etc/passwd | tail -n 1 这类轮询方式极易漏报(如批量导入、脚本静默执行),且无法区分“创建”与“修改”。必须以日志流为唯一可信源。
Python 实时监控脚本(含报警逻辑)
以下脚本基于 tail -f 语义持续读取 auth.log,每发现一条匹配的新建用户日志,立即提取用户名、UID、执行者,并触发企业微信/钉钉/邮件报警:
import re
import time
import json
import requests
from datetime import datetime
<p>LOG_PATH = "/var/log/auth.log"
WEBHOOK_URL = "<a href="https://www.php.cn/link/c3c84092ac84582cfd28c3ff246022cb">https://www.php.cn/link/c3c84092ac84582cfd28c3ff246022cb</a>" # 替换为你的机器人key</p><p>def send_wechat_alert(user, uid, actor, ip):
payload = {
"msgtype": "text",
"text": {
"content": f"⚠️ 新增系统账户告警\n时间:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n用户名:{user}\nUID:{uid}\n执行者:{actor}\n来源IP:{ip}"
}
}
try:
requests.post(WEBHOOK_URL, json=payload, timeout=5)
except Exception as e:
print(f"[WARN] 报警发送失败:{e}")</p><p>def follow_auth_log():
with open(LOG_PATH, "r") as f:
f.seek(0, 2) # 移动到文件末尾
while True:
line = f.readline()
if not line:
time.sleep(0.2)
continue</p><h1>匹配 useradd 日志(最常见)</h1><pre class="brush:php;toolbar:false;"> m = re.search(r"useradd\[\d+\]: new user: name=([^,]+), UID=(\d+), GID=\d+", line)
if m:
username, uid = m.group(1), m.group(2)
# 尝试从同一行或前几行提取执行者和IP(例如 sudo 日志)
actor = "root"
ip_match = re.search(r"from (\d+\.\d+\.\d+\.\d+)", line)
ip = ip_match.group(1) if ip_match else "unknown"
send_wechat_alert(username, uid, actor, ip)
continueif name == "main": follow_auth_log()
将脚本保存为 monitor_useradd.py,用 nohup python3 monitor_useradd.py & 后台运行即可。建议配合 systemd service 管理生命周期。
增强可靠性:补充审计与权限控制
单靠日志存在绕过风险(如直接编辑 /etc/passwd)。应叠加以下两层加固:
-
启用 auditd 监控关键文件:在
/etc/audit/rules.d/user.rules中添加-w /etc/passwd -p wa -k user_mod-w /etc/shadow -p wa -k user_mod
然后执行sudo augenrules --load并重启 auditd -
限制高危命令执行权限:通过
sudoers严格管控useradd、usermod等命令的可用用户和参数,避免无审计的静默操作
这样即使有人绕过常规命令,auditd 仍会记录底层 write 操作,并可通过 ausearch -k user_mod 检索。
部署后验证与日常巡检要点
不要只信脚本“跑起来”,要验证它真能捕获行为:
- 手动执行
sudo useradd -m testuser,确认 10 秒内收到报警 - 检查脚本进程是否存活:
ps aux | grep monitor_useradd - 定期查看日志截断情况:
ls -lh /var/log/auth.log*,确保脚本能自动处理 logrotate(当前脚本已支持,因seek(0,2)在文件重命名后仍可继续追加) - 每月人工比对一次
lastlog | head -20和报警记录,确认无漏报
账户新增是高危操作,自动化监控不是锦上添花,而是安全基线。脚本本身不复杂,但逻辑必须紧扣系统真实行为路径。

















