CentOS系统里,给grub引导菜单加上密码,并且锁定单用户模式,是防止未经授权的人通过重启进入系统修改root密码或访问敏感数据的核心方法。具体操作是编辑/etc/grub.d/40_custom文件,使用grub2-mkpasswd-pbkdf2命令生成加密密码,然后更新grub配置。同时,需要在/etc/default/grub中配置GRUB_DISABLE_RECOVERY参数来禁用恢复入口,才能真正保护单用户模式。
为什么必须保护GRUB和单用户模式?
服务器的物理控制或控制台访问一旦被获取,攻击者最直接的提权路径就是重启系统。在GRUB引导界面,他可以按'e'键编辑启动参数。对于CentOS,常见的做法是在linux16行末追加"rd.break"或直接修改成"init=/bin/bash",从而在不需要密码的情况下挂载根文件系统并获得root shell。单用户模式(即恢复模式)本身就是一个预设的、几乎不设防的root通道。如果这两个入口不设防,那么再复杂的系统密码策略也形同虚设。因此,从启动层面进行加固,是纵深防御中至关重要的一环。
第一步:为GRUB2菜单生成PBKDF2加密密码
CentOS 7及以上版本使用GRUB2,它支持更安全的PBKDF2加密哈希。首先,我们需要在终端中生成加密后的密码。执行命令
grub2-mkpasswd-pbkdf2
系统会提示你输入两次想要设置的明文密码。输入后,命令会输出类似“grub.pbkdf2.sha512.10000.长串字符”的密文。请完整地复制这串密文,它就是你GRUB密码的加密形态,下一步会用到。
第二步:编辑GRUB2自定义配置文件
GRUB2的配置不建议直接修改主配置文件,而是通过自定义文件来添加密码。使用root权限打开编辑器:
vim /etc/grub.d/40_custom
在文件末尾,添加以下内容:
set superusers="root" password_pbkdf2 root grub.pbkdf2.sha512.10000.这里替换为上一步生成的完整密文
这里,我们设置了超级用户为"root",并为其绑定了加密密码。保存并退出文件。
第三步:更新GRUB配置并验证
修改完成后,必须运行命令来更新/boot/grub2/grub.cfg文件:
grub2-mkconfig -o /boot/grub2/grub.cfg
现在,重启系统。当GRUB菜单出现时,尝试按'e'键去编辑启动项。你会发现,系统会立即提示你输入用户名和密码。此时输入用户名"root"和你之前设置的明文密码,才能进入编辑模式。这证明GRUB菜单密码保护已经生效。
第四步:彻底禁用单用户模式入口
仅仅给GRUB加密码还不够,因为CentOS默认的GRUB菜单中有一个“CentOS Linux (X.X.X-XX.el7) 恢复模式”的选项,这个选项通常会直接引导至单用户环境。我们需要禁用这个自动生成的恢复入口。编辑文件:
vim /etc/default/grub
找到并确保存在这一行:
GRUB_DISABLE_RECOVERY="true"
如果不存在,就手动添加。保存后,再次运行
grub2-mkconfig -o /boot/grub2/grub.cfg
来重新生成配置。重启后,你会发现恢复模式的菜单项消失了。
第五步:加固单用户模式本身(内核参数锁定)
一个更深层次的加固是防止攻击者在通过GRUB密码验证后,依然在启动参数里追加“single”、“1”、“s”或“init=/bin/sh”等参数来进入单用户状态。这可以通过在GRUB配置中锁定内核参数来实现。再次编辑
vim /etc/grub.d/40_custom
文件,在之前添加的密码行下面,可以加入对特定引导项的约束。例如,为默认的CentOS引导项设置密码保护:
menuentry 'CentOS Linux (3.10.0-1160.el7.x86_64) 7.9' --unrestricted {
set root='hd0,msdos1'
linux16 /vmlinuz-3.10.0-1160.el7.x86_64 root=/dev/mapper/centos-root ro crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet
initrd16 /initramfs-3.10.0-1160.el7.x86_64.img
}但更有效的方法是,在全局或特定菜单项中,通过GRUB命令限制对内核参数的修改。不过,标准GRUB2的灵活配置较为复杂。更常见的生产环境做法是结合BIOS/UEFI固件密码和全盘加密(LUKS),从硬件层面杜绝此类攻击。
潜在问题与故障排除
1. 忘记GRUB密码:这是最棘手的情况。如果服务器是物理机,且没有启用全盘加密,可以通过使用Live CD启动,挂载根分区,然后chroot进去修改/etc/grub.d/40_custom文件或直接删除密码行来重置。这反过来强调了物理安全的重要性。
2. 更新内核后密码失效:每次通过yum更新内核后,系统会自动运行grub2-mkconfig。只要你的/etc/grub.d/40_custom文件没有被改动,并且/etc/default/grub中的GRUB_DISABLE_RECOVERY设置保持为"true",新生成的配置就会自动包含密码并禁用恢复模式,无需额外操作。
3. 远程管理场景:对于云服务器或KVM虚拟机,控制台访问等同于“物理访问”。因此,云上的CentOS实例同样面临此风险,实施上述GRUB密码保护至关重要。
超越GRUB:纵深防御策略建议
给GRUB加密只是服务器安全加固的一个起点。一个完整的启动链安全方案应该是多层次的:
1. 固件层:为服务器设置BIOS/UEFI密码,防止从其他设备启动。
2. 引导层:即本文所述的GRUB密码与单用户模式禁用。
3. 磁盘层:对包含敏感数据的系统,启用LUKS全盘加密。即使攻击者能引导Live系统,也无法读取数据。
4. 系统层:使用强密码策略、定期更新、配置SELinux、设置完善的防火墙规则。
5. 监控层:配置审计规则(如auditd),监控对/boot/grub2/目录下配置文件的任何修改尝试,以及系统的非常规重启事件。
总结来说,保护CentOS的GRUB和单用户模式,是一个通过配置密码、禁用默认恢复入口来实现的关键操作。它堵住了从系统启动环节入侵的最直接路径。操作本身不复杂,但意义重大,应该成为每一台暴露于潜在物理或控制台访问风险下的CentOS服务器的标准配置。记住,安全是一个链条,GRUB密码是其中坚实的一环。
