Ubuntu系统中的securetty是一个安全机制文件,它定义了哪些终端设备允许root用户直接登录。简单来说,如果你想限制root只能通过特定的控制台(比如物理终端tty1-tty6)登录,而禁止通过SSH、串口或其他远程方式以root身份登录,就需要修改/etc/securetty文件。这个文件本质上就是一个白名单,列出了所有"安全"的终端设备名称,不在列表中的终端,root用户无法直接登录。很多运维人员在加固服务器时,第一步就是清空或精简这个文件,配合PAM模块和SSH配置,实现多层次的登录控制。

在实际生产环境中,securetty的作用远比大多数人想象的要重要。它不是一个独立运行的程序,而是被PAM(Pluggable Authentication Modules,可插拔认证模块)调用的配置文件。当系统执行login、su、sudo等需要验证用户身份的操作时,PAM会检查当前终端是否在securetty列表中。如果不在,即使你输入了正确的root密码,系统也会拒绝登录。这就是为什么有时候你明明密码正确,却提示"Login incorrect"的原因之一。

securetty文件的具体位置和格式

在Ubuntu系统中,securetty文件通常位于/etc/securetty。你可以用以下命令查看它的内容:

cat /etc/securetty

打开后你会看到类似这样的内容:

# /etc/securetty: list of terminals on which root is allowed to login.
# See securetty(5) and login(1).
console
tty1
tty2
tty3
tty4
tty5
tty6
tty7
tty8
tty9
tty10
tty11

每一行代表一个允许root登录的终端设备。以#开头的是注释行。console代表系统控制台,tty1到tty6通常对应Ctrl+Alt+F1到F6的虚拟控制台。tty7及以上在某些发行版中可能对应图形界面的终端。如果你的系统没有图形界面,tty7可能不存在,但写在文件里也不会报错,只是不会生效。

需要特别注意的是,这个文件只控制"直接以root身份登录"的行为。如果你先以普通用户登录,再通过su或sudo提权,securetty的限制在某些配置下可能不会生效,这取决于PAM的具体规则。所以securetty只是安全体系中的一环,不能单独依赖它来保证安全。

如何修改securetty来限制root登录

修改securetty的方法非常直接。你需要用root权限编辑这个文件。最安全的做法是先备份:

sudo cp /etc/securetty /etc/securetty.bak

然后用编辑器打开:

sudo nano /etc/securetty

如果你只想让root通过物理控制台登录,保留console和tty1-tty6即可,删除其他所有行。如果你想更严格,只保留console和tty1,这样root只能在第一个虚拟终端登录。如果你想完全禁止root通过任何终端直接登录(只允许普通用户登录后提权),可以把文件清空或者只保留注释。

但这里有一个关键点:完全清空securetty在某些Ubuntu版本中会导致root无法通过任何方式直接登录,包括单用户模式恢复。所以在操作之前,一定要确认你有其他方式可以进入系统,比如通过普通用户的sudo权限,或者通过GRUB引导进入单用户模式。

securetty与PAM的关系详解

很多人以为securetty是一个独立的安全程序,其实不是。它是被PAM的pam_securetty模块读取的。在Ubuntu中,你可以在/etc/pam.d/目录下找到相关的PAM配置文件。比如/etc/pam.d/login文件中通常有这样一行:

auth       required     pam_securetty.so

这意味着当用户通过login程序登录时,PAM会调用pam_securetty.so模块,该模块会读取/etc/securetty文件,检查当前终端是否在列表中。如果不在,认证失败。

同样,/etc/pam.d/su文件中也可能有类似配置:

auth       sufficient   pam_rootok.so
auth       required     pam_securetty.so

这里的逻辑是:如果你已经是root(pam_rootok.so检测到),就跳过securetty检查;否则就必须通过securetty验证。这就是为什么普通用户先登录再su到root,有时候不受securetty限制的原因——因为su命令的PAM配置可能允许跳过这一步。

如果你想让securetty对su命令也生效,需要修改/etc/pam.d/su文件,把pam_securetty.so的位置调整到pam_rootok.so之前,或者去掉pam_rootok.so。但这样做有风险,可能导致正常的su操作也被阻止,所以修改PAM配置前一定要在测试环境验证。

配合SSH配置实现完整的登录限制

仅靠securetty是不够的。在远程管理场景中,SSH是主要的登录方式,而SSH使用的是pts(伪终端),不在securetty的控制范围内。所以你还需要修改SSH配置文件/etc/ssh/sshd_config:

PermitRootLogin no

这一行会禁止root通过SSH直接登录。同时建议配合密钥认证和禁用密码登录:

PasswordAuthentication no
PubkeyAuthentication yes

这样就形成了一个完整的控制链:securetty限制物理终端的root登录,SSH配置禁止远程root登录,普通用户通过sudo提权需要输入自己的密码并受到sudoers文件的控制。三层防护叠加,安全性大大提升。

securetty在现代Ubuntu版本中的变化

从Ubuntu 18.04开始,系统默认使用systemd和更现代的登录管理器。在一些新版本中,/etc/securetty文件可能不再被默认使用,或者被其他机制替代。比如systemd的logind服务有自己的终端管理方式,某些情况下会忽略securetty。

你可以通过以下命令检查当前系统是否真的在使用securetty:

grep -r "pam_securetty" /etc/pam.d/

如果输出为空,说明你的系统可能已经不依赖securetty了。但即便如此,保留并正确配置这个文件仍然是一种良好的安全实践,因为它不会造成负面影响,而且在某些场景下(比如单用户模式、恢复模式)仍然会被用到。

在Ubuntu 22.04和24.04中,建议同时关注/etc/login.defs文件中的相关配置,以及systemd的journal日志,确认登录行为是否符合预期。安全加固是一个持续的过程,不能只改一个文件就认为万事大吉。

常见问题和故障排查

修改securetty后如果发现无法正常登录,首先检查是否误删了必要的终端。比如你删除了console,但系统启动时需要在控制台进行某些操作,就可能出问题。恢复方法很简单,从备份文件复制回来:

sudo cp /etc/securetty.bak /etc/securetty

另一个常见问题是:修改后root可以登录,但某些服务以root身份运行时报错。这通常是因为服务使用的终端不在securetty列表中。解决方法是把对应的终端设备名添加到文件中,或者检查服务是否真的需要以root身份直接登录。

还有一种情况是,你在图形界面下修改了securetty,但图形界面使用的是tty7或者更高编号的虚拟终端,而你把这些都删了。结果就是图形界面下无法切换到root终端。这种情况下,保留tty7或者使用sudo -i在图形终端中获取root shell是更好的做法。

最佳实践总结

从安全加固的角度,给出以下具体建议。第一,保留console和至少一个tty(比如tty1),确保你有物理终端的root访问能力用于紧急恢复。第二,清空或精简tty7及以上的条目,防止图形界面下的意外root登录。第三,永远不要完全依赖securetty,必须配合SSH禁用root登录、sudo精细化控制、fail2ban等工具一起使用。第四,每次修改前备份,修改后立即在另一个终端测试,不要在唯一的root会话中操作。第五,定期审计/etc/securetty和/etc/pam.d/下的相关文件,确保没有被恶意篡改。

securetty看起来只是一个简单的文本文件,但它背后涉及PAM认证体系、终端管理、用户权限等多个层面的知识。真正理解它的工作原理,才能在实际运维中做出正确的安全决策。不要盲目照搬网上的配置,要根据自己的服务器用途、访问方式和安全需求来定制。

最后强调一点:安全没有银弹。securetty只是Ubuntu安全体系中的一个小部件。真正的安全来自于纵深防御——多层控制、最小权限、持续监控。把每一层都做好,才是真正的安全。