在串行控制台上允许无密码 root 登录

lar*_*sks 4 authentication rhel centos serial-console

我用(CentOS/RHEL)虚拟机做了很多本地开发工作。与其使用默认的 root 密码配置所有内容——如果暴露在网络中,可能会出现问题——我想将它们配置为仅允许在串行控制台上进行无密码 root 登录。

我的第一次尝试是使用以下选项简单地用命令行替换默认ExecStart命令 :serial-getty@.service--autologin

ExecStart=-/sbin/agetty -o '-p -- \\u' --keep-baud 115200,38400,9600 --noclear --autologin root ttyS0 $TERM
Run Code Online (Sandbox Code Playgroud)

虽然这会跳过login:提示,但它仍会提示输入 root 密码。这似乎是loginLinux 下程序的一个限制。

我还尝试用 shell 替换默认登录程序,如下所示:

ExecStart=-/sbin/agetty -o '-p -- \\u' --keep-baud 115200,38400,9600 --noclear -n -l /bin/bash ttyS0 $TERM
Run Code Online (Sandbox Code Playgroud)

但这与 selinux 发生冲突:虽然我得到了一个bashshell,但它无法访问任何东西:

bash: /root/.bashrc: Permission denied
# ls /etc/systemd
ls: cannot open directory '/etc/systemd': Permission denied
Run Code Online (Sandbox Code Playgroud)

在网络的其他地方,人们建议只从 中删除密码哈希/etc/{password,shadow},但这当然会导致一系列不同的问题:现在任何用户都可以su -没有密码。

关于如何使其正常工作的任何想法?

lar*_*sks 5

经过一些试验,我得到了一些有效的方法:

  1. 运行systemctl edit serial-getty@ttyS0.service,并添加以下内容:

    [Service]
    ExecStart=
    ExecStart=-/sbin/agetty -o '-p -- \\u' --keep-baud 115200,38400,9600 --noclear --autologin root ttyS0 $TERM
    
    Run Code Online (Sandbox Code Playgroud)

    这将导致agetty用户自动登录root,但仅进行此更改,系统仍会提示您输入 root 密码。

  2. 我们可以配置/etc/pam.d/loginroot在没有密码的情况下在控制台上验证登录。将以下内容添加到 的顶部/etc/pam.d/login

    auth sufficient pam_listfile.so item=tty sense=allow file=/etc/securetty onerr=fail apply=root
    
    Run Code Online (Sandbox Code Playgroud)

    这将导致 PAM 堆栈检查登录 tty in /etc/securetty,并在找到时跳过其他身份验证机制。

  3. 将串口添加到/etc/securetty

    # echo ttyS0 > /etc/securetty
    
    Run Code Online (Sandbox Code Playgroud)

完成这些更改后,您将在启动时在串行控制台上看到以下内容:

CentOS Linux 8 (Core)
Kernel 4.18.0-80.11.2.el8_0.x86_64 on an x86_64

localhost login: root (automatic login)

Last login: Sun Nov 17 00:29:36 on ttyS0
[root@localhost ~]#
Run Code Online (Sandbox Code Playgroud)

...如果您退出,您将返回到 shell 提示符。

请注意,我在/etc/securetty这里使用了文件名,在过去的日子里,它实际上做了其他事情(它控制root允许登录的终端)。因此,如果这让您感到困扰,请使用其他文件:)。

  • 这似乎也有效: `auth enough pam_securetty.so` 但请持保留态度,当谈到 _pam_ 时,我是一个初学者。 (2认同)