Ubuntu服务器默认允许账号在本地终端或通过串口控制台自动登录,这个设置在桌面版上看似方便,但在服务器场景下属于高风险配置。任何能物理接触机器、进入恢复模式或通过带外管理卡挂载虚拟介质的人,都能直接拿到一个已经登录的shell,绕过账号密码验证。更常见的情况是运维人员配置了KVM over IP或者云厂商的VNC控制台,如果自动登录开启,等于把系统的大门敞开了。关闭自动登录不是简单的“取消勾选”,它涉及GDM、LightDM、getty、串口控制台以及systemd服务配置多个层面。

先确认当前系统是否存在自动登录配置

Ubuntu服务器通常没有图形界面,但很多用户会安装最小化桌面环境用于远程管理,或者云镜像默认带了一些显示管理器配置。检查GDM自动登录配置,执行以下命令:

cat /etc/gdm3/custom.conf

如果输出中包含类似下面的内容,说明自动登录已经开启:

[daemon]
AutomaticLoginEnable=true
AutomaticLogin=ubuntu

这里的AutomaticLoginEnable值为true就是问题所在,AutomaticLogin指定了自动登录的用户名。对于LightDM,配置文件位于/etc/lightdm/lightdm.conf,需要检查[Seat:*]段落下是否有autologin-user和autologin-user-timeout参数。即使没有图形界面,某些Ubuntu衍生版本或定制镜像也可能残留这些配置。

禁用GDM自动登录

编辑/etc/gdm3/custom.conf文件,将AutomaticLoginEnable的值改为false,并注释或删除AutomaticLogin行。完整的修改建议如下:

sudo nano /etc/gdm3/custom.conf

修改后内容应为:

[daemon]
# AutomaticLoginEnable=false
# AutomaticLogin=ubuntu
AutomaticLoginEnable=false

保存后重启GDM服务使配置生效:

sudo systemctl restart gdm3

如果服务器没有运行图形界面,这个服务可能不存在或未激活,但配置文件残留仍然可能在后续安装桌面组件时被读取。因此即使当前未运行GDM,也建议主动检查并修正配置文件。

禁用LightDM自动登录

LightDM在较老的Ubuntu版本或轻量级桌面环境中常见。编辑/etc/lightdm/lightdm.conf,找到[Seat:*]段落,将autologin-user参数注释掉或删除:

sudo nano /etc/lightdm/lightdm.conf

修改前:

[Seat:*]
autologin-user=ubuntu
autologin-user-timeout=0

修改后:

[Seat:*]
# autologin-user=ubuntu
# autologin-user-timeout=0

保存后重启LightDM:

sudo systemctl restart lightdm

如果LightDM服务未运行,配置文件中的autologin参数会在下次启动显示管理器时生效,所以提前清理配置是必要的。

检查并禁用TTY自动登录

Ubuntu服务器的文本控制台由getty管理。systemd的getty服务可以通过override配置实现自动登录。检查是否存在自动登录的override文件:

ls -la /etc/systemd/system/getty@tty1.service.d/

如果该目录存在autologin.conf或类似文件,查看内容:

cat /etc/systemd/system/getty@tty1.service.d/autologin.conf

典型的自动登录配置如下:

[Service]
ExecStart=
ExecStart=-/sbin/agetty --autologin ubuntu --noclear %I $TERM

要禁用TTY自动登录,直接删除该override文件或整个目录:

sudo rm -rf /etc/systemd/system/getty@tty1.service.d/

然后重新加载systemd配置:

sudo systemctl daemon-reload

如果希望保留目录但禁用自动登录,可以编辑autologin.conf,移除--autologin参数及其后的用户名。修改后执行systemctl daemon-reload和systemctl restart getty@tty1。

检查串口控制台自动登录

很多Ubuntu服务器部署在物理硬件上,运维人员会配置串口控制台用于远程带外管理。串口控制台的getty服务同样可能被配置为自动登录。检查串口getty服务配置:

systemctl status serial-getty@ttyS0.service

查看是否存在override文件:

ls -la /etc/systemd/system/serial-getty@ttyS0.service.d/

如果存在autologin.conf,内容通常包含:

[Service]
ExecStart=
ExecStart=-/sbin/agetty --autologin root --keep-baud 115200,38400,9600 %I $TERM

禁用方法与TTY相同,删除override目录或移除--autologin参数后重载systemd。串口控制台自动登录的风险比本地TTY更高,因为串口往往连接到集中管理设备,攻击者可能通过管理网络漏洞直接获得已登录的root shell。

移除账户免密登录相关PAM配置

有些自动登录并非通过显示管理器或getty实现,而是在PAM层面配置了特定服务的免密认证。检查/etc/pam.d/目录下是否有可疑的pam_permit.so或pam_succeed_if.so条目。例如,某些定制系统会在/etc/pam.d/login中添加:

auth sufficient pam_permit.so

这会导致所有本地登录都不需要密码。检查login和gdm-autologin相关PAM文件:

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

如果发现pam_permit.so出现在auth sufficient行,应将其删除或注释。正常的Ubuntu系统PAM配置中,pam_permit.so通常只出现在account或session阶段用于特定服务,auth阶段出现sufficient pam_permit.so几乎可以确定是异常配置。

检查cloud-init配置

云服务器镜像经常通过cloud-init在首次启动时创建用户并可能设置自动登录。检查/etc/cloud/cloud.cfg中的users段落:

cat /etc/cloud/cloud.cfg

查找是否存在lock_passwd: false或ssh_pwauth相关的自动登录配置。更重要的是检查/etc/cloud/cloud.cfg.d/目录下的自定义配置,有些云厂商会在其中添加自动登录指令。例如:

grep -r "autologin" /etc/cloud/

如果发现相关配置,删除或修改对应文件。cloud-init配置在实例重启或重新初始化时可能会重新应用,因此需要从源头清理。

验证自动登录是否已彻底关闭

完成上述修改后,重启服务器进行验证。重启后观察本地终端和串口控制台是否直接进入shell。如果服务器在远程机房,可以通过IPMI或iDRAC的虚拟控制台查看启动过程。正常情况应该在登录提示符处停下,要求输入用户名和密码。

另外检查当前运行的服务中是否还有自动登录进程残留:

ps aux | grep agetty

输出中不应包含--autologin参数。如果有,说明某个getty服务仍在以自动登录模式运行,需要进一步排查对应的systemd unit文件。

加固建议:从账户策略层面防止自动登录

除了关闭现有的自动登录配置,还可以通过账户策略增加一层防护。对于不需要交互登录的服务账户,将其shell设置为/sbin/nologin或/usr/sbin/nologin:

sudo usermod -s /usr/sbin/nologin 用户名

对于需要保留登录能力的管理员账户,启用强密码策略并考虑配置SSH密钥认证替代密码登录。同时限制物理控制台访问,确保只有授权人员能接触服务器或带外管理接口。

另一个容易被忽略的点是Ubuntu的恢复模式。即使关闭了正常启动的自动登录,攻击者仍可在GRUB引导菜单中选择恢复模式进入root shell。建议为GRUB设置密码,防止未授权修改启动参数:

sudo grub-mkpasswd-pbkdf2

生成密码哈希后,编辑/etc/grub.d/40_custom文件,添加以下内容:

set superusers="admin"
password_pbkdf2 admin 生成的哈希值

然后执行update-grub更新配置。这样即使有人物理接触服务器,也无法通过修改启动参数进入单用户模式或恢复模式。

关闭自动登录是Ubuntu服务器安全加固中基础但关键的一步。很多入侵事件并非来自远程漏洞利用,而是通过管理控制台、带外管理卡或云平台VNC功能直接获得了已登录的shell。逐项检查GDM、LightDM、getty、串口控制台、PAM和cloud-init配置,确保没有任何自动登录入口残留,配合GRUB密码保护和账户策略,才能有效堵住这类本地提权路径。