前言:
此刻朋友们对“mysql安全性如何”可能比较关心,你们都需要剖析一些“mysql安全性如何”的相关内容。那么小编在网络上收集了一些对于“mysql安全性如何””的相关文章,希望看官们能喜欢,各位老铁们一起来了解一下吧!在大多数情况下,MySQL密码说明提供了有关在生产系统上更改MySQL用户密码的信息(例如,重置root密码而不重启)。出于安全原因,甚至建议定期更改密码。但是,有时,旧系统上的DBA职责仍然令人感到意外,您需要为某些老用户恢复原始密码。
这没有什么难的:只要仅存储散列而不存储原始密码,恢复丢失的密码的唯一方法就是从已知哈希中强行使用它。
有趣的是,如果黑客可以访问密码哈希并可以嗅探mysql流量,则无需从密码中恢复纯文本密码。由于MySQL协议的设计,密码的强度和auth插件中的哈希算法的强度都没有关系,嗅探到的哈希足以连接到具有修补程序版本的MySQL客户端的数据库。这意味着,如果黑客有权访问数据库备份和流量,则他会自动接收所有需要的信息(SHA),以连接到正在运行的数据库。有关攻击的详细信息,请参见。
从MySQL 8.0开始,caching_sha2_password默认使用auth插件,该插件带来更强大的sha256功能,而不是sha1在mysql_native_password插件中使用。对于使用caching_sha2_password插件进行身份验证,仅具有一个哈希并能够嗅探流量也足够了,
不过,如果您希望密码能与未修改的客户端一起使用,则需要进行一些修改,请参阅下面的说明。
转储哈希
让我们回到密码恢复。首先,我们需要转储哈希值。
MySQL 5.7 mysql_native_password默认使用auth插件,我们可以sha1使用以下命令转储哈希值。
% mysql -Ns -uroot -e "SELECT SUBSTR(authentication_string,2) AS hash FROM mysql.user WHERE plugin = 'mysql_native_password' AND authentication_string NOT LIKE '%THISISNOTAVALIDPASSWORD%' AND authentication_string !='';" > sha1_hashes
MySQL 8.0 caching_sha2_password默认使用auth插件,我们可以sha256按以下方式转储哈希值。
% mysql -Ns -uroot -e "SELECT CONCAT('\$mysql',LEFT(authentication_string,6),'*',INSERT(HEX(SUBSTR(authentication_string,8)),41,0,'*')) AS hash FROM mysql.user WHERE plugin = 'caching_sha2_password' AND authentication_string NOT LIKE '%INVALIDSALTANDPASSWORD%' AND authentication_string !='';" > sha256_hashes
如果您需要获取root密码哈希并且没有对mysql.user表具有读访问权的用户 ,则应使用该--skip-grant-tables选项启动mysqld,有关详细信息,请参见官方文档。
运行Linode GPU实例
为了恢复密码,需要在一些功能强大的GPU上运行计算,并且市场上没有这么多具有GPU实例的云提供商。如果您需要一个简单,可靠的提供商以及真正有用的支持部门,那么Linode是卓越的云提供商之一。Linode有一个功能强大的CLI工具,可以大大简化“ bash”自动化。另外,对于更严格的自动化,还存在官方的Terraform提供商。
128GB GPU Linode实例的密码恢复速度为30000 MH / s(每秒百万个哈希),非常好。暴力破解8个字符的MySQL 5.7密码(大写,小写,数字)仅需要2个小时。实例价格仅为6美元/小时。例如,具有相同恢复速度的另一家最大的云提供商(4个NVIDIA Tesla V100实例),其成本要高出两倍,为12.24美元/小时。
准备字典
密码暴力破解是根据字典完成的。我们将以一本小rockyou词典为例,说明它的运行过程。
您可以在weakpass dot com网站上找到非常好的词典。
但是,即使最大的字典也可能不足以进行恢复。在这种情况下,您应该检查是否启用validate_password插件,并根据它准备字典。如下检查:
如果此命令的输出为空,则表示插件已禁用。您可以在我们以前的博客文章之一中找到有关该插件的更多详细信息,“ 使用验证插件改善MySQL密码安全性”。
该validate_password_policy领域是这里最重要的领域。它可以具有以下值:
如果设置了validate_password_policy=STRONG和validate_password_dictionary_file,则需要从中排除密码validate_password_dictionary_file:
cat huge-dictonary.txt \
| pw-inspector -m 8 -M 32 -l -u -n -p \
| sort -u \
| grep -F -v -x -f prohibited.txt \
> reduced-dictonary.txt
在上面的示例中:
-m 8是密码的最小长度,来自validate_password_length变量的值;
-M 32是密码的最大长度,对于复制密码,最大长度为32个字符,
;-n密码应包含数字,请参见validate_password_number_count变量;
-l -u密码应包含小写/大写字符,请参见validate_password_mixed_case_count变量;
-p密码应包含特殊字符;
prohibited.txt是来自validate_password_dictionary_file变量的文件;
huge-dictonary.txt是初始词典;
reduced-dictonary.txt是没有单词的新词典prohibited.txt。如果字典攻击失败,则必须为蛮力创建自己的字典。在这种情况下,我们建议使用以下工具之一:压缩,遮罩处理器或通过Hashcat选项。
编译Hashcat
在MySQL 8.0的情况下,应编译master分支的最新版本的hashcat,这是因为的代码目前尚未发布。
% sudo apt -y install make gcc
% git clone
% cd hashcat
% make
% sudo make install
为NVIDIA启用OpenCL
更新到最新软件,禁用nouveau驱动程序并重新启动:
% sudo apt update && sudo apt full-upgrade -y
% echo -e "blacklist nouveau\noptions nouveau modeset=0\nalias nouveau off" | sudo tee /etc/modprobe.d/blacklist-nouveau.conf
% sudo update-initramfs -u
% reboot
安装专有驱动程序并重新启动
% sudo apt install -y nvidia-cuda-toolkit ocl-icd-libopencl1
% sudo apt install -y nvidia-driver-440 nvidia-utils-440
% sudo apt remove mesa-opencl-icd
% reboot
检查驱动程序
% sudo nvidia-smi
% hashcat -I
运行密码恢复
对于mysql_native_password(MySQL 5.7),请使用300代码:
% hashcat -m 300 -a 0 -D 2 -O -w 3 ./sha1_hashes ./rockyou.txt
对于caching_sha2_password(MySQL 8.0),请使用7401代码:
% hashcat -m 7401 -a 0 -D 2 -O -w 3 ./sha256_hashes ./rockyou.txt
如果密码已正确恢复,则可以运行相同的命令,并带有--show显示密码的选项。
% hashcat -m 300 -a 0 -D 2 ./sha1_hashes ./rockyou.txt --show
0913bf2e2ce20ce21bfb1961af124d4920458e5f:new_password
这new_password是正确的答案。
结论
只能在2小时内在Linode GPU实例上恢复MySQL 5.7的8字符密码,包括大小写字母和数字。MySQL 8.0的相同密码可以在2.8年内恢复。但是通常,黑客根本不需要恢复纯文本密码(请参见上面的“ mysql-unsha1攻击”部分)。为了降低风险,需要保护mysql.user表的内容,可以做一些事情:
不要在MySQL本身中存储哈希,例如,对Percona Server使用LDAP插件或通过HashiCorp Vault插件使用静态加密或至少使用静态加密进行备份。
标签: #mysql安全性如何