Date: 20140115
Auth:
Jin
参考:http://dev.mysql.com/doc/refman/5.1/en/security.html
一、权限系统
实现方式
相关权限信息存储在几个grant tables的系统表中
mysql.user
mysql.db
mysql.host
mysql.tables_priv
mysql.columns_priv
如果手工修改权限表后,需要执行Flush
PRIVILEGES,通知MYSQL重新加载权限信息。
如果通过GRANT,REMOVE DROP
USER命令进行权限调整,则修改系统表的同时会更新内存结构的权限信息。
二、、permission
level
SQL分类:
DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE)
DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT)
DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK
高层次覆盖底层次的global
level》database level》table level》column level》routine level
mysql> show
privileges; #可以看到全部权限
1.global level
dml:
update 更新数据库
insert
数据插入
delete 删除表数据
select 数据查询
ddl:
create #库 表和索引的创建权限
create routine #produce,function和tigger创建权限
routine【程序】
create temporary tables #临时表的创建权限
create user
#创建用户的权限
create view #创建视图的权限
alter #表结构更改权限
alter
routine #produce,function和tigger变更权限
drop #删除数据对象
index
#在已有表上创建索引的权限
file #执行LOAD DATA INFO和SELECT 。。。 INTO
FILE的权限
execute #PROCEDURE FUNCTION TRIGGER 等执行权限
show databases
#SHOW DATABASE命令权限
show views #SHOW CREATE VIEW命令查看VIEW创建语句权限
#mananger
process #执行show processlist权限
supper #kill,changer
master,purge master logs ,set global
reload
#执行FLUSH等让数据库重新LOAD某些对象或数据的命令权限
lock talbes #执行LOCK TALBES命令权限
shutdown
#执行关闭MYSQL权限,MYSQLADMIN 执行SHUTDOWN命令
usage
#创建新用户,没有授权任何权限的时拥有的权限
#master-slave
replication client #SHOW MASTER
STATUS,SHOW SLAVE STAT
replication slave #Slave
Supper
#kill,changer master,purge master logs ,set global等命令的权限
2.database
level
比GLOBAL少
SHOW DATABASES
CREATE
USER
FILE
PROCESS
RELOAD
#MASTER-SLAVE
REPLICATION
CLIENT
REPLICATION SLAVE
SUPPER
#
SHUTDOWN
USAGE
通过“DATABSE*”来限定权限作用的数据
GRANT SELECT,UPDATE,INSERT,DELETE ON DATABSE.* TO
‘DIEGE’@‘192.168.100.%’
或者USE DABASE
GRANT SELECT,UPDATE,INSERT,DELETE ON
* TO ‘DIEGE’@‘192.168.100.%’
授权语句中多个权限用逗号(,)隔开 多个用户也用逗号(,)隔开
GRANT
SELECT,UPDATE,INSERT,DELETE ON DATABSE.* TO
‘DIEGE’@‘192.168.100.%’,‘LILY’@‘192.168.101.%’
3.table level
作用域仅限于某个特定的表
update
insert
delete
select
create
alter
drop
index
EG:
GRANT INDEX ON test.t1 TO
‘abc‘@‘192.168.100.%‘;
SHOW GRANT FOR ‘abc‘@‘192.168.100.%‘;
4.column level 不常用了解即可
每个表的指定的某个某些列
insert select update
GRANT
SELECT(id,value) ON test.t2 TO ‘abc‘@‘192.168.100.%‘;
5.routine level 不常用了解
需指定数据库和相关对象
execut
alter routine
procedure
function
GRANT EXECUTE ON test.p1 TO ‘abc‘@‘192.168.100.%‘;
三、创建用户
授予权限
(一)修改表的方式创建。
了解即可不推荐
1:创建用户
创建一个test用户并设置密码,容许其能从本地连接到数据库
mysql>
insert into user (host,user,password) values
(‘localhost‘,‘test‘,password(‘123‘));
查看表里是否有添加的用户
mysql> select
host,user,password from user where user=‘test‘;
mysql> flush privileges;
对授权表进行重载
2:更改用户密码
mysql> update user set password=password(‘123456‘)
where user=”sky”;
mysql> flush privileges;
3:删除用户
mysql> delete
from user where user=‘test‘;
mysql> flush privileges;
(二)命令方式
掌握推荐首选方法
1:创建用户
mysql> create user
‘diege‘@‘localhost‘;
mysql> select host,user,password from mysql.user
where user=‘diege‘;
+----------+-------+----------+
| host | user |
password |
+----------+-------+----------+
| localhost | diege |
|
+----------+-------+----------+
1 row in set (0.00
sec)
没有设置密码,需要设置密码
mysql> create user ‘diege‘@‘localhost‘ identified by
‘123.com‘;
Query OK, 0 rows affected (0.00 sec)
mysql> select
host,user,password from mysql.user where
user=‘diege‘;
+-----------+-------+-------------------------------------------+
|
host | user | password
|
+-----------+-------+-------------------------------------------+
|
localhost | diege | *AC241830FFDDC8943AB31CBD47D758E79F7953EA
|
+-----------+-------+-------------------------------------------+
1 row
in set (0.00 sec)
2:删除用户
mysql> drop user ‘diege‘@‘localhost‘;
Query OK, 0 rows
affected (0.00 sec)
mysql> select host,user,password from mysql.user where
user=‘diege‘;
Empty set (0.00 sec)
3:用户授权
1)dml
mysql> create user ‘diege‘@‘localhost‘ identified by
‘123.com‘;
Query OK, 0 rows affected (0.01 sec)
mysql> grant
select,update,insert,delete on dbtest.* to ‘diege‘@‘localhost‘;
Query OK, 0
rows affected (0.00 sec)
2)master-slave
mysql> create user
‘dbslave‘@‘192.168.100.%‘ identified by ‘123.com‘;
Query OK, 0 rows affected
(0.00 sec)
mysql> grant Replication client,Replication slave on *.* to
‘dbslave‘@‘192.168.100.%‘;
Query OK, 0 rows affected (0.00 sec)
grant
replication slave, super,replication client, process on *.* to
‘dbslave‘@‘192.168.201.%‘ identified by ‘buWE293cnb‘;
3)用户和权限一条语句创建,我常用的方式
mysql> grant
create,alter,drop,select,update,insert,delete on dbtest.* to
‘community‘@‘192.168.100.200‘ identified by
‘123.com‘;
Query OK, 0 rows
affected (0.00 sec)
4)授权的用户可以将自己权限再授予其他人
mysql> create user ‘diege‘@‘localhost‘ identified
by ‘123.com‘;
Query OK, 0 rows affected (0.00 sec
mysql> grant all on
dbtest.* to ‘diege‘@‘localhost‘ with grant option;
Query OK, 0 rows affected
(0.00 sec)
4:取消用户权限
mysql> revoke all privileges on dbtest.* from
‘diege1‘@‘localhost‘;
Query OK, 0 rows affected (0.00 sec)
mysql>
revoke update,delete,insert on dbtest.* from ‘diege‘@‘localhost‘;
Query OK, 0
rows affected (0.00 sec)
5:用户权限查看
1)单个用户
mysql> show grants for ‘diege‘@‘localhost‘;
+--------------------------------------------------------------------------------------------------------------+
|
Grants for diege@localhost
|
+--------------------------------------------------------------------------------------------------------------+
|
GRANT USAGE ON *.* TO ‘diege‘@‘localhost‘ IDENTIFIED BY PASSWORD
‘*AC241830FFDDC8943AB31CBD47D758E79F7953EA‘ |
| GRANT SELECT, INSERT, UPDATE,
DELETE ON `dbtest`.* TO ‘diege‘@‘localhost‘
|
+--------------------------------------------------------------------------------------------------------------+
2
rows in set (0.00 sec)
mysql> show grants for
‘dbslave‘@‘192.168.100.%‘;
+----------------------------------------------------------------------------------------------------------------------------
------------------------+
| Grants for dbslave@192.168.100.%
|
+----------------------------------------------------------------------------------------------------------------------------
------------------------+
| GRANT REPLICATION SLAVE, REPLICATION CLIENT
ON *.* TO ‘dbslave‘@‘192.168.100.%‘ IDENTIFIED BY PASSWORD
‘*AC241830FFDDC8943AB31CBD47D758E79F7953EA‘
|
+----------------------------------------------------------------------------------------------------------------------------
------------------------+
1 row in set (0.00
sec)
有点奇怪,后验证replication权限和用户一起显示。
2)查看全部用户或者多个用户
通过查询系统表来实现
mysql> SELECT DISTINCT CONCAT(‘User:
‘,user,‘@‘,host) AS query FROM mysql.user;
+----------------------------+
| query
|
+----------------------------+
| User: root@127.0.0.1 |
| User:
@localhost |
| User: root@localhost |
| User:
@mnt.localdomain |
| User: root@mnt.localdomain
|
+----------------------------+
5 rows in set (0.00 sec)
CONCAT
类似join
查看权限,再根据用户去查询
mysql> select * from mysql.user where User=‘root‘
and Host=‘127.0.0.1‘;
三、 mysql安全问题(
(一)
、外围网络安全
只开放外网络非开不可的端口,数据库一般情况下不提供外网服务,关闭外网即可。
(二)、主机-操作系统安全
1)严格控制系统账号和权限
锁定mysql用户
其他任何用户都采取独立的账号登陆,管理员通过mysql专有用户管理mysql或者通过root
su 到mysql用户下管理 BSD root su
不到mysql用户
Myql用户目录下,除了数据文件目录,其他文件和目录属主和目录都该该被root
2、尽量避免以root权限运行mysql
3、防止DNS欺骗
Sql授权尽量使用ip
使用了域名需要在host添加对应关系
(三)、数控库本身的安全
0
确认是否真的需要提供网络服务,是否可以让MYSQL仅仅提供本地访问,如果可以,启动时添加--skip-networking参数,让MYSQL不通过
TCP/IP监听网络请求,仅仅通过命令管道或者共享内存(WINDOWS),或者UNIXT套接子文件来和客户端连接交互
1、
设置root密码
2、 删除匿名用户
mysql> drop user ‘‘@‘localhost‘;
3、
设置安全名
6位以上字母,数字,下划线,特殊字符组成
4、 只授权账号的必须的权限
5、
除root外,任何用户不应该有mysql库user表的存权限
6、 不要把file,process或SUPPER权限授权管理员以外的账号
7、
注意LOAD DATA LOCAL带来的安全问题
对服务端使用—local-infile=0选项启动从服务器禁用素有LOAD DATA
LOCAL
对客户端使用—local-infile[=1]启动LOAD DATA LOCAL
对mysqlimport ,--local 或-L
选项启用本地数据文件装载
8、 drop table命令没有收回以前的相关访问授权
9、 加上
IP地址
10、使用SSL
(四)、代码
1、query语句相关安全因素
SQL注入攻击,编码不够严谨
2、程序代码安全因素
四、访问控制实现原理
‘看守MYSQL大门’的用户管理模块
负责监控来访者动作的访问控制模块
用户管理模块控制
控制用户是否可以进门
访问控制模块控制能拿什么,什么不能拿。
用户管理模块
客户端请求(提供host,usernam,password)->用户管理模块验证连接请求(通过mysql.user表校验信息)-验证失败(连接被拒绝)
->验证通过
访问控制模块
用户验证通过后->客户端请求Query(提交DML,DDL等)->权限匹配查找(查找grant
tables中相关权限信息)-匹配失败-> 请求被拒绝
-匹配成功->发往后段继续执行