【愚公系列】2024年03月 《网络安全应急管理与技术实践》 026-网络安全应急技术与实践(数据库层-MySQL数据库安全配置

举报
愚公搬代码 发表于 2024/03/31 20:13:09 2024/03/31
【摘要】 🏆 作者简介,愚公搬代码🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,51CTO博客专家等。🏆《近期荣誉》:2022年度博客之星TOP2,2023年度博客之星TOP2,2022年华为云十佳博主,2023年华为云十佳博主等。🏆《博客内容...

🏆 作者简介,愚公搬代码
🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,51CTO博客专家等。
🏆《近期荣誉》:2022年度博客之星TOP2,2023年度博客之星TOP2,2022年华为云十佳博主,2023年华为云十佳博主等。
🏆《博客内容》:.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。
🏆🎉欢迎 👍点赞✍评论⭐收藏

🚀前言

MySQL数据库安全配置主要涉及以下方面:

  1. 使用强密码:确保MySQL的root用户和其他用户的密码是强密码,包括大写字母、小写字母、数字和特殊字符。
  2. 限制远程访问:在MySQL配置文件中,将bind-address设置为本地IP地址,或者只允许特定IP的访问,以限制远程访问MySQL数据库。
  3. 使用安全套接字:启用MySQL服务器与客户端之间的安全连接,可以使用SSL证书来加密数据传输。
  4. 限制用户权限:仅给予用户所需的最低权限,避免给予过高的权限,以防止恶意操作和数据泄露。
  5. 定期备份数据:定期备份MySQL数据库,以防止数据丢失或损坏。
  6. 更新和修补漏洞:及时安装MySQL的安全更新和补丁,以修复已知的漏洞。
  7. 监控并记录日志:启用MySQL的日志记录功能,监控数据库的访问,以及其他操作,以便及时发现异常行为或者安全事件。
  8. 使用防火墙:在服务器上配置防火墙,只允许特定的IP地址或端口访问MySQL服务。
  9. 禁止匿名访问:在MySQL配置文件中,禁止匿名用户访问数据库。
  10. 分离数据库服务:将MySQL数据库服务与Web服务器或应用服务器分离,以缓解风险和限制攻击面。
  11. 定期审查权限:定期审查和更新MySQL用户的权限,确保没有多余的或被误授予的权限。
  12. 加密敏感数据:对于包含敏感信息的数据,可以使用MySQL提供的加密函数进行加密存储。
  13. 禁用不必要的插件:禁用不必要的MySQL插件,减少攻击面。
  14. 使用防御性编程:在开发应用程序时,使用防御性编程技术来预防SQL注入攻击等常见的安全漏洞。
  15. 定期进行安全审计:定期对MySQL数据库进行安全审计,发现和修复潜在的安全风险。

🚀一、MySQL数据库安全配置

🔎1.修改 root 口令并修改默认配置

MySQL 默认安装的root 用户是空密码的,为了安全起见,必须修改为强密码,所谓的强密码至少8位,是由字母、数字和符号组成的不规律密码。使用 MySQL自带的命令 MySQLadmin 修改root密码,同时也可以登录数据库,修改数据库 MySQL下的user 表的字段内容,修改方法如下。

#/usr/local/MySQL/bin/MySQLadmin -u root password "upassword"
#MySQL> use MySQL;
#MySQL> update user set password=password('upassword') where user='root';
#MySQL> fush privileges;

最后一行命令的作用是强制刷新内存授权表,这样才能确保删除默认数据库和数据库用户时使用的是内存中的最新口令,而不是缓冲的口令。

通常情况下,MySQL数据库是安装在本地的,并且只有本地程序需要对MySQL进行读取。因此,可以删除那些不再使用的用户账号。在MySQL初始化后,会自动生成一个空用户和一个test库,用于安装测试。但是这可能对数据库的安全构成威胁,因此有必要将其全部删除,只保留一个root用户即可。当然,以后可以根据需要增加新的用户和数据库。

1. 显示数据库列表:
   MySQL> show databases;
2. 删除数据库 "test":
   MySQL> drop database test;
3. 使用数据库 "MySQL":
   use MySQL;
4. 删除存储数据库的表信息(因为还没有数据库信息):
   delete from db;
5. 删除初始非 "root" 的用户:
   MySQL> delete from user where not (user='root');
6. 删除空密码的 "root" 用户(尽量重复操作):
   MySQL> delete from user where user='root' and password='';
7. 刷新内存授权表:
   MySQL> flush privileges。

密码管理是数据库安全管理的一个很重要的因素。请不要将纯文本密码保存到数据库中,建议保存密码的单向哈希函数检验值。同时,请不要从常见的密码词典中选择密码,因为有专门的程序可以破解这种密码。建议选用至少8位,由字母、数字和符号组成的强密码。在存取密码时,使用含有MySQL的内置函数password()的SQL语句,对密码进行加密后存储。例如,可以使用以下方式在users表中加入新用户。

# MySQL> insert into users values (1,password(QWe@2634),'ZAGF');

MySQL的内置函数password()用于进行密码加密。它接受一个字符串作为输入,并返回其加密后的结果。这个加密过程使用MySQL的密码算法,该算法在存储密码时会进行加盐和哈希操作,增加了密码的安全性。password()函数通常用于在插入或更新数据时,将用户输入的密码加密后存储到数据库中,以保护密码的安全性。在验证用户登录时,可以使用password()函数加密用户输入的密码,并与数据库中存储的加密密码进行比较,以进行身份验证。

🔎2.使用其他独立用户运行 MySQL

如果MySQL的系统管理员是root,这就方便了一些对系统用户进行穷举的恶意行为。为了增强安全性,建议将系统管理员用户名修改为复杂的形式。同时,避免使用admin或administrator等容易被猜测的用户名,因为它们存在于常见的用户字典中。以下是修改为不易被猜测的用户名的命令示例:

MySQL> update user set user="NewRoot2050" where user="root";
MySQL> fush privileges;

为了增强安全性,请绝对避免使用root用户来运行MySQL服务器。因为具有FILE权限的用户可以利用root用户权限创建文件(例如:~root.bashrc)。在Linux系统中,建议为数据库设置一个独立的MySQL账户,该账户只用于管理和运行MySQL。

如果想要使用其他用户来启动MySQLd,可以通过在/etc/my.cnf配置文件或服务器数据目录的my.cnf配置文件的[MySQLd]组中增加user选项来指定用户名。以下是一个示例命令:

#vim /etc/my.cnf
[MySQLd]
user=MySQL

无论手动启动或通过MySQLd_safe或MySOL.server 启动,都要使用MySQL用户的身份。也可以在启动数据库时加上user参数。

#/usr/local/MySQL/bin/MySQLd_safe --user=MySQL &

🔎3.禁止远程连接数据库并限制连接用户

在命令行使用netstat -ant可以看到3306端口是打开的,这意味着MySQLd正在监听网络,允许用户使用账号和密码远程连接到本地数据库,这是不安全的。为了禁用这个功能,可以启动skip-networking,停止监听任何SQL的TCP/IP连接,断开远程访问权限。当确实需要远程连接数据库时,建议修改默认的监听端口,并添加防火墙规则,只允许受信任网络的MySQL监听端口数据通过。

在/etc/my.cnf文件中使用vim命令打开文件,并取消注释#skip-networking这一行。

使用/usr/local/MySQL/bin/MySQLadmin -u root -p shutdown命令停止数据库。

使用/usr/local/MySQL/bin/MySQLd_safe -user=MySQL & // 命令以MySQL用户的身份在后台启动MySQL。

数据库的某个用户多次远程连接可能会导致性能下降并影响其他用户的操作,需要对其进行限制。可以通过设置my.cnf文件中MySQL中的max_user_connections变量来限制单个账户允许的连接数量。GRANT语句也可以使用资源控制选项来限制服务器对一个账户的使用范围。

vim /etc/my.cnf
[MySQLd]
max_user_connections 2

数据库相关的shell操作命令会分别记录在.bash_history文件中。如果这个文件不慎被读取,会导致数据库密码和数据库结构等信息泄漏。而登录数据库后的操作将记录在.MySQL_history文件中。如果使用update表信息修改数据时,用户输入的密码也会被读取。因此,需要删除这两个文件。同时,在进行登录或备份数据库等与密码相关的操作时,应该使用-p参数提示输入密码,并采用隐式输入密码的方式。建议将以上文件置空。

# rm .bash_history .MySQL_history //删除历史记录
# in -s /dev/null .bash_history //将shell 记是文件置空
# in -s /dev/null .MySQL_history //将shell 记是文件置空

🔎4.MySQL 服务器权限控制

MySQL权限系统的主要功能是为用户在数据库上赋予SELECT、INSERT、UPDATE和DELETE等权限。它的附加功能包括对MySQL特定操作(例如LOAD DATA INFILE)进行授权和管理的能力。

为了保障数据库安全,只有管理员可以对user、db、host等表进行配置。具体来说,最好只有超级用户在user表中有修改权限,其他用户在user表中的权限应设为N,并且只在特定数据库的基础上进行授权。

MySQL可以为特定的数据表或列授权,FILE权限允许用户使用LOAD DATA INFILE和SELECT INTO OUTFILE语句在服务器上读取和写入文件。任何被授权FILE权限的用户都可以读取或写入MySQL服务器上的任何文件。

而FLE权限允许用户在MySQL服务器具有写权限的目录下创建新文件,但不能覆盖已有文件。在user表的FILE权限设置为Y或N,所以当不需要对服务器文件进行读取时,建议禁用该权限。

MySQL> load data infile 'sqlfile.txt' into table loadfile users fields terminated by ','  ///读取本地信息sqlfile.txt

MySQL> update user set File_priv='N' WHERE user='root'; //禁制读取权限

MySQL> fush privileges;

MySQL> load data infile 'sqlfile.txt' into table users fields terminated by ','  ///读取本地信息sqlfile.txt

selecte * from loadfile.users into outfile "test.txt" fields terminated by ','  

为了安全起见,管理员应该经常使用SHOW GRANTS语检查用户已经访问了什么,然后使用REVOKE语句删除不再需要的权限

🦋4.1 用户目录权限限制

MYSQL默认是安装在/usr/local/MySQL目录下,而对应的数据库文件存储在/usr/local/MySQL/var目录下。要限制对该目录的访问,保证该目景不能让未经授权的用户访问,以免把数据库打包复制走。确保MySQLd运行时,只使用对数据库目录具有读或写权限的Liunx用户运行。

#chown-R root /usr/local/MySQL/ //MySQL主目录给root

#chown -R MySOL.MySQL /usr/local/MySQL/var //确保数据库目录权限所属MYSQL

🦋4.2 禁制MYSQL对本地目录读取

在MySQL中,提供对本地文件的读取的命令是LOAD DATA LOCAL INFILE。在MySQL 5.x版本中,该选项是默认打开的。为了保证安全性,应该关闭这个选项。这个操作命令允许用户将本地文件读取到数据库中,从而可能非法获取敏感信息。如果不需要读取本地文件,请关闭该选项。

下面是进行测试的步骤:

1、首先,在测试数据库下创建一个名为sqlfile.txt的文件,文件中的字段使用半角逗号进行分隔。

在这里插入图片描述
成功地将本地数据插入数据库中后,应该禁止在MySQL中使用LOAD DATA LOCAL INFILE命令。入侵者可以通过使用LOAD DATA LOCAL INFILE命令将一个危险的文件(例如/etc/passwd)导入数据库表中,然后使用SELECT命令显示出来,这样的操作对服务器的安全性是致命的。

为了解决这个问题,可以在my.cnf配置文件中添加local-infile=0,或者在启动MySQL时添加参数local-infile=0,以禁用LOAD DATA LOCAL INFILE命令的使用。这样可以有效地保护服务器的安全性。

#usr/local/MySQL/bin/MySQLd_safe -user=MySQL -local-infile=0 &
#MySQL> load data local infile 'sqifile.txt' into table users fields terminated by ','
ERROR 1148 (42000): The used command is not allowed with this MySOL version

--local-infle-0选项启动MySOLd从服务器端禁用所有 LOAD DATA LOCAL命令,假如需要获取本地文件,则需要打开。

🦋4.3 使用 chroot 方式控制 MySQL 的运行目录

chroot是Linux中的一种系统高级保护手段,这是一个非常有效的办法特别是在配置网络服务程序的时候。它的建立会将其与主系统几乎完全隔离,旦出现安全问题,也不会危及到正在运行的主系统。

🦋4.4 关闭 MySQLd 安全相关启动选项

下列的 MySQLd 选项影响安全。

-allow-suspicious-udfs

该选项控制是否可以载入主函数只有xxx符的用户定义函数。默认情况下,该选项被关闭,并且只能载入至少有辅助符的UDF。这样可以防止从未包含合法 UDF 的共享对象文件载入函数。

-local-infile[={0|1}]

如果用--local-infle=0启动服务器,则客户端不能使用 LOCAL IN LOAD DATA 语句。

--old-passwords

强制服务器为新密码生成短(pre-4.1)密码哈希。当服务器必须支持旧版本客户端程序时,对保证兼容性很有用。

(0BSOLETE)--safe-show-database

在以前版本的 MySQL中,该选项使 SHOW DATABASES 语句只显示用户具有部分权限的数据库名。在MySQL5.x中,该选项不再作为现在的默认行为使用,有一个SHOW DATABASES权限可以用来控制每个账户对数据库名的访问。

-safe-user-create

如果启用,用户不能用 GRANT 语句创建新用户,除非用户有MySQL.user表的INSERT权限。如果想让用户具有授权权限来创建新用户,应给用户投子下面的权限。

MySQL> GRANT INSERT(user) ON MySQL.user TO 'user_name'@'host _name';

这样确保用户不能直接更改权限列,必须使用GRANT语句给其他用户授予该权限。

--skip-grant-tables

这个选项导致服务器根本不使用权限系统,给每个人以完全访问所有的数据库的权力。通过执行 MySOLadmin flush-privileges 或 MySQLadmin eload 命令或执行 fush privileges语句,使正在运行的服务器再次开始使用授权表。

--skip-name-resolve

主机名不被解析。所有在授权表的Host的列值必须是IP号或localhost。

--skip-networking

在网络上不允许 TCP/P 连接。所有到 MySQLd的连接必须经由 UNIX 套接字进行。

--skip-show-database

使用该选项,只允许有SHOW DATABASES权限的用户执行SHOW DATABASES语句,该语句显示所有数据库名。不使用该选项,允许所有用户执行 SHOW DATABASES,但只显示用户有SHOW DATABASES权限或部分数据库权限的数据库名。注意全局权限是指数据库的权限。

🔎5.数据库备份策略

数据库备份一般采用本地备份和网络备份的形式,可用MSQL自带的MySQLdump或直接复制的备份形式。

直接复制数据文件最为直接、快速、方便,但缺点是不能实现增量备份。为了保证数据的一致性,需要在备份文件前,执行SQL语句:FLUSH TABLES WITH READ LOCK,即把内存中的数据都刷新到磁盘中,同时锁定数据表,以保证复制过程中不会有新的数据写入。这种方法备份出来的数据恢复也很简单,直接复制回原来的数据库目录下即可。

使用 MySQLdump 可以把整个数据库装载到一个单独的文本文件中。这个文件包含所有重建数据库需要的SQL命令。这个命令取得所有的模式(Schema后面有解释)并且将其转换成DDL语法(CREATE语,即数据库定义语句)取得所有的数据,并且从这些数据中创建INSERT语句。这个工具将数据库中所有的设计倒转。因为所有的信息都被包含到了一个文本文件中。这个文本文件可以用一个简单的批处理和一个合适 SQL 语句导回到 MySQL 中。

使用 MySQLdump进行备份非常简单,如果要备份数据库nagios_db_backup,使用命令,同时使用管道gzip命令对备份文件进行压缩,建议使用异地备份的形式,也可以采用Rsync等方式,将备份服务器的目录挂载到数据库服务器,将数据库文件备份打包,通过crontab定时备份数据。

在这里插入图片描述
恢复数据使用的命令如下。
在这里插入图片描述


🚀感谢:给读者的一封信

亲爱的读者,

我在这篇文章中投入了大量的心血和时间,希望为您提供有价值的内容。这篇文章包含了深入的研究和个人经验,我相信这些信息对您非常有帮助。

如果您觉得这篇文章对您有所帮助,我诚恳地请求您考虑赞赏1元钱的支持。这个金额不会对您的财务状况造成负担,但它会对我继续创作高质量的内容产生积极的影响。

我之所以写这篇文章,是因为我热爱分享有用的知识和见解。您的支持将帮助我继续这个使命,也鼓励我花更多的时间和精力创作更多有价值的内容。

如果您愿意支持我的创作,请扫描下面二维码,您的支持将不胜感激。同时,如果您有任何反馈或建议,也欢迎与我分享。

在这里插入图片描述

再次感谢您的阅读和支持!

最诚挚的问候, “愚公搬代码”

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。