"
人因是安全链条中最薄弱的环节。技术再强,制度再严,只要人的决策、操作或疏忽存在随意性,账号安全就永远有缺口。
在企业运维和云原生时代,Linux 账号管理早已不是简单的 useradd 和 passwd。安全审计要可追溯、普通用户要可管控、管理员要可约束、服务账号要隔离运行——四类账号的管理方式截然不同,但有一个共同目标:尽可能消除人为操作带来的不确定性。
📌 本文看点
01
四类账号管理
审计 · 普通 · 管理 · 服务
Linux 账号体系基于 UID/GID 为核心标识,按使用场景分为四大类:
●安全审计账号(UID 动态分配):用于日志收集、安全扫描、合规检查,Shell 为 /sbin/nologin
●普通用户账号(UID >= 1000):日常办公、开发,Shell 为 /bin/bash
●管理员账号(UID=0 或 sudo):系统运维、配置变更,Shell 为 /bin/bash
●应用服务账号(UID 1-999 系统保留):Nginx、MySQL、Redis 等守护进程,Shell 为 /sbin/nologin
关键文件机制
核心管理命令
| | |
| | /etc/passwd, /etc/shadow, /etc/group |
| | |
| | |
| | |
| | |
2.1 安全审计账号
核心原则:最小权限 + 全程可追溯 + 无交互登录
groupadd -r auditors
useradd -r -g auditors -d /var/log/audit -s /sbin/nologin audit_reader
配置极细粒度 sudo:
# /etc/sudoers.d/audit
Cmnd_Alias AUDIT_CMDS = /usr/bin/journalctl, /usr/bin/ausearch, /usr/bin/aureport
%auditors ALL=(root) NOPASSWD: AUDIT_CMDS
审计规则等级划分:
●Level 1 — 文件完整性审计:监控 /etc/passwd、/etc/shadow、/etc/sudoers 等关键文件
●Level 2 — 系统调用审计:记录 execve(命令执行)、unlink(文件删除)等
●Level 3 — 网络连接审计:监控 connect、accept、bind 等
关键控制
无交互登录、SSH 密钥认证、会话全记录、文件权限锁定 chattr +i、日志远程转发到 SIEM。
2.2 普通用户账号
核心原则:隔离性 + 资源限额 + 密码安全策略
create_regular_user() {
useradd -g ${DEPT}_staff -G users,ssh_login \
-c "${DEPT} Employee" -m -s /bin/bash ${USERNAME}
passwd -e ${USERNAME} # 强制首次修改密码
chage -m 7 -M 90 -W 14 -I 30 ${USERNAME}
}
# /etc/security/pwquality.conf
minlen = 12 # 最小长度 12
dcredit = -1 # 至少 1 数字
ucredit = -1 # 至少 1 大写
lcredit = -1 # 至少 1 小写
ocredit = -1 # 至少 1 特殊字符
maxrepeat = 3 # 连续重复 ≤ 3
difok = 5 # 新旧密码差 ≥ 5
资源限制通过 /etc/security/limits.conf 配置,进程数上限 1024/2048,文件打开数 4096/8192。
2.3 管理员账号
核心原则:最小权限 + 操作可审计 + 双因子认证
采用角色分离架构——系统管理员、数据库管理员、安全管理员各司其职,通过堡垒机作为唯一入口。
# 系统管理员 — 不可操作审计日志
%sysadmins ALL=(ALL) !/bin/su, !/bin/systemctl stop auditd
# 数据库管理员 — 仅限于数据库相关
%dbadmins ALL=(root) /usr/bin/systemctl start mysql*
# 安全管理员 — 仅审计命令
%secadmins ALL=(root) /usr/bin/ausearch, /usr/bin/aureport
●PROMPT_COMMAND 记录所有 Shell 操作到 syslog
●禁止 root 直接 SSH 登录,强制使用 sudo
●SSH 双因子认证(密钥 + TOTP)
●sudo 超时设置 timestamp_timeout=5
2.4 应用服务账号
核心原则:最小权限 + 无登录能力 + 文件隔离
useradd --system --no-create-home --shell /sbin/nologin --gid ${APP_GROUP} ${SERVICE}
systemd 沙箱配置(以 Nginx 为例):
[Service]
ProtectSystem=full
ProtectHome=true
PrivateTmp=true
NoNewPrivileges=true
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
SystemCallFilter=@system-service
典型服务账号包括 Nginx、MySQL、Redis、PostgreSQL,各自拥有独立账号和家目录,通过 systemd 沙箱或 SELinux 强制访问控制。
人因(Human Factor)是账号安全中最大的变量——配置遗漏、权限误判、密码泄露、操作失误、流程绕过,几乎每一起安全事件都能追溯到某个人的某个决定。
第一层:不可抵赖性 — 操作全量审计
最大风险是“可抵赖”。没有审计就无法追责;无法追责,约束就形同虚设。
手段一Shell 级全量记录
echo 'export PROMPT_COMMAND="history -a; logger -p authpriv.info \
[USER=\$USER] [PWD=\$PWD] CMD=\$(history 1 | cut -c8-)"' >> /etc/bashrc
手段二sudo 操作全量记录
# /etc/sudoers
Defaults logfile=/var/log/sudo.log
Defaults log_year, loglinelen=80
手段三内核级审计
auditctl -a exit,always -S execve -k command_log
auditctl -w /etc/shadow -p wa -k identity
威慑
所有日志实时推送到远程 SIEM(如 Wazuh、ELK),本地只读不可删改。操作者清楚知道每一步都有记录——这本身构成了最有力的威慑。
第二层:自动化执行 — 消除人工配置环节
人因最密集的区域,恰恰是重复性最高的配置操作。每一次手动 useradd、手动编辑 sudoers、手动设置权限,都是引入失误的机会。
方案 AAnsible 批量创建用户(幂等执行)
- name: Create dev users
ansible.builtin.user:
name: "{{ item.name }}"
group: "{{ item.dept }}_staff"
shell: /bin/bash
with_items: "{{ users }}"
notify: audit_user_creation
方案 BTerraform 管理 sudoers
resource "local_file" "sudoers_d" {
content = templatefile("sudoers.tpl", { admins = var.admins })
filename = "/etc/sudoers.d/team_admins"
provisioner "local-exec" {
command = "visudo -c -f /etc/sudoers.d/team_admins || exit 1"
}
}
方案 C自动化巡检
# 每 30 分钟检查僵尸账号
*/30 * * * * root /usr/local/bin/account_audit.sh && \
[ -s /tmp/account_alert.txt ] && \
mail -s "Account Alert" security@company.com < /tmp/account_alert.txt
第三层:强制标准化 — 用模板消灭自由裁量
任何允许选择的地方,都存在出错的可能。
account_spec:
naming: "{dept}_{role}_{seq}"
uid_policy: "auto"
primary_group: "{dept}_staff"
supplementary_groups: ["users", "ssh_login"]
password_policy:
min_days: 7, max_days: 90
warn_days: 14, inactive_days: 30
history: 5
shell_whitelist: ["/bin/bash", "/sbin/nologin"]
关键机制
零触摸用户管理(Zero-Touch User Management):所有用户创建必须通过 CMDB 或工单系统发起,由自动化工具执行,管理员无权直接执行 useradd 命令。
第四层:混沌工程与红队测试 — 主动暴露人因风险
制度会因为人的惯性产生盲区。每年至少两次攻防演练是检验人因防御有效性的唯一标准。
●社工测试:通过电话或邮件骗取 sudo 权限?
●配置漂移检测:实际配置 vs CMDB 基线差异?
●闲置账号利用:离职员工未回收账号能否横向移动?
●密码猜测:弱密码是否符合策略配置预期?
# 随机禁用工具账号,测试告警响应
random_user=$(awk -F: '($3>=1000){print $1}' /etc/passwd | shuf -n1)
usermod -L "$random_user"
第五层:技术兜底 — 假设人一定会出错
最后一层防御不是改变人的行为,而是假设人一定会出错,让系统能容忍这些错误
不可变基础设施:服务器从模板启动,配置修改重启后丢失;账号权限在镜像构建阶段声明,运行时不可修改。
# 1. systemd 沙箱防止越界
ProtectSystem=full
ProtectHome=true
# 2. SELinux 强制访问控制
semanage login -a -s user_u $SERVICE_USER
# 3. Webhook 实时告警
tail -1 /var/log/sudo.log | grep -q FAILED && \
curl -X POST -H "Content-Type: application/json" \
-d '{"msg_type":"interactive","card":{"header":{"title":"sudo 失败告警"}}}' \
https://open.feishu.cn/open-apis/bot/v2/hook/xxx
「真正的安全,不是让人不犯错,而是让人犯了错也无法动摇系统。」
Linux 账号管理本质上是一个信任管理的问题。传统模式下,我们信任管理员不会犯错、信任密码不会泄露、信任流程不会被绕过——而这些信任恰恰是最脆弱的。
杜绝人因不是要消灭人的决策权,而是通过技术手段让操作变得可验证、可回滚、可审计。当配置自动化替代了人工敲命令、当 IaC 替代了 SSH 上手改、当不可变基础设施使得任何运行时修改都失效时——安全就不再依赖某个人的小心谨慎,而成为系统本身的固有属性。
真正的安全,不是让人不犯错,而是让人犯了错也无法动摇系统。
本文由 网络信息整理,无不良引导
觉得不错?点赞 · 在看 · 转发三连