MySQL 安全配置

1、前言mysql

不少文章中会说,数据库的权限按最小权限为原则,这句话自己没有错,可是倒是一句空话。由于最小权限,这个东西太抽象,不少时候你并弄不清楚具体他须要哪些权限。 如今不少mysql用着root帐户在操做,并非你们不知道用root权限太大不安全,而是不少人并不知道该给予什么样的权限既安全又能保证正常运行。因此,本文更多的是考虑这种状况下,咱们该如何简单的配置一个安全的mysql。注:本文测试环境为mysql-5.6.4linux

2、Mysql权限介绍
mysql中存在4个控制权限的表,分别为user表,db表,tables_priv表,columns_priv表。web

mysql权限表的验证过程为:sql

1.先从user表中的Host,User,Password这3个字段中判断链接的ip、用户名、密码是否存在,存在则经过验证。
2.经过身份认证后,进行权限分配,按照user,db,tables_priv,columns_priv的顺序进行验证。即先检查全局权限表user,若是user中对应的权限为Y,则此用户对全部数据库的权限都为Y,将再也不检查db, tables_priv,columns_priv;若是为N,则到db表中检查此用户对应的具体数据库,并获得db中为Y的权限;若是db中为N,则检查tables_priv中此数据库对应的具体表,取得表中的权限Y,以此类推。
3、mysql有哪些权限
权限 权限级别 权限说明
CREATE 数据库、表或索引 建立数据库、表或索引权限
DROP 数据库或表 删除数据库或表权限
GRANT OPTION 数据库、表或保存的程序 赋予权限选项
REFERENCES 数据库或表
ALTER 表 更改表,好比添加字段、索引等
DELETE 表 删除数据权限
INDEX 表 索引权限
INSERT 表 插入权限
SELECT 表 查询权限
UPDATE 表 更新权限
CREATE VIEW 视图 建立视图权限
SHOW VIEW 视图 查看视图权限
ALTER ROUTINE 存储过程 更改存储过程权限
CREATE ROUTINE 存储过程 建立存储过程权限
EXECUTE 存储过程 执行存储过程权限
FILE 服务器主机上的文件访问 文件访问权限
CREATE TEMPORARY TABLES 服务器管理 建立临时表权限
LOCK TABLES 服务器管理 锁表权限
CREATE USER 服务器管理 建立用户权限
PROCESS 服务器管理 查看进程权限
RELOAD 服务器管理 执行flush-hosts, flush-logs, flush-privileges, flush-status, flush-tables, flush-threads, refresh, reload等命令的权限
REPLICATION CLIENT 服务器管理 复制权限
REPLICATION SLAVE 服务器管理 复制权限
SHOW DATABASES 服务器管理 查看数据库权限
SHUTDOWN 服务器管理 关闭数据库权限
SUPER 服务器管理 执行kill线程权限
4、数据库层面(db表)的权限分析
权限 说明 网站使用帐户是否给予
Select 可对其下全部表进行查询 建议给予
Insert 可对其下全部表进行插入 建议给予
Update 可对其下全部表进行更新 建议给予
Delete 可对其下全部表进行删除 建议给予
Create 可在此数据库下建立表或者索引 建议给予
Drop 可删除此数据库,及此数据库下的表 不建议给予
Grant 赋予权限选项 不建议给予
References 将来MySQL特性的占位符 不建议给予
Index 可对其下的全部表进行索引 建议给予
Alter 可对其下的全部表进行更改 建议给予
Create_tmp_table 建立临时表 不建议给予
Lock_tables 可对其下全部表进行锁定 不建议给予
Create_view 可在此数据下建立视图 建议给予
Show_view 可在此数据下查看视图 建议给予
Create_routine 可在此数据下建立存储过程 不建议给予
Alter_routine 可在此数据下更改存储过程 不建议给予
Execute 可在此数据下执行存储过程 不建议给予
Event 可在此数据下建立事件调度器 不建议给予
Trigger 可在此数据下建立触发器 不建议给予
5、mysql安全配置方案
1 限制访问mysql端口的ip数据库

windows能够经过windows防火墙或者ipsec来限制,linux下能够经过iptables来限制。windows

2 修改mysql的端口安全

windows下能够修改配置文件my.ini来实现,linux能够修改配置文件my.cnf来实现。服务器

3 对全部用户设置强密码并严格指定对应帐号的访问ipide

mysql中可在user表中指定用户的访问可访问ip测试

4 root特权帐号的处理

建议给root帐号设置强密码,并指定只允许本地登陆

5 日志的处理

如须要可开启查询日志,查询日志会记录登陆和查询语句。

6 mysql进程运行帐号

在windows下禁止使用local system来运行mysql帐户,能够考虑使用network service或者本身新建一个帐号,可是必须给与mysql程序所在目录的读取权限和data目录的读取和写入权限; 在linux下,新建一个mysql帐号,并在安装的时候就指定mysql以mysql帐户来运行,给与程序所在目录的读取权限,data所在目录的读取和写入权限。

7 mysql运行帐号的磁盘权限

1)mysql运行帐号须要给予程序所在目录的读取权限,以及data目录的读取和写入权限
2)不允许给予其余目录的写入和执行权限,特别是有网站的。
3)取消mysql运行帐户对于cmd,sh等一些程序的执行权限。
8 网站使用的mysql帐户的处理

新建一个帐户,给予帐户在所使用数据库的全部权限便可。这样既能保证网站对所对应的数据库的所有操做,也能保证帐户不会由于权限太高而影响安全。给予单个数据库的全部权限的帐户不会拥有super, process, file等管理权限的。 固然,若是能很明确是的知道,个人网站须要哪些权限,仍是不要多给权限,由于不少时候发布者并不知道网站须要哪些权限,我才建议上面的配置。并且我指的通用的,具体到只有几台机器,很少的状况下,我我的建议仍是给予只须要的权限,具体可参考上面的表格的建议。

9 删除无用数据库

test数据库对新建的帐户默认有权限

6、mysql***提权分析及防止措施
通常来讲,mysql的提权有这么几种方式:

1 udf提权

此方式的关键导入一个dll文件,我的认为只要合理控制了进程帐户对目录的写入权限便可防止被导入dll文件;而后若是万一被攻破,此时只要进程帐户的权限够低,也没办执行高危操做,如添加帐户等。

2 写入启动文件

这种方式同上,仍是要合理控制进程帐户对目录的写入权限。

3 当root帐户被泄露

若是没有合理管理root帐户致使root帐户被***,此时数据库信息确定是没办法保证了。可是若是对进程帐户的权限控制住,以及其对磁盘的权限控制,服务器仍是可以保证不被沦陷的。

4 普通帐户泄露(上述所说的,只对某个库有全部权限的帐户)

此处说的普通帐户指网站使用的帐户,我给的一个比较方便的建议是直接给予特定库的全部权限。帐户泄露包括存在注入及web服务器被***后直接拿到数据库帐户密码。

此时,对应的那个数据库数据不保,可是不会威胁到其余数据库。并且这里的普通帐户无file权限,全部不能导出文件到磁盘,固然此时仍是会对进程的帐户的权限严格控制。

普通帐户给予什么样的权限能够见上表,实在不会就直接给予一个库的全部权限。

7、安全配置须要的经常使用命令
1.新建一个用户并给予相应数据库的权限

grant select,insert,update,delete,create,drop privileges on database.* to user@localhost identified by 'passwd';

grant all privileges on database.* to user@localhost identified by 'passwd';
2.刷新权限

flush privileges;

  1. 显示受权

show grants;

  1. 移除受权

revoke delete on . from 'jack'@'localhost';

  1. 删除用户

drop user 'jack'@'localhost';

  1. 给用户更名

rename user 'jack'@'%' to 'jim'@'%';

  1. 给用户改密码

SET PASSWORD FOR 'root'@'localhost' = PASSWORD('123456');

  1. 删除数据库

drop database test;

  1. 从数据库导出文件

select * from a into outfile "~/abc.sql"

相关文章
相关标签/搜索