nologin 是什么
服务账号只用于跑进程,不应允许交互登录。做法是把登录 shell 设为 /sbin/nologin(RHEL 系)或 /usr/sbin/nologin(Debian 系),该 shell 被调用时直接打印提示并退出。它与锁定口令是两件互补的事,通常一起使用。
基本信息
| 适用平台 | Linux(nologin 路径随发行版不同) |
|---|---|
| 相关文件 | /etc/passwd 第 7 列(登录 shell)、/etc/shells |
| 创建方式 | useradd -r -s /usr/sbin/nologin -M 账号 |
| 检查方式 | awk 过滤 /etc/passwd 第 7 列,列出仍可登录的账号 |
典型使用场景
- 新建服务账号:useradd 时直接指定 nologin,避免先建成普通账号再改
- 收敛存量账号:把历史遗留的可登录服务账号改为 nologin,缩小攻击面
- 审计可登录账号:定期导出第 7 列非 nologin、非 false 的账号清单核对
- 防止误用:临时想借服务账号登录时会立刻被拒,异常行为更容易被发现
- 配合口令锁定:passwd -l 锁定口令,nologin 阻断 shell,两道措施一起做
创建与限制
创建与限制
sudo useradd -r -s /usr/sbin/nologin -M svc-app # 系统账号 + nologin + 不建家目录
sudo usermod -s /usr/sbin/nologin olduser # 存量账号改为 nologin
sudo passwd -l olduser # 同时锁定口令
# 列出所有仍可交互登录的账号
awk -F: '$7 !~ /(nologin|false|sync|shutdown|halt)$/ {print $1, $7}' /etc/passwd验证效果
验证效果
su - svc-app -c whoami # 预期报 This account is currently not available
sudo -u svc-app id # sudo 切换不受 nologin 限制,任务仍可执行
grep '^svc-app' /etc/passwd # 确认第 7 列已是 nologin 路径要点对照
| 项目 | 说明 | 注意 |
|---|---|---|
| nologin 路径 | RHEL 系 /sbin/nologin,Debian 系 /usr/sbin/nologin | 写错路径等于没设,按发行版确认 |
| /etc/shells | 部分服务据此判断可用的 shell | nologin 通常不在列表内 |
| cron 与 systemd | 不经过登录 shell | 服务与定时任务不受影响 |
| 口令锁定 | passwd -l | 与 nologin 互补,不能互相替代 |
| 检查清单 | awk 过滤第 7 列 | 定期核对可登录账号清单 |
cron 与 systemd 服务不经过登录 shell,账号设为 nologin 后这些任务照常运行。
sudo -u 切换用户同样不受 nologin 限制,因此 nologin 只挡交互式登录,不是权限隔离手段。
批量收敛账号时先用 awk 导出候选清单并人工确认,再逐个修改,避免误改运维账号导致无人可登录。
确认影响面:检查该账号是否被计划任务或服务单元引用,这些场景不受 nologin 影响,改动不会中断任务。
只锁口令不设 nologin 时,部分配置下 SSH 公钥仍可登录,两道措施应一起做。