之前初始化主机之后,以非root用户身份通过密钥来ssh登陆主机,然后在需要提权到root权限时,通过sudo或者su来执行。很不幸,root密码不知道怎么就找不到了,由于之前生成的是随机密码,完全记不住那个密码,于是有了这次的修改vps密码。
修改root密码
vultr的服务器信息中,我们可以在”Overview”那一栏看到root密码,然后再通过已知的root密码来修改root密码。但是我的实例在初始化的时候,使用的快照搭建的系统,导致vultr并不知道我的原密码,在”Overview”这一栏自然也无法获取root密码。
当忘记root密码之后,我们想要执行一些高权限的命令和操作就会受限,通过passwd
命令修改密码又需要root权限。是不是感觉进入了死循环,其实事情没那么复杂,在linux下修改root密码的方法其实有很多,下面来讲一下我知道的几种:
提权修改密码
之前提到,修改root密码需要root权限,但是忘记密码后,无法获取root权限。我们可以想办法提权,比如执行脚本通过漏洞提权,或者使用单用户模式来提权。这里只讲如何使用单用户模式来修改密码:
单用户模式(Single user mode),是在类Unix系统上工作时的一种拥有超级用户权限的模式。这个模式只在面对主机实体时才有机会通过引导菜单进入,也因此确保超级权限授予的对象是能接触到主机的超级用户。此操作通常用于维护硬盘分区或更改超级用户密码等需在磁盘挂载前操作的维护。
因为是vps主机,我们一般是远程访问,不可能接触到实体主机。但是一般主机服务商,都会提供网页端的控制台,其实就是直接访问主机,而不是远程访问。
-
点击服务器实例对应的”View Console”图标,进入网页端控制台。
-
点击网页右上角的”Send CtrlAltDel”按钮,发送重启指令给主机。
-
重启后按住键盘”ESC”按键,进入主机的”grub”控制台。
-
选择需要修改的系统(一般是第一个),按下键盘上的”E”按键来修改”grub启动项”。
-
找到系统内核那一行(一般是”linux 16”打头),将该行中的
ro
修改成rw init=/sysroot/bin/sh
。 -
按下键盘上”CTRL-X”或者”F10”按键,以单用户模式启动。
-
使用命令
chroot /sysroot
切换到系统目录,这时我们已经提权成功。 -
使用
passwd
来修改root密码,修改成后使用reboot -f
重启系统。至此,我们root密码就修改成功。
- 重新进入系统后需不需要将grub启动项修改回来?答案是不需要,因为在grub控制台的edit模式下,修改启动项只是临时修改,不会修改系统的grub启动配置,重启之后仍然读取硬盘上原有的grub启动项配置。
- 单用户模式是否不安全?答案是安全,因为只有接触到物理主机才能通过启动项进入单用户模式,如果能接触到物理主机,一切防护其实都不太安全,比如修改硬盘上文件内容。当然我们可以通过设置BIOS密码、grub密码来降低风险。
- 其实centos 6进入单用户模式更简单,只需要在启动项后加上”single”或者”1”即可实现(这个差异是由于init程序造成的)。更详细的信息可以参考vultr的官方文档: Access Single User Mode (Reset Root Password)
修改硬盘文件
在类UNIX系统中,/etc/passwd
记录着用户属性,/etc/shadow
与前者中的用户一一对应,里面保存着用户对应的密码信息。如果我们能访问到硬盘中/etc/shadow
文件,通过修改root用户那一行的值,我们就可以达到修改root密码的目的。
每一行的字段意义分别为: “ 用户名 : 加密口令 : 最后修改时间 : 最小时间间隔 : 最大时间间隔 : 警告时间 : 不活动时间 : 失效时间 : 标志“,使用符号:
分割,我们只需要将”加密口令”那个字段修改成我们想要的数据即可。
- 字段为空,说明没有密码
$6$
前缀表明是SHA-512加密,$1$
前缀表明是MD5加密,$2$
前缀表明是Blowfish加密,$5$
前缀表明是SHA-256加密
我们可以将”被使用的密码”按照我们想要的加密方式去加密,然后拼接上前缀,直接替换root用户那一行的”加密口令”字段即可。
或者使用更简单的一种办法,在另一台机器上已知密码的/etc/shadow
字段复制过去。
生成随机密码
linux上有很多生成随机密码的工具,比如mkpasswd
、pwmake
、pwgen
以及gpg
等。考虑到主机系统自带的,我只讲一下pwmake
和gpg
的使用:
## 使用pwmake [密码位数]
pwmake 10
## 使用gpg
## --gen-random 生成随机字节序列
## --armor 保证以base64编码输出
gpg --gen-random --armor 1 12
更多的密码生成方法,可以在 八种在 Linux 上生成随机密码的方法 这篇文章深入了解。