在CentOS系统中,限制root用户通过TTY终端直接登录是一项非常关键的安全加固措施。具体做法是通过修改/etc/securetty文件和/etc/login.defs配置文件,禁用不必要的TTY终端,同时配合PAM模块限制root的本地登录权限。核心命令是将/etc/securetty中的终端设备全部注释掉或清空,并在/etc/securetty中只保留必要的控制台,然后通过编辑/etc/pam.d/login文件添加pam_securetty.so模块来实现强制限制。下面我把每一步操作、原理和注意事项全部讲清楚。

一、为什么要限制root通过TTY终端登录

TTY终端是Linux系统中的物理控制台或虚拟终端,通常对应/dev/tty1到/dev/tty63等设备。在CentOS 7/8/9中,如果root用户可以在任意TTY上直接登录,意味着任何人只要能接触到服务器的物理控制台或者通过IPMI、KVM等带外管理工具进入系统,就能以root身份操作机器。这在多用户环境、机房托管场景下是巨大的安全隐患。限制root的TTY登录后,即使有人获得了物理访问权限,也无法直接以root登录,必须先用普通用户登录再通过sudo提权,这样所有操作都有审计日志可追溯。

二、理解/etc/securetty文件的作用

/etc/securetty是一个纯文本文件,它定义了哪些终端设备允许root用户直接登录。系统的PAM认证模块pam_securetty.so会在认证过程中检查当前用户是否为root,如果是,就会核对当前TTY设备是否在/etc/securetty列表中。如果不在,登录就会被拒绝。这个机制是CentOS默认启用的,但默认情况下/etc/securetty里列出了几乎所有TTY设备,等于没有限制。我们要做的就是把这个列表收紧。

三、查看当前securetty的配置状态

在动手修改之前,先看看当前文件里有什么内容。执行以下命令:

cat /etc/securetty

你会看到类似这样的输出:

tty1
tty2
tty3
tty4
tty5
tty6
tty7
tty8
tty9
tty10
...
vc/1
vc/2
vc/3
vc/4
vc/5
vc/6
vc/7
vc/8
vc/9
vc/10
...

这个列表非常长,基本上所有的虚拟控制台和串行控制台都被允许了。这就是为什么默认情况下root可以在任何TTY上登录的原因。

四、修改securetty文件限制root登录终端

有两种策略可以选择。第一种是完全禁止root通过任何TTY登录,第二种是只保留特定的TTY(比如只保留tty1作为紧急维护用)。

策略一:完全禁止root通过TTY登录。执行以下命令清空文件:

echo "" > /etc/securetty

或者用编辑器打开文件,把所有内容注释掉:

vi /etc/securetty

在每一行前面加#号,保存退出。这样root在任何TTY上都无法直接登录。

策略二:只保留必要的TTY。比如你希望保留tty1作为紧急维护通道:

echo "tty1" > /etc/securetty

或者保留tty1和ttyS0(串行控制台):

echo -e "tty1\nttyS0" > /etc/securetty

修改完成后,一定要验证文件权限是否正确:

ls -l /etc/securetty

正常应该是root:root,权限644或600。如果权限不对,修复它:

chown root:root /etc/securetty
chmod 600 /etc/securetty
五、确认PAM模块已启用securetty检查

光改文件还不够,必须确认PAM的login模块确实在使用pam_securetty.so。检查/etc/pam.d/login文件:

cat /etc/pam.d/login

你应该能看到类似这样的一行:

auth       required     pam_securetty.so

如果这行不存在或者被注释掉了,手动添加进去。用vi编辑:

vi /etc/pam.d/login

在auth部分添加:

auth       required     pam_securetty.so

注意这行必须放在其他auth模块之前或合适的位置,确保它能被执行。在CentOS 7中,这个模块通常默认就有,但在某些自定义安装或最小化安装中可能缺失,所以一定要检查。

六、通过/etc/login.defs进一步加固

/etc/login.defs文件控制着系统登录的各种默认行为。其中有一个关键参数CONSOLE,它指定了允许root登录的控制台设备。查看当前设置:

grep CONSOLE /etc/login.defs

默认可能是:

CONSOLE /etc/securetty

这表示系统会读取/etc/securetty来决定允许root登录的终端。如果你已经把securetty清空了,这里保持默认即可。但如果你想额外加一层保险,可以把CONSOLE指向一个空文件或者只包含你允许的设备的文件:

CONSOLE /etc/allowed-root-ttys

然后创建/etc/allowed-root-ttys,只写入你允许的终端设备。

另外,login.defs中还有几个相关参数值得关注:

LOGIN_RETRIES        3
LOGIN_TIMEOUT        60
FAIL_DELAY           3

这些参数控制登录失败后的重试次数和延迟时间。建议把LOGIN_RETRIES设为3,FAIL_DELAY设为5或更高,防止暴力破解。

七、配置防火墙规则配合TTY限制

虽然TTY限制主要针对本地物理终端,但如果你的服务器同时开放了SSH远程登录,还需要用firewalld或iptables做配合。CentOS 7/8/9默认使用firewalld,确保SSH端口只对必要的IP开放:

firewall-cmd --permanent --add-service=ssh
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="ssh" accept'
firewall-cmd --reload

如果你的服务器不需要远程SSH,直接关闭SSH服务:

systemctl stop sshd
systemctl disable sshd

但注意,关闭SSH后你只能通过物理控制台或带外管理访问,这时候TTY限制就更加重要了。同时建议在firewalld中限制所有不必要的入站端口:

firewall-cmd --permanent --remove-service=http
firewall-cmd --permanent --remove-service=https
firewall-cmd --reload

只保留你真正需要的服务端口,最小化攻击面。

八、禁用不必要的TTY终端设备

除了修改securetty,还可以从系统层面禁用不需要的getty服务。CentOS使用systemd管理getty,每个TTY对应一个getty@ttyX.service。查看当前活跃的getty服务:

systemctl list-units 'getty@*' --state=running

如果你发现tty2到tty6都在运行,但你根本不需要那么多本地登录终端,可以禁用它们:

systemctl disable getty@tty2.service
systemctl disable getty@tty3.service
systemctl disable getty@tty4.service
systemctl disable getty@tty5.service
systemctl disable getty@tty6.service

禁用后立即生效,这些TTY将不再启动getty进程,即使有人切换到那个终端也不会出现登录提示。只保留tty1即可:

systemctl enable getty@tty1.service
九、设置普通用户+sudo替代root直接登录

限制root通过TTY登录后,你必须确保有一个普通用户可以通过sudo执行管理操作。创建一个专用的管理员用户:

useradd -m -s /bin/bash adminuser
passwd adminuser

然后把这个用户加入wheel组(CentOS中wheel组默认有sudo权限):

usermod -aG wheel adminuser

确认/etc/sudoers中wheel组有权限:

grep wheel /etc/sudoers

应该看到:

%wheel  ALL=(ALL)       ALL

如果没有,用visudo添加。这样adminuser就可以通过sudo执行任何root命令,同时所有sudo操作都会被记录到/var/log/secure或/var/log/auth.log中。

十、验证配置是否生效

所有配置完成后,必须测试验证。首先,用普通用户登录TTY确认正常:

# 切换到tty2(假设tty2的getty已禁用,这里用tty1测试)
# 用adminuser登录后执行sudo su - 测试提权

然后测试root直接登录是否被拒绝。在另一个终端或通过带外管理切换到tty1,尝试用root登录。如果securetty已清空,你应该看到类似这样的错误:

Login incorrect

或者更明确的提示:

You cannot login on this terminal

这说明限制生效了。如果还能登录,检查以下几点:securetty文件是否真的为空、PAM模块是否正确加载、文件权限是否正确。

十一、其他补充安全建议

除了TTY限制,还有几个配套措施建议一起做。第一,启用SELinux并设置为enforcing模式:

setenforce 1
sed -i 's/SELINUX=permissive/SELINUX=enforcing/' /etc/selinux/config

第二,配置auditd审计系统,记录所有登录行为:

systemctl enable auditd
systemctl start auditd

添加审计规则监控root相关操作:

auditctl -w /etc/securetty -p wa -k securetty_changes
auditctl -w /etc/passwd -p wa -k passwd_changes

第三,定期检查/var/log/secure日志,关注异常登录尝试:

grep "Failed password" /var/log/secure | tail -20

第四,如果服务器有IPMI或iLO/iDRAC等带外管理,确保这些接口也设置了强密码并限制访问IP,因为它们本质上也是一种TTY访问方式。

十二、总结

CentOS安全启用TTY防火墙限制root登录终端,核心就是三步:修改/etc/securetty收紧允许的终端列表、确认PAM的pam_securetty.so模块生效、禁用不必要的getty服务。再配合firewalld最小化开放端口、建立普通用户+sudo的管理模式、启用SELinux和审计系统,就能构建一套完整的本地终端安全防护体系。这套方案不需要额外安装任何软件,全部利用CentOS自带的机制实现,简单高效且可靠。对于生产环境的服务器,这是必须做的基础安全加固项目之一。