ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

麒麟信安系统Root密码失效?GRUB重置全流程实战

麒麟信安系统Root密码失效?GRUB重置全流程实战 机房值班手册里写得最多的永远是那一句root密码不能丢。但现实往往讽刺项目交接、离职人员、密码过期策略总有一个理由让你在某个下午站在终端前试遍自己习惯的组合都进不去。这周我就被一台麒麟信安系统的机器卡了近四十分钟最后虽然用老办法救回来但过程里确实踩了几个和 CentOS/RHEL 不太一样的坑。这里把完整的解决过程整理出来给同样面对“麒麟信安系统 root 密码失效”的运维朋友做个参考。先说结论麒麟信安虽然基于 Linux 内核体系结构上兼容主流 RPM 系生态但它在引导流程、SELinux 策略和 systemd 处理上都做过定制网上那些针对 Ubuntu 的 liveCD 修改法在这里行不通最可靠的是通过 GRUB 引导参数进入紧急模式重置。整个过程不需要额外工具、不需要 U 盘启动盘只要你还能物理接触这台机器就能在五分钟内把密码改回来。1. 先说清场景哪些情况需要动 GRUB哪些其实不用很多朋友一上来就直奔“改内核参数”这条路但这一步是有前提的。咱们先梳理一下麒麟信安系统 root 密码进不去通常分成三类第一类是密码明文还记得只是登录时提示密码过期。这类根本不需要重启机器用当前密码登录进去之后配合chage命令延长时间或者直接重设就好。我见过不少同事在这上面栽跟头——密码明明是对的系统却强制要求修改后才能继续会话于是误以为“密码失效了”直接跑去改引导参数白白增加风险。第二类是系统里配置了 SSH 密钥登录而 root 的密码在外部被改过、谁也不知道。这种只要你是管理员能从其他机器用密钥登进去也不需要走 GRUB。进去之后一条passwd root就能解决。第三类才是真正意义上的“所有登录方式都断掉”—— SSH 没开启、本地 console 密码也不知道、kickstart 里设的初始密码又被人改过。只有这种情况下才需要进入单用户模式或者用rd.break去重置。下面的内容主要针对第三类场景来展开。注意判断自己属于哪类场景时顺便检查一下是不是有人为修改过 PAM 配置或/etc/shadow权限。如果是因为/etc/shadow的权限异常导致认证失败走的又是另一条排查思路别一上来就重置密码。还有一点要提前确认你机器上有没有启用磁盘加密LUKS。如果/boot或者根分区是加密的进入 GRUB 之后还会要求输入解密短语这个密钥如果也丢了那就不属于“重置 root 密码”的范畴而是“恢复加密盘”的问题复杂度和风险完全不在一个量级。2. 实操前置准备改引导参数前必须懂的几件事在动手之前我把原理简单捋一下你理解了之后遇到变体就不会慌。GRUB 引导时会读取/boot/grub2/grub.cfg里的菜单配置然后按你指定的参数把内核加载起来。正常启动时内核会挂载根文件系统并交给 systemd 执行默认 target而我们需要做的是在内核参数里加入特殊指令让它跳过部分初始化步骤直接进入一个以 root 权限运行的 shell。麒麟信安系统在启动菜单上保留了标准 GRUB 界面但有个细节它的菜单项可能叫“KylinSec Linux...”而不是通用的“CentOS Linux”。另外某些定制版本默认隐藏了菜单、倒计时极短需要开机瞬间不断按上下方向键调出菜单。具体操作路径是这样的开机进入 GRUB 界面后选中要启动的内核行按下e键进入编辑模式。找到以linux开头、包含vmlinuz的那一行——这行后面跟的是内核启动参数——移动光标到这一行的行尾按空格后追加目标参数再按Ctrlx或F10启动。整个过程和主流发行版没有本质差别。但这里有几个麒麟信安特有的坑要注意有的版本在 GRUB 菜单前会先加载自己的安全引导模块你按e进入编辑模式后需要先验证管理员口令。这个口令和 root 口令不同通常在首次安装系统时单独设置。如果你完全没印象可以尝试常见的默认值但没有把握就不要乱试太多次有些实现会触发防暴力机制。编辑界面里内核参数是以多行换行的形式展示的屏幕可能不够宽这时追参数不是看行尾在哪而是要看内核行的实际末尾字符。建议用方向键直接到行末不要盲目往里敲可能插到中间导致参数失效。如果机器上存在多个内核版本优先选择默认启动项对应的那个内核。有的同事喜欢挑“救援模式”菜单项结果按e之后发现它不是我们熟悉的参数行反而绕弯子。关于“单用户模式”和“rd.break”我在实际维护中分别用过很多次结论是在麒麟信安上优先级最高的方案是rd.break因为它在更早的阶段切入几乎不受 SELinux、systemd 之类组件后续初始化的影响single/1参数在部分版本上也能用但有时会被策略限制或者登录后 shell 环境异常。下表是两者的核心区别对比项rd.breaksingle单用户模式切入阶段initramfs 阶段切换根之前内核启动完成systemd 早期根文件系统挂载已挂载到 /sysroot通常可直接访问根目录SELinux 影响需要在重置后手动处理标签同样需要处理情况稍复杂适用系统麒麟信安全版本基本可以部分版本受 systemd 配置影响操作难度略低步骤固定略高环境状态受初始 ramdisk 影响下面两节就分别把两条路径的完整流程写清楚。我个人强烈建议优先看rd.break这条本文标题说的“麒麟信安系统忘记root密码解决说明”核心方案其实就这一套。3. 方式一rd.break 参数完整实操麒麟信安下最稳的方案3.1 进入 GRUB 并定位启动项先重启机器在 BIOS 自检过后注意观察屏幕。如果 GRUB 菜单正常显示直接选中默认启动项按e。如果屏幕直接进系统了说明菜单被隐藏需要在开机后立刻按住Shift较新的 GRUB或者快速连点方向键逼它显示菜单。进入编辑模式后你会看到类似这样的片段load_video set gfxpayloadkeep insmod gzio linux /boot/vmlinuz-4.19.90-... rootUUID... ro crashkernelauto ...注意这里内核行的开头可能是linuxefiUEFI 引导时常见不要慌两者作用一样。我们要做的是在这行末尾追加参数。移动光标到该行结尾输入rd.break按Ctrlx启动。系统会走一段初始化流程最终停在一个类似下面的 shell 提示符Generating /run/initramfs/rdsosreport.txt Entering emergency mode. Exit the shell to continue. Type journalctl to view system logs. You might want to save /run/initramfs/rdsosreport.txt to a USB stick ...看到switch_root:相关提示之前系统会暂停此时你已经拥有了 root 权限的 shell只不过根目录还在 initramfs 环境下真实根分区被挂载在/sysroot。3.2 重置密码的完整命令序列站到这一步后面的操作就是固定的“四板斧”。我先把完整命令列出来再逐条解释。输入时注意大小写Linux 是区分大小写的mount -o remount,rw /sysroot chroot /sysroot passwd root touch /.autolabel exit exit第一条命令mount -o remount,rw /sysroot的作用是让根分区以可写方式重新挂载。默认情况下为了数据安全initramfs 阶段挂载根分区时是只读的你直接chroot进去也是只读执行passwd会报“只读文件系统”错误。这里走的一步是整个流程成败的关键。第二条chroot /sysroot把当前 shell 的根目录切换到真实系统。注意执行完之后你的工作目录和命令执行环境就变成了麒麟信安的真实文件系统此时passwd root修改的就是真实系统里的/etc/shadow而不是临时 initramfs 里的占位文件。这一步如果漏了密码基本白设。第三条passwd root就是标准的重置口令命令。系统会让你输入两次新密码输入时屏幕上没有任何回显不显示星号这是个正常现象。密码设置上有几点硬性建议长度不要低于 12 位最好包含大小写、数字和特殊字符不要用123456、root、toor、机器名等容易猜到的组合也不要和旧密码有相似度太高的重复部分。麒麟信安的 PAM 策略里默认启用了pam_pwquality.so如果新密码强度不足命令会报错并要求重新输入。第四条touch /.autolabel是在真实根目录下创建一个标记文件目的是让系统下次启动时自动重新标记 SELinux 文件上下文。为什么要这个操作因为我们是在 initramfs 阶段直接改/etc/shadow新生成的文件可能没有正确的 SELinux 标签若系统处于 Enforcing 模式启动后可能出现无法登录或部分服务无法启动的诡异症状。做一次 re-label 可以避免后续麻烦。最后连续输入两次exit第一次退出 chroot 环境第二次退出 initramfs 的紧急 shell。系统会继续完成启动过程过程中可能会因为 relabel 需要格外的等待时间这时千万不要硬重启耐心看着它把文件标签刷完。3.3 重新登录后必须做的校验工作机器正常起来之后用新密码尝试登录。登录成功后别急着收工先跑几个命令确认系统状态id getenforce chage -l root systemctl status sshd --no-pagerid确认当前用户确实是 rootgetenforce看 SELinux 是 Enforcing 还是 Permissive如果启动时有 re-label 过看到的应该是 Enforcing 且所有服务正常chage -l root查看 root 密码的过期时间这一步很关键我见过不少人重设密码后过几天又被“密码过期”坑一次systemctl status sshd则是确认 SSH 服务正常监听以免你关了终端之后才发现远程登录不了。这里多说一句chage -l root的检查结果是很多人忽略的重要参数。麒麟信安默认在/etc/login.defs里配置了密码有效期如果显示Password expires不是 never说明系统里有自动策略在驱动密码周期你需要根据安全基线决定是否手动调整。如果只希望这次重置生效且不想被“过期”困扰可以执行chage -M 99999 root chage -E -1 root-M 99999表示密码最长使用期限放宽到几乎不限制-E -1表示账号永不过期。有些安全加固规范要求定期改密这种场景下就别执行这两条按你们自己的密码策略来就好。4. 方式二单用户模式single完整流程与适用场景4.1 为什么部分机器上 single 也可行rd.break虽然稳但有一个使用前提initramfs 要能正常加载并执行。如果你之前手动改过/etc/dracut.conf或者系统用的是旧版 mkinitrd 生成的 initramfsrd.break有可能不生效。这种时候可以退而求其次用传统的内核参数single或1直接进入单用户模式。麒麟信安的 systemd 环境下single对应的是rescue.target它启动时会挂载根文件系统、加载基本服务最后给出一个 root shell。比rd.break更接近“正常系统”但前提条件是根文件系统能够正常挂载如果磁盘本身有问题这条路也走不通。4.2 单用户模式操作细节操作的前半段和rd.break一样GRUB 界面按e在内核参数行尾追加参数。这里建议直接加single。加1在某些老内核里同样是单用户模式但有的实现里1会被当作命令行参数传给 init触发逻辑略有差异。追加完成后按Ctrlx启动系统会打印一堆启动信息最后出现类似这样的提示Welcome to emergency mode, type root to enter输入root回车进入 shell。这一步是和 Ubuntu 单用户模式最大的不同——Ubuntu 默认是直接进入 root shell 的而麒麟信安需要手动输入用户名。有的同事在这里卡住以为是系统没启动成功。进入 shell 后执行mount -o remount,rw / passwd root如果系统启用了 SELinux同样建议在重置密码后处理一下上下文touch /.autolabel然后直接执行reboot -f或者其他你熟悉的重启方式。启动后同样跑一遍上一小节里提到的校验命令。4.3 单用户模式里最坑的几个细节如果你在内核参数里只写了single而没有同步把根文件系统挂载参数从ro改成rw进入 shell 后根分区是只读的passwd绝对会失败。有些教程会让你同时把ro改成rw这确实是更保险的做法因为有些单用户模式的实现不会自动 remount。单用户模式退出时如果用exit而不是reboot系统会继续执行后面的启动 target。如果你刚才是在只读状态下跳过了一些步骤继续启动可能会进入奇怪的依赖错误所以我建议操作完直接reboot -f重启干净利落。不要试图在单用户模式里用passwd命令时指定参数比如passwd -d root。-d是删除密码会让 root 变成无密码状态这在生产机器上是极大的安全隐患有的版本还会进一步拒绝 SSH 登录。单用户模式下网络服务默认不会启动这不是故障别花时间在里头折腾网络。实际使用中我遇到的情况大多是rd.break走不通比如自定义过 initramfs、或者机器有特殊存储设备需要在真实系统环境下才认得到盘才转用single。常规场景直接背rd.break那套流程就够了。5. 密码过期与策略导致的问题重置后要一起解决5.1 密码过期提示的处理前面提到过很多“忘记密码”其实是“密码过期”的乌龙。但你通过重置流程改完密码后也可能会遇到一个更隐蔽的问题——系统提示密码已过期要求立即修改而你明明刚设置了新密码。这种情况多半是因为 root 账号的失效日期或最大使用期限被设置了具体数值。登录后马上执行chage -l root看输出中的几项Last password change、Password expires、Account expires。如果Password expires不是never说明系统安全策略里启用了强制周期比如 90 天改一次密码。处理方式有两种一是按策略重新设置一个符合策略的新密码把有效期从当天重新计算二是如果这台机器运行着自动化脚本或服务账号宁可让密码长期有效那就执行passwd -x -1 root passwd -w -1 root-x -1去掉最大使用期限-w -1去掉警告天数。这样以后不会再收到“密码即将过期”的骚扰。这里要强调一下修改密码策略参数属于系统安全加固的范畴如果你的麒麟信安机器接入了等保合规要求随意取消有效期可能会在审计里出问题。需要结合自身场景决定不要只看运维方便。5.2 passwd 命令因强度不足直接拒绝另一个高发问题是你在rd.break环境里执行passwd root设置一个自认为足够复杂的密码结果系统还是不接受提示类似Bad password: too simple原因有几种可能。一是 PAM 的pam_pwquality.so配置里minlen值设得非常高二是你输入的新密码与旧密码相似度太高三是某些定制版本启用了pam_passwdqc.so它有独立的复杂度算法。解决的思路不是绕过密码策略而是设置一个真正强壮的密码。建议长度至少 16 位且包含生僻字符组合比如G7#k2pQ!vN9xLm4这样一类密码不管策略怎么审查都基本能过。不要为了图省事去修改/etc/security/pwquality.conf把策略关掉尤其在生产环境里这属于拆除安全基础防护。如果确实因为内部流程需要临时设置弱密码在正常启动的系统里可以用chpasswd加echo方式绕过交互式检查的部分环节但那只建议在隔离的临时环境里使用生产机器还是老老实实遵守策略为妙。5.3 重置之后 SSH 登录仍被拒这个坑我踩过不止一次。密码通过 console 登录成功了但远程 SSH 始终提示密码错误。排查起来不复杂通常三个原因第一/etc/ssh/sshd_config里配置了PermitRootLogin no。这种场景下你虽然重置了 root 密码但 SSH 根本不允许 root 直登需要改为yes或者用普通用户加 sudo 方式。改完重启 sshd。第二防火墙规则。麒麟信安可能启用了 firewalld 或 nftablesSSH 端口对你的来源 IP 没放行。检查一下 service 状态和端口监听情况。第三SELinux 布尔值限制。执行getsebool -a | grep ssh如果ssh_sysadm_login或ssh_root_login是 offSSH 相关策略会阻止 root 登录。临时调整可以用setsebool -P ... 1但要评估影响再操作。重置完密码后无论你通过哪种方式登录都要把 SSH 状态一并验证到位确保这台机器在你离开机房后还能正常工作。6. 常见问题与排查技巧实录我踩过的那几个坑整个操作流程并不复杂但细节决定成败。我把亲测过程中遇到的典型问题列成速查表你再遇到可以直接对号入座。现象可能原因解决办法编辑 GRUB 后按 Ctrlx 无反应键盘布局或 GRUB 版本问题确认光标焦点在内核行试着按 F10进入 shell 后根分区只读passwd 报错没有 remount rw执行mount -o remount,rw /sysrootrd.break或mount -o remount,rw /single设置新密码时报错 “Authentication token manipulation error”/etc/shadow 权限异常或根分区满检查挂载状态、磁盘空间df -h必要时 fsck重启后提示 SELinux 策略拒绝登录卡住未处理文件标签进入紧急模式后执行touch /.autolabel让系统重新标记并重启登录成功但 sudo 提示找不到命令PATH 环境异常直接执行/usr/bin/sudo或重新登录重置后系统时间跳变CMOS 电池故障或时间同步未启动查看timedatectl重新配置 chrony/NTP重启后 GRUB 菜单又不见无法再进编辑模式启动配置恢复默认隐藏修改/etc/default/grub中的GRUB_TIMEOUT重新生成 grub.cfg其中“SELinux 策略拒绝”是麒麟信安上最容易出岔子的环节。不少老运维在 CentOS 7 上习惯了关闭 SELinux到了麒麟信安上也没有主动确认状态。实际上麒麟信安的安全基座里 SELinux 通常是开启的而且强制模式比 RHEL 系默认的更严格。你重置密码后如果不做touch /.autolabel或者干脆把 SELinux 改成 disabled后续会遇到账号登录成功但很多系统调用被拒、容器跑不起来、NFS 挂载失败等一串连锁问题。另一个容易被忽略的坑是根分区空间满。重置密码需要写/etc/shadow如果根分区被日志或临时文件塞满passwd会失败提示写入错误。此时哪怕你已经 chroot 成功也没法正常修改。处理方案是进入单用户模式后先清理日志、/tmp下的临时文件腾出空间再改密码。我遇到过一次/var/log/journal占了几十个 G 的情况当时第一反应还以为是系统文件损坏后来才发现是日志分区没独立所致。另外如果在 initramfs 阶段执行passwd时发现系统时区、时间完全不对也会影响chage的到期计算。这种情况下先确认当前时间是否合理。如果差得离谱改完密码后务必同步系统时间不然后续审计日志里的时间戳会让你头大。关于fsck的使用时机也要有分寸。机器是因为忘记密码进入紧急模式而不是因为磁盘故障原则上不需要主动跑fsck。有些朋友习惯性在单用户模式下执行fsck -y /dev/...如果分区本身是干净的这条命令纯粹浪费时间如果分区能正常挂载但文件系统异常系统启动时自己已经报过错并常常自动修复。遇到真正的异常时你应该先看journalctl或启动日志而不是盲目fsck。在GRUB编辑阶段还有个细节如果你在追加参数时不小心手滑改了根分区 UUID 或删了某个参数启动就会掉进dracut的 rescue shell界面完全不同。这种情况不要慌输入journalctl或者直接重启重新编辑即可。只要启动项没被删除GRUB 总能恢复。操作全程最好把每一步在纸上记录下来尤其是你改了什么、原参数是什么。有些同事总觉得记住就行结果中途手机响了、被人一打断回来就忘记原始内容最后不得不重装系统那才是真正的灾难。从长期运维角度看这次重置密码成功后还有一个动作建议顺手做掉在/etc/ssh/下配置好 root 和普通用户的 SSH 公钥登录并把 sshd 里的密钥认证保留、密码认证按需启用。这样一来即使下一次密码策略出幺蛾子你依然有一条不需要知道密码的远程通道可以进系统。平时别熬夜修密码把时间花在配置信任链上比什么都值。最后再分享一个我个人的小习惯每次重装完系统、改完密码我会把密码放进公司密码管理平台的保险柜并在系统里把修改时间、操作人记到/root/.admin_note文件里。这个文件既不是明文密钥库也不依赖外部服务纯粹是一份给后来人的说明。这算不上什么尖端技术但在接手机器时真的能救命——你永远不会知道三年后接手这台机器的人是不是已经把密码跟上一任一起忘了。麒麟信安系统 forget root 密码这件事本质上就一条原则框架内的标准路径永远比硬闯更安全、更省事。理解 GRUB 参数的含义比死记任何教程都管用。你只要吃透rd.break这套原理不管以后换到哪款 RPM 系国产系统都是同一套思路。密码是门禁但门禁后面的钥匙始终在系统本身的设计里。
返回列表