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

MYSQL复习笔记3-用户和安全的更多相关文章

  1. mysql学习笔记-创建用户以及登录,基本信息查询

    第一天: 创建一个mysql账号:create user ‘新的用户名’@‘localhost’identified by ‘口令’: Now()显示当日日期和时间,user()显示当前的用户,ver ...

  2. MYSQL复习笔记12-视图

    Date: 20140223Auth: Jin参考:http://blog.sina.com.cn/s/blog_436732df0100e768.html 一.介绍1.概念视图是从一个或几个基本表( ...

  3. MYSQL复习笔记9-存储过程

    date: 20140208auth: Jin参考引用:http://blog.sina.com.cn/s/blog_52d20fbf0100ofd5.html mysql存储过程详解一.基本介绍1. ...

  4. MYSQL复习笔记2-自带工具介绍

    Date: 20140102Auth: Jin 一.mysql 命令行客户端1)base-h host-P port--socket=path,-S path用于连接的套接字文件替换使用IP PORT ...

  5. MYSQL复习笔记1-物理文件和系统架构

    date:20140101auth:Jin 一.物理组成(一) 日志文件参考:http://dev.mysql.com/doc/refman/5.1/en/server-logs.html1.错误日志 ...

  6. mysql复习笔记

    阅读目录 1.什么是SQL语句2.使用sql语句创建数据库和表3.创建数据表4.数据完整性约束5.四中基本字符类型说明6.SQL基本语句7.类型转换函数8.日期函数9.数学函数10.字符串函数11.联 ...

  7. MySQL 复习笔记

    本文内容 SQL 语句 创建数据库 创建数据表 数据完整性约束 四种基本字符类型说明 SQL 基本语句 类型转换函数 日期函数 数学函数 字符串函数 合并结果集 union CASE 函数用法 IF ...

  8. MYSQL复习笔记13-触发器trigger

    Date: 20140305Auth: Jin 一.概念1.基本概念触发器是一个被指定关联到一个表的数据对象,触发器是不需要调用的,当对一个表的特别事件出现时,它就被激活.触发器的代码也是由SQL语句 ...

  9. MYSQL复习笔记10-连接

    Date: 20140219Auth: Jin 一.介绍连接是二元运算,可以对两个表或多个表进行查询.T-SQL中分两大类,一是符合SQL标准的连接谓词表示形式,二是T-SQL扩展的使用关键字JOIN ...

随机推荐

  1. python基础===创建大量对象是节省内存方法

    问题: 你的程序要创建大量(可能上百万) 的对象,导致占用很大的内存. 解决方案: 对于主要是用来当成简单的数据结构的类而言,你可以通过给类添加__slots__属性来极大的减少实例所占的内存.比如: ...

  2. pxc群集搭建

    pxc群集搭建 1.环境 Percona-XtraDB 5.7.22-22-29.26-log percona-xtrabackup-24-2.4.12 192.168.99.210:3101(第一节 ...

  3. JavaScript跨域解决方法大全

    跨域的定义:JavaScript出于安全性考虑,同源策略机制对跨域访问做了限制.域仅仅是通过“URL的首部”字符串进行识别,“URL的首部”指window.location.protocol +win ...

  4. C#.Net实体代码生成工具(EntitysCodeGenerate)的使用及.NET中的ORM实现

    1 引言 目前大多数项目或产品都使用关系型数据库实现业务数据的存储,这样在开发过程中,常常有一些业务逻辑需要直接用写SQL语句实现,但这样开发的结果是:遍地布满SQL语句.这些藕合较高的SQL语句给系 ...

  5. mysql:视图、触发器、事务、存储、函数、流程控制

    阅读目录 一 视图 二 触发器 三 事务 四 存储过程 五 函数 六 流程控制 回到顶部 一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只 ...

  6. LocalStorage、SessionStorage使用详解

    https://blog.csdn.net/zhongzh86/article/details/55504381

  7. AC日记——[SDOI2009]HH的项链 洛谷 P1972

    [SDOI2009]HH的项链 思路: 莫队: 代码: #include <bits/stdc++.h> #define maxn 100005 #define maxm 400005 # ...

  8. JavaSwing 版本的简单扫雷游戏

    JavaSwing 版本的简单扫雷游戏 一.扫雷游戏的基本规则 1.扫雷游戏分为初级.中级.高级和自定义四个级别. 单击游戏模式可以选择"初级"."中级".&q ...

  9. JS中事件绑定问题

    今天编写代码时遇到一个问题,我的判断语句(IFLESE)老是顺序执行结束后又跳到中间的语句里去执行了,找了半天没发现问题,最后才发现是事件绑定闹得鬼,不多说,先上代码为敬. JSP里 <butt ...

  10. NOIP2018 提高组题解

    Day1 T1 据说是原题积木大赛,但是考场上蠢了,只会写数据结构,于是写了一个线段树\(+\)堆\(+\)贪心,先选出最小的,然后区间修改,然后把左右两端区间的最小值丢进堆里,不停从堆中去最小值更新 ...