要限制普通用户仅通过特定终端(如tty1、console)登录,需配置pam_access.so模块并在/etc/pam.d/login的account段添加account required pam_access.so accessfile=/etc/security/access.conf,再于access.conf中写入+ : opsuser : tty1 console和- : opsuser : all,并同步禁用ssh、sudo及图形界面等绕过路径。

普通用户只能通过特定终端(tty)登录,核心是用 pam_access.so 模块配合 /etc/security/access.conf 实现终端级访问控制。该方法不改密码、不锁账号,只在登录鉴权环节校验来源终端名,安全且可逆。
配置 PAM access 模块启用登录控制
确保系统本地登录服务(login)加载了 pam_access.so:
- 编辑
/etc/pam.d/login,在account段开头添加一行:account required pam_access.so accessfile=/etc/security/access.conf - 注意:不要修改
/etc/pam.d/sshd—— SSH 登录走的是网络连接,终端名始终是pts/*,无法匹配tty1这类本地设备名 - 验证是否已启用:
grep -w "pam_access" /etc/pam.d/login应有输出
在 access.conf 中定义精确终端规则
规则按顺序匹配,第一条命中即生效。格式为:+/- : 用户/组 : 终端列表:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 允许用户
opsuser仅从tty1和console登录:+ : opsuser : tty1 console - 紧接着加默认拒绝规则,堵住所有其他路径:
- : opsuser : ALL - 若需允许多个用户,可用组名代替用户名,并在
/etc/group中将用户加入该组,例如:+ : @ttyadmin : tty1 tty2 vc/1 - 终端名必须真实存在:常见有效值包括
tty1~tty6、console、vc/1~vc/6;可在目标终端下运行who am i或echo $TTY确认当前设备名
防止常见绕过方式
单靠 login + access.conf 不足以覆盖全部入口,需同步加固:
- 禁用该用户通过 SSH 登录:在
/etc/ssh/sshd_config中设置DenyUsers opsuser,或确保其未出现在AllowUsers列表中 - 阻止 sudo 切换到该用户:
visudo中添加规则,如%wheel ALL=(ALL) !/bin/su - opsuser, !/bin/bash -l -u opsuser - 不依赖
/etc/securetty:该文件仅对root生效,对普通用户无效 - 图形界面(GDM、SDDM)通常绕过
login和access.conf,如需限制,应统一关闭图形登录或改用轻量级显示管理器并禁用自动登录
验证与排错要点
测试前务必保留一个未被限制的管理员会话,避免锁死:
- 切到目标终端(如
Ctrl+Alt+F1),尝试以opsuser登录,应成功;再切到tty2尝试,应提示Login incorrect或直接退出 - 检查日志:
journalctl -u getty@tty2.service -n 50 --no-pager或tail -n 20 /var/log/auth.log查看拒绝原因 - 确认规则语法无空格错误,
ALL必须大写,终端名之间用空格分隔,不能用逗号 - 若使用 systemd 系统,部分发行版(如 RHEL 8+/CentOS Stream)可能需额外检查
/etc/systemd/logind.conf中的NOfbConsole=或NAutoVTs=设置是否干扰终端识别










