前言
根据我目前测试的情况来看,这个问题的答案是【确实可以为所欲为】,事情的起因是这样的,一次偶然的机会我发现Ubuntu20.04系统上通过 sudo apt install mysql-server
命令安装的MySQL服务器,使用root账号登录无论输入什么密码都可以成功进入,多次尝试后才知道原来root用户默认没有密码,这可是让我惊呆了,居然还可以这样,为了服务器的安全,我必须给他设置个密码,在不断尝试的过程中引发了标题中的疑问。
修改root密码
修改MySQL用户root密码在网络上充斥着各种各样的版本,最常见的这种在MySQL8.0中已经不生效了,错误示例如下:
UPDATE user SET authentication_string = PASSWORD('iL1jfLqUSfmTECXRi4nO') WHERE User = 'root';
目前测试在MySQL8.0版本中可行的设置root密码的方式为:
USE mysql;
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'iL1jfLqUSfmTECXRi4nO';
FLUSH PRIVILEGES;
产生疑问
root用户的密码是设置好了,这么长的密码估计破解个几年也破解不开,但是我发现安装完毕提示了这样一样配置文件 /etc/mysql/debian.cnf
,打开文件内容展示如下:
# Automatically generated for Debian scripts. DO NOT TOUCH!
[client]
host = localhost
user = debian-sys-maint
password = xg9vyvjNly3vUSsm
socket = /var/run/mysqld/mysqld.sock
[mysql_upgrade]
host = localhost
user = debian-sys-maint
password = xg9vyvjNly3vUSsm
socket = /var/run/mysqld/mysqld.sock
居然是一个包含了MySQL用户和密码的未加密的文本文件,这不是在大门口的脚垫底下放上了大门的钥匙吗?关键这个debian-sys-maint虽然设计上是用于数据库维护和管理,但权限上与root几乎相同,通常在 Debian 或基于 Debian 的 Linux 发行版比如Ununtu上安装MySQL就会自动生成这个文件,看起来有点不安全啊?
于是查了相关的处理方法,都说要控制这个文件的权限,只让系统root用户可以访问它,这时我就产生了疑问,这样做安全吗?如果系统root用户被窃取了呢?那是不是完全可以通过这个文件来操控MySQL数据了,答案是很显然的。
渐渐明白
虽然说掌握了root用户就可以任意修改MySQL数据让人难以接受,但是换个角度或许就可以释然了,root可是系统里的上帝啊,控制了root用户可以任意执行 rm -rf /*
,如果你知道银行卡密码当然就可以从取款机里取钱,对于操作系统也是一样,既然你是root你就掌控了这个系统里的一切。
即便没有这个/etc/mysql/debian.cnf
文件,root用户还可以先关闭MySQL服务,然后通过 sudo mysqld_safe --skip-grant-tables &
以跳过授权表的方式启动MySQL,此时允许你在不知道密码的情况下以 root 身份登录 MySQL,这还有什么隐私可言。再换种方式,作为root用户的我从磁盘上把MySQL存储的文件拿到其他MySQL服务器上都是可以的,所以你是防不住root上帝的。
所以刚刚那个【大门口的脚垫底下放上了大门的钥匙】的比喻不太恰当,应该是/etc/mysql/debian.cnf
就像屋里的桌子上摆着的保险柜的钥匙,而你要保证大门的钥匙(root密码)不要轻易被人搞到手,像 --skip-grant-tables
这种看起来很像是后门,或者叫应急开关,实际上它的设计就是为了提供一种紧急的修复机制,用于在丧失所有密码或无法登录到 MySQL 数据库时进行数据库恢复和修复,比如紧急恢复、密码重置、修复数据库权限等等
这种设计就像是各司其职,我只负责我数据的管理与权限的分配,而用户需要保证系统很牢固,一旦你的系统被攻破我将束手就擒,做的再多也是徒劳。
总结
- MySQL8.0修改密码的方式
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'xxx';
- 文件
/etc/mysql/debian.cnf
是Debian系列系统上安装MySQL时自动生成的,其中的用户用于用于数据库维护和管理 - 如果忘了MySQL中root用户的密码可以通过
sudo mysqld_safe --skip-grant-tables &
启动服务来进行免密登录 - 控制了系统的root用户,你就掌控了操作系统的一切
假期归来又看了很多,也不安分了许多,或许只有通过打破常规才能获得额外的收益,否则只能是一直保持饿不死的状态