数据库优化——MySQL权限与安全

来源:互联网 发布:信用卡代办软件 编辑:程序博客网 时间:2024/05/29 18:04

摘要

本文为数据库优化系列文章的第六篇文章 :《数据库优化——MySQL权限与安全》

更多文章参见

数据库优化 :
http://blog.csdn.net/leyounger/article/details/70157087

权限与安全

1. MySQL权限管理

1. 权限系统的工作原理

MySQL是通过IP地址和用户名进行联合确认的,因此,同样的一个用户名,如果来自不同的IP地址,则MySQL将其视为不同的用户。

这一点很重要!!!所有赋予用户的操作都要这么写
[option to] user_name@host_name

确认后,MySQL给予用户一定的权限。MySQL的权限表在数据库启动时载入内存,当用户通过认证后,就在内存中进行相应权限的存取。

2. 权限表的存取

在权限存取的两个过程中,系统会用到”mysql”数据库中user、host和db这三个最重要的权限表

这三个表中,最重要的表是user表,其次是db表,host表在大多数情况下并不使用

当用户进行连接的时候,权限表的存取过程有一下两个阶段

//(1) 先从user表中的host、user和password这三个字段中判断连接的IP、用户名和密码是否存在于表中,如果存在,则通过身份验证,否则拒绝//(2) 如果通过身份验证,则按照一下权限表的顺序得到数据库权限:user->db->tables_priv->columns_priv //在这几个表中,权限范围依次递减,全局权限覆盖局部权限// user表:最高级权限// db表  :次级权限// 当赋予用户全局权限时,user相应条目为Y,db为空// 当赋予用户局部权限时,user相应条目为N,db相应条目为Y感兴趣的小伙伴可以自己改着试试,然后查看这两个表

3. 查看和更改账号权限

(1) 查看权限

SHOW GRANTS FOR z1@localhost;//host可以不写,默认为'%'SHOW GRANTS FOR z1(若出错,则只需执行下步)GRANT SELECT ON test1.* TO 'z1'@'%';

(2) 更改权限

revoke select on *.* from z2@localhostrevoke all privileges//revoke不可以回收登陆权限,也就是说revoke不可以删除用户revoke usage *.* from z2@localhost(ERROR)//删除用户请使用DROPDROP USER z2@localhost;
//权限相关的操作 //(1) 允许z2@localhost在所有库所有表上的SELECT操作grant select on *.* to z2@localhost //(2) 允许z2@localhost在test1库所有表上的SELECT操作grant select on test1.* to z2@localhost//(3) 撤回权限revoke select on *.* from z2@localhost

2. MySQL安全问题

1. 操作系统相关的安全问题

(1) 严格控制操作系统账号和权限

//1) 锁定MySQL用户//2) 其他用户都采取独立的账号登陆,管理员通过mysql专有用户管理MySQL//   或通过root su 到mysql用户下进行管理//3) mysql用户目录下,除了数据文件目录,其他文件和目录属主都改为root

(2) 尽量避免以root权限运行MySQL

//这么做可以防止具有FILE权限的用户能够用root权限在系统上直接操作文件

(3) 防止DNS欺骗

创建用户时,host可以指定域名或者IP地址,但是如果指定域名,就可能带来如下的安全隐患:如果域名对应的IP地址被恶意更改,则数据库就会被恶意的IP地址进行访问

//举个栗子//(1) 创建测试用户z1,域名指定为test_hostnamemysql> grant select on test1.* to z1@test_hostname//(2) 编辑host文件,增加此域名和IP地址的关系# vi /etc/hosts···192.168.52.24   test_hostname···//(3) 客户端连接成功//(4) 修改域名与IP地址的对应关系后,客户端连接失败

2. 数据库相关的安全问题

(1) 删除匿名账号

// 在某些版本中,安装完MySQL后,会自动安装一个空账号,此账号权限巨大mysql -uroot -p// 赶紧删了ta吧DROP USER ''@'localhost';

(2) 给root账号设置口令

MySQL安装完毕后,root默认口令为空,需要马上更改> mysql -uroot> set password=password('newpassword');

(3) 设置足够安全的密码

(4) 只授予账号必须的权限

(5) 除了root外,任何用户不应该有mysql库user表的存取权限

(6) 不要把FILE PROCESS 或 SUPER权限授予管理员以外的账号

FILE 权限允许用户直接读写系统磁盘> LOAD DATA INFILE '/etc/passwd' INTO TABLE t1;> 然后就能看到这个系统所有用户的密码了
PROCESS 权限允许查看所有用户执行的查询的明文文本(show processlist)> 也就是说,只要获取表的锁后,其他用户改密码的话,PROCESS可以知道其密码内容
SUPER 权限能执行kill命令,终止其他用户进程> show processlist 查看id> kill id

(7) LOAD DATA LOCAL带来的安全漏洞

>  LOAD DATA默认读的是服务器上的文件,但是加上LOCAL参数后,就可以将本地具有访问权限的文件加载到数据库中。>  方便的同时,带来以下问题:>  (1)可以任意加载文件到数据库>  (2)使得web服务器=MySQL服务器> 解决方法是用--local-infile=0选项启动数据库

(8) DROP TABLE不收回以前的访问授权

> 也就是说,如果重新创建了一个同名的表,那么就会导致权限泄露

(9) 使用SSL

// 在MySQL中,要想使用ssl进行传输,需要在选项文件中设置“--ssl”选项// 对于服务器,“--ssl”选项规定该服务器允许SSL连接,但是该选项不足以使用SSL连接。// 还必须指定--ssl-ca、--ssl-cert和--ssl-key选项mysql> grant select on *.* to z4 identified by '123' require ssl;

(10) 如果可能,给所有用户加上IP访问限制

···

(11) REVOKE 命令的漏洞

//如果我们要取消一个用户的所有权限,可以使用REVOKE ALL PRIVILEGES ON *.*;//但是如果我们分别给用户赋予两次权限,其中第二次是对所有数据库的所有权限grant select, insert on test1.* to z1;grant all privileges on *.* to z1;//此时,我们执行revoke all privileges on *.* from z1//我们认为z1的所有权限都没了,其实不是哦!z1仍然保留了对test1的权限// 这是MySQL权限机制造成的隐患,// 在一个数据库上多次赋予权限,权限会自动合并// 但是在多个数据库上多次赋予,每个数据库上都会认为是单独的一组权限,// 必须在每个数据都单独进行权限收回

其他

  1. old-password
    MySQL4.1以后使用的PASSWORD函数与4.1之前的不一样,前者在登陆后者的时候存在兼容问题

···

  1. safe-user-create
    此选项禁止使用GRANT语句创建新用户,除非用户有mysql库user表的INSERT权限