有许多原因可能导致用户口令的遗失,这对系统管理员而言,可能不是一个问题,只要以Root账号登录,再用Passwd命令更改用户口令就可以了。可是,如果丢失的是Root口令,这又怎么办?难道就束手无策、重装系统?这样不仅费时费力,而且还可能造成重要数据的丢失和应用程序的破坏。显然这种做法并不可取。
其实,恢复Linux口令并不是一件很难的事情。Linux口令的恢复有2个方面: 一是给用户产生一个新的口令,使用户能够重新登录系统; 二是找出用户原来的口令,而不是以新口令代替旧口令。一般情况下,用户只希望能够再次登录进入系统即可,而不是获得原口令,也就是这里所说的第一个方面,相对而言,这方面要容易实现得多。
Linux口令的恢复是系统维护的一种典型情况,本文中提到的一些方法从系统维护的角度出发,不仅适用于Linux口令的恢复,也适用于因为某些原因不能正常登录进系统时的维护工作,对Linux系统的管理维护有参考作用。
本文中所有提到的恢复Linux口令的方法均在实践中测试通过,所用的Linux系统主要是RedHat Linux For x86,在实际口令恢复中,可能因Linux发行商、发行版本、处理器和硬盘等的不同而略有不同,但相差不会很大。其中一些方法也适用于其他Unix系统口令的恢复,甚至Windows等操作系统口令的恢复。
一、口令恢复途径
下面恢复Linux口令的途径适用于不同的情况,难易度各有不同。
1. 紧急修复模式
在无法启动Linux时,常常需要通过磁盘、光盘或其他方法启动Linux基本环境,进入Linux紧急修复模式。在紧急修复模式下,能够访问硬盘上的Linux系统文件,恢复系统正常,包括恢复口令等。
2. 单用户模式
Linux有多个运行级别,如单用户模式、无网络服务多用户模式、完全多用户模式和X11图形多用户模式等运行级别。单用户模式是指系统运行在惟一用户——Root用户模式下,进入此模式时,系统只是加载了可运行的最低软硬件配置,以Root直接进入,没有口令验证。
在单用户模式下,可以用passwd命令来更改用户口令,也可以直接对/etc/passwd等账户口令文件进行读写,达到口令恢复的目的。
3. 修改口令文件
Linux口令文件有2种保存形式: 一种是把账户信息和经加密后的口令密文都保存在/etc/passwd文件中,此形式不够安全,在早期Unix中采用;另一种是把账户信息和口令密文分开存放,/etc/passwd文件用于保存账户信息,/etc/shadow文件用于保存口令密文。至于采用何种保存形式和加密算法,可以用/usr/sbin/authconfig程序来设置。
对于没有shadow的passwd文件,只要把相应账户的口令字段删除,即可不经口令验证直接登录系统,例如某passwd文件的root账户如下:
root:$1$dPTzzYkE$Zd3Vs6yCu
VH8RC1gwKXX01:0:0:root:/root:/bin/bash
将其修改为:
root::0:0:root:/root:/bin/bash
如果是有shadow的passwd文件,其口令字段以“x”字母代替,口令密文保存在Shadow文件中。可以删除passwd文件中的“x”字母,或者删除shadow文件中的口令密文,都可以使相应用户不经口令验证直接登录系统,达到口令恢复的目的。
4. 口令还原
有些情况下,想找出被丢失的原始口令,而不是登录系统去产生一个新的口令。但是,Linux使用的是DES(加密函数式是Crypt)或MD5(函数式是Md)加密算法,由于计算量之大,它们几乎都没有可能被逆向破解。DES口令密文是有13个ASCII字符的字符串,而MD5口令密文的启始字符总是“$1$”。
虽然很难逆向破解,但要通过口令密文找出原始口令也不是不可能的,从一个字典或一些字符的排列组合中提取字符串,提取出来的字符串用同样的加密算法加密,将产生的密文与口令密文比较,如果一致则表明该字符串即为原始口令,从而达到口令还原的目的。如果口令很复杂,使用此种方法也是很难找出原始口令的,但用户对自己口令的长度、采用的字符等会有大致的印象,这使得成功的可能性会更大。
破解Linux口令的工具有很多,如John the Ripper、Crack by Alex Muffett和Cracker Jack等等,其中John the Ripper的功能最为强大,速度也最快。
5. 系统攻击破解
如果能够关闭电源重新启动系统,那么很容易恢复口令,但有时Linux系统上运行着非常重要的服务,不能直接关闭电源,否则会对系统和数据产生破坏。
像这种在系统运行的情况下获得系统口令,往往是比较困难的,但由于系统管理员对操作系统和应用程序的版本、配置等情况有着全面的了解,加上没有防火墙和入侵检测系统等的防护,那么发现和利用系统漏洞的机会还是不少的,口令恢复的成功机会还是有的。
这方面涉及的内容太复杂,在此就不多做介绍了。如果确有这方面的需求,最好由专业人士来帮忙,以免破坏系统和数据。
二、如何进入紧急修复模式
由于软硬件故障、错误配置等多种原因无法启动Linux时,需要进入紧急修复模式,有可能解决问题,至少也能拷出重要文件。
进入紧急修复模式的方法并不复杂,在boot提示符下输入如下参数:
boot: linux rescue
通过如下方法可以得到Boot提示符。
用Linux随盘发行的或由boot.img文件写成的安装引导软盘引导系统,通常这需要紧急修复盘或安装光盘或者硬盘上的ISO文件配合使用才能引导进入紧急修复模式。紧急修复盘可由rescue.img文件写成或随盘发行。在RedHat Linux 6.1以后,RedHat不再提供紧急修复盘(安装光盘image目录下也没有rescue.img文件用来写),而是把它直接做在安装光盘上。
用安装光盘引导系统。
用bootnet.img文件写成的网络引导盘或pcmcia.img文件写成的PCMCIA引导盘引导系统,此方法先要确保网络连接正常,并且需要确定网络主机和传输类型。
RedHat Linux 7.2及其以后的版本,可以选择是否要把安装在硬盘上的Linux自动尝试加载到目录/mnt/sysimage下,否则,要用mount命令手工加载。
简单几步,就进入了紧急修复模式。提示符呈现在虚拟控制台VC 1和VC 2上,以便运行命令维护系统。用Ctrl+Alt+F1键切换到VC1,用Ctrl+Alt+F2键切换到VC 2。
如果选择了自动加载,用chroot命令,使当前操作环境变为欲修复的Linux,之后可用passwd命令直接更改用户口令:
bash#chroot /mnt/sysimage
如果没有自动加载,就需运行mount命令加载Linux分区,并输入如下命令:
bash#mount -t ext3 /dev/hda5 /foo
目录/foo是由用户自己创建的,/dev/hda5是我们欲加载的Linux分区,如果分区类型是ext2,那上面命令行中就以ext2代替ext3。
至此,就可以用chmod、vi、fsck等命令读写文件、维护系统,包括修复口令。
三、如何进入单用户模式
与紧急修复模式只能加载本机Linux上的文件系统不同,单用户模式是在本机Linux内核引导启动后进入的一个运行级别(运行级别是1),可以做内核升级、设备安装等维护工作。在系统维护时,系统管理员往往要进入单用户模式来维护系统,进入紧急修复模式是在Linux不能启动时不得已而采用的系统维护方法。
Linux内核自行启动之后,通过启动程序init来完成自己的引导过程,所以,init进程始终是第一个进程,进程编号始终为1。Init程序有着许多重要的职责,如启动Getty、实施运行级别和调用子进程等,是Linux系统中必不可少的程序之一。
下面提到的进入单用户模式的方法,实质都是向init程序请求运行级别1,达到进入单用户模式的目的。
1.Init程序
系统正在运行时,在命令行上用程序Init可以更改运行级别(/sbin/telinit只是程序Init的符号链接,同样可以使用),进入单用户模式用如下命令:
#init 1
因为是在一个正在运行的系统上,且只有Root用户才有权限执行Init命令,所以此种方式虽然在系统维护时经常用到,但对口令恢复的意义不大。
操作方法:在进入grub引导界面时,请输入e,再选中第2行输入e,在最后输入1
使用单用户级别。回车 按b,进入单用户模式,然后再改配置文件
2. 修改默认运行级别
/etc/inittab文件是系统运行级别的配置文件,每当启动init进程时,init程序都会读取/etc/inittab文件中的相应配置并运行。
在Linux系统启动时,/etc/inittab文件中有如下一行指定了默认的运行级别,通常的运行级别是3或5。
id:3:initdefault:
要使系统启动后进入单用户模式,只要把上面一行中的3改为1就可以了。
id:1:initdefault:
3. 启动盘引导
在Linux系统启动时,Init读取/etc/inittab配置进入默认运行级别,但也可以为内核指定一个启动参数,内核将依此参数设定特定设备和环境变量等,对于不能接受解释的参数将传递给内核启动后的第一个程序,即Init程序,Init程序据此参数启动进入非默认运行级别,如指定参数为1或single进入运行级别1,即单用户模式。内核启动参数的指定可通过在系统启动软盘、多重启动管理器或程序Loadlin等的执行过程中指定。
在系统维护或内核更新时,常用到当前Linux系统的启动盘,在系统安装时会提示用户制作一张启动盘,在系统安装完成后也可以制作,下面是一个简单示例。
在软驱中放入软盘,用uname命令查看系统内核版本号,然后用Mkbootdisk命令创建引导盘,输入的命令如下:
#uname –r
2.4.7-10
#mkbootdisk –device /dev/fd0 2.4.7-10
以启动盘引导,在boot提示符下以“linux ”的语法形式输入如下参数之一,即可引导进入单用户模式如下:
boot: linux 1
boot: linux single
4. 多重启动管理器
多重启动管理器是一个能在系统启动时用来选择加载某个操作系统的引导程序,它可以载入操作系统的内核和初始化操作系统(如Linux或FreeBSD),或者把引导权交给操作系统(如DOS或Windows)来完成引导。Intel兼容PC机上的多重启动管理器有LILO和GRUB等,Alpha PC机上使用MILO,Sparc兼容的工作站是用SILO。
在多重启动管理器中为Linux内核指定启动参数引导进入单用户模式。以Intel兼容PC机上的Linux为例,如果安装的是LILO,在LILO引导画面,按Ctrl+X键切换入命令行,在LILO提示符下输入与启动盘引导Boot提示符下相同的参数之一,即可引导进入单用户模式:
在RedHat Linux 7.2以后,多重启动管理器开始用GRUB代替LILO,它比LILO具有更多的优势,是LILO的替代品。下面是GRUB引导进入单用户模式的过程。
在出现GRUB引导画面时,按字母e键,进入GRUB编辑状态。
按↑键或↓键选择相应的引导项,并再接字母e键进入命令行编辑。
在出现的命令行上添加“1”或single,并按键,返回GRUB编辑状态。
按字母b键,引导进入单用户模式。
从上可以看出多重启动管理器对Linux系统启动和维护的重要性,所以建议在安装Linux时也安装好多重启动管理器,便于将来系统的维护,哪怕是主机上只安装了Linux一个操作系统。
5. loadlin引导
loadlin是一个能在DOS下启动Linux核心的装载程序,可从DOS引导进入Linux或安装Linux系统等。如果没有安装多重启动管理器或者配置有误不能进入Linux的话,常常会用到这个程序。
在loadlin的启动命令中添加single参数就可以进入单用户模式。如果主机上安装有Windows 9x系统,在系统启动时按F8进入MS-DOS,运行loadlin程序引导进入单用户模式。下面是一次启动实例,该主机上没有安装Windows 9x,也没有安装DOS。
以Windows 98安装光盘引导启动,在“Microsoft Windows 98 Startup Menu”上选择第2项:“start computer with CD-ROM support.”。
进入MS-DOS后,在光驱中换入RedHat Linux安装光盘。
在命令行上分别输入如下命令引导Linux单用户模式,假设Linux根文件系统在分区/dev/hda5上:
A:>d:
D:>cd dosutils
D:DOSUTILS>loadlin autobootvmlinuz root=/dev/hda5 ro single
在启动盘引导的boot提示符下,在LILO和GRUB等启动管理器的命令行下,以及在Loadlin程序上都可以配置很多参数引导进入系统,对系统维护很重要,可以参考BootPrompt-HowTo。
上面提到的方法,都需要对/etc/passwd、/etc/inittab等Linux文件进行读写,但在正常情况,只有root用户登录进去才可以读写。那么在不能正常登录进系统时,又如何能对这些文件进行读写呢?
除了可以在紧急修复模式、单用户模式下读写Linux文件外,采用下面的方法也不失为良策:
通过Linux系统软盘引导启动,就能进入Linux系统;
通过Linux系统光盘进入,如DemoLinux;
在DOS/Windows下读写Linux文件,几乎所有版本的DOS/Windows都不提供对Linux文件系统的支持,但借助不少软件可以实现,如FSDext2、Ext2fsnt、Ext2ifs、Ext2 tools、Ltools和Explore2fs等,还有Microsoft IFS Kit; 通过第二硬盘。
上面提到的种种Linux口令恢复方法,读者可以结合自己的实际情况,选择一种最简单易行的方法来恢复自己的Linux口令。从中可以看出,他人通过在本地重启系统很容易获取Linux口令,所以为了加强系统安全,有必要在启动管理器(如LILO和GRUB)及BIOS中设置口令,使他人不能轻易得逞,更重要的是加强安全管理工作。