MySQL的安全使用方式

53次阅读
没有评论

共计 4149 个字符,预计需要花费 11 分钟才能阅读完成。

自动写代码机器人,免费开通

本篇内容介绍了“MySQL 的安全使用方式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让丸趣 TV 小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

 MySQL 基础知识

MySQL 是一个流行的关系型数据库管理系统(Relational Database Management System,RDMS),在与 PHP 结合应用方面,MySQL 是最好的关系型数据库管理系统之一。MySQL 使用不当,常常会引起致命的安全问题。

1、运行安全

为了防止攻击者通过 MySQL 漏洞越权获取更高的权限,不要使用系统 root 用户运行 MySQL 服务器。mysqld 默认拒绝使用 root 运行,如果对 mysqld 服务需要指定用户进行运行,应该使用普通非特权用户运行 mysqld,同时为数据库建立独立的 Linux 中的 MySQL 账户,该账户只用于管理和运行 MySQL。

在 MySQL 配置 /etc/my.cnf 文件中指定执行账户。

vim /etc/my.cnf [mysqld] user=mysql

这个配置使服务器用指定的用户来启动,无论是手动启动还是通过 mysqld_safe 或 mysql.server 启动,都能确保使用 MySQL 的身份。也可以在启动参数上进行配置,加上 user 参数。

/usr/local/mysql/bin/mysqld_safe --user=mysql 

默认的 MySQL 安装在 /usr/local/mysql,对应的默认数据库文件在 /usr/local/mysql/var 目录下,必须保证该目录不能让未经授权的用户访问后把数据库打包复制走,所以要限制对该目录的访问。mysqld 运行时,只使用对数据库目录具有读或写权限的 Linux 用户来运行。

MySQL 主目录只允许 root 用户进行访问。

chown -R root /usr/local/mysql/

数据库目录只允许 MySQL 用户进行访问。

chown -R mysql.mysql /usr/local/mysql/var

2、密码安全

默认安装的 MySQL 的 root 用户密码是空密码,为了安全起见,必须修改为强密码,即至少 8 位,由字母、数字和符号组成的不规律密码。使用 MySQL 自带的 mysqladmin 命令修改 root 密码。

mysqladmin -u root password  new-password  // 使用 mysqladmin 修改密码

同时可以使用下面的命令登录数据库对密码进行修改。

mysql use mysql mysql update user set pas sword=pas sword(new-password) where user= root  mysql flush privileges; //  强制刷新内存授权表,否则使用的还是在内存缓冲的口令

3、账号安全

系统 MySQL 的默认管理员名称是 root,而一般情况下,数据库管理员都没有进行修改,这在一定程度上为系统用户密码暴力破解的恶意攻击行为提供了便利,应该修改为复杂的用户名,加强账号的安全,同时不要使用 admin 或者 administrator,因为它们也在易猜解的用户字典中。

mysql update user set user= new-root-name  where user= root  mysql flush privileges; //  强制刷新内存授权表,否则使用的还是在内存缓冲的口令

需要正确地给用户分配权限,不要将全部权限分配给普通用户,有选择性地分配读写权限,如只分配查询权限给用户。

mysql grant SELECT on db.table to username@ localhost

不要将 with grant option 授权给普通用户,防止普通用户将权限授予他人,造成管理混乱。

表 1 是常用的权限及说明。

MySQL 的安全使用方式

表 1   常用权限及说明

4、数据库安全

默认 MySQL 安装初始化后会自动生成空用户和 test 库,进行安装测试,这会对数据库的安全构成威胁,有必要全部删除,最后的状态只保留单个 root 即可。当然,以后可以根据需要增加用户和数据库。

mysql show databases; mysql drop database test; //  删除数据库 test use mysql; delete from db; //  删除存放数据库的表信息,因为还没有数据库信息  mysql delete from user where not (user= root  //  删除初始非 root 的用户  mysql delete from user where user= root  and password=; //  删除空密码的 root Query OK, 2 rows affected(0.00 sec) mysql flush privileges; //  强制刷新内存授权表

5、限制非授权 IP 访问

如果是单机运行 MySQL,推荐开启 skip-networking,可以彻底关闭 MySQL 的 TCP/IP 连接方式。

# my.ini skip-networking

如果是固定 IP 访问 MySQL,可以在配置文件中增加 bind-address=IP,前提是关闭 skip-networking。

bind-address=10.10.1.1

6、文件读取安全

在 MySQL 中,使用 load data local infile 命令提供对本地文件的读取功能。在 5.0 版本中,该选项是默认打开的,该操作会利用 MySQL 把本地文件读到数据库中,然后攻击者就可以非法获取敏感信息。假如不需要读取本地文件,应将其关闭。

网络上流传的一些攻击方法中就有用到 load data local infile 的,同时它也是很多新发现的 SQL Injection 攻击利用的手段。攻击者还能通过使用 load data local infile 装载“/etc/passwd”进一个数据库表,然后用 SELECT 显示它,这个操作对服务器的安全来说是致命的。

可以在 my.cnf 中添加 local-infile= 0 参数。

vim /etc/my.cnf [mysqld] set-variable=local-infile = 0

或者在 MySQL 启动时添加 local-infile= 0 参数。

/usr/local/mysql/bin/mysqld_safe --user=mysql --local-infile=0 

7、常用安全选项

下面是一些 MySQL 自己提供的安全选项,在使用 MySQL 服务时可以根据自己的需要进行灵活的配置。

--allow-suspicious-udfs

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

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

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

--old-passwords

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

(OBSOLETE) --safe-show-database

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

--safe-user-create

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

mysql  GRANT INSERT(user) ON mysql.user TO user_name @ host_name

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

--secure-auth

不允许鉴定有旧 (pre-4.1) 密码的账户。

--skip-grant-tables

这个选项导致服务器根本不使用权限系统,从而使得每个人都有权完全访问所有数据库!(通过执行 mysqladmin flush-privileges 或 mysqladmin eload 命令,或执行 FLUSH PRIVILEGES 语句,可以告诉一个正在运行的服务器再次开始使用授权表。)

--skip-name-resolve

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

--skip-networking

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

--skip-show-database

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

8、数据安全

在生产环境中,数据库可能会遭遇各种各样的不测从而导致数据丢失,如硬件故障、软件故障、自然灾害、恶意攻击者攻击、误操作等都会对数据造成损坏或丢失。为了在数据丢失之后能够及时恢复数据,需要定期对数据进行备份。

备份数据的策略要根据不同的业务场景进行定制,大致有几个参考数值,可以根据这些数值来定制符合特定环境中的数据备份策略。

(1)能够容忍丢失多少数据。

(2)恢复数据需要多长时间。

(3)需要恢复哪些数据。

根据业务场景的需要来选择备份方式是完整备份、增量备份还是差异备份。

“MySQL 的安全使用方式”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注丸趣 TV 网站,丸趣 TV 小编将为大家输出更多高质量的实用文章!

向 AI 问一下细节

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-12-04发表,共计4149字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)