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

摘要

本文为数据库优化系列文章的第六篇文章 :《数据库优化——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@localhost
revoke all privileges

//revoke不可以回收登陆权限,也就是说revoke不可以删除用户
revoke usage *.* from z2@localhost(ERROR)

//删除用户请使用DROP
DROP 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_hostname
mysql> 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权限
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值