MYSQL复习笔记3-用户和安全

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 slave, super,replication client, process on *.* to 'dbslave'@'192.168.100.%' ;
Query OK, 0 rows affected (0.00 sec)

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中相关权限信息)-匹配失败-> 请求被拒绝
-匹配成功->发往后段继续执行

 

posted on 2014-02-05 15:59  @Jin  阅读(262)  评论(0编辑  收藏  举报

导航