mysql权限体系结构 by junsansi

21
MYSQL 权权 权权权 权权权 2011-3-X

Upload: beenyoung-lee

Post on 04-Dec-2014

4.413 views

Category:

Technology


0 download

DESCRIPTION

在与互动技术团队内部分享MySQL权限体系时,所用的PPT

TRANSCRIPT

Page 1: Mysql权限体系结构   by junsansi

MYSQL 权限体系结构君三思 2011-3-X

Page 2: Mysql权限体系结构   by junsansi

MYSQL 权限认证

换一种描述方式的话,就是 YY只有从 XX 连接过来,才能够访问 ZZ

Page 3: Mysql权限体系结构   by junsansi

MYSQL 权限验证类别

能不能连接?

能不能操作?

Page 4: Mysql权限体系结构   by junsansi

MYSQL 权限验证粒度

mysql.user针对 MYSQL 服务器中

所有数据库的所有对象

全局权限

数据库级权限

mysql.db针对 MySQL 服务器中的

某个数据库

* 来访主机权限

mysql.host针对来访主机

表对象权限

mysql.tables_priv针对数据库中的表对象

表列权限

mysql.columns_priv针对表中的具体列

过程权限 mysql.proc_priv

mysql.procs_priv针对程序的权限

( 含 Procedure 和 Function)

Page 5: Mysql权限体系结构   by junsansi

MYSQL 权限验证粒度 -- 全局

全局权限数据库权限

表对象权限 程序权限

列权限

拥有该 MySQL 服务器下所有数据库的 [ 所有 ] 对象的 [ 所有 ] 权限权限信息记入 mysql.user 表新建用户默认拥有登录权限及访问 TEST 和 TEST_% 库权限查询 mysql.user 获取已授予权限,或通过 show grants 命令获取。

全局权限

Page 6: Mysql权限体系结构   by junsansi

MYSQL 权限验证粒度 -- 全局mysql> desc mysql.user;+-----------------------+-----------------------------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+-----------------------+-----------------------------------+------+-----+---------+-------+| Host | char(60) | NO | PRI | | || User | char(16) | NO | PRI | | || Password | char(41) | NO | | | || Select_priv | enum('N','Y') | NO | | N | || Insert_priv | enum('N','Y') | NO | | N | || Update_priv | enum('N','Y') | NO | | N | || Delete_priv | enum('N','Y') | NO | | N | || Create_priv | enum('N','Y') | NO | | N | || Drop_priv | enum('N','Y') | NO | | N | || Reload_priv | enum('N','Y') | NO | | N | || Shutdown_priv | enum('N','Y') | NO | | N | || Process_priv | enum('N','Y') | NO | | N | || File_priv | enum('N','Y') | NO | | N | || Grant_priv | enum('N','Y') | NO | | N | || References_priv | enum('N','Y') | NO | | N | || Index_priv | enum('N','Y') | NO | | N | || Alter_priv | enum('N','Y') | NO | | N | || Show_db_priv | enum('N','Y') | NO | | N | || Super_priv | enum('N','Y') | NO | | N | || Create_tmp_table_priv | enum('N','Y') | NO | | N | || Lock_tables_priv | enum('N','Y') | NO | | N | || Execute_priv | enum('N','Y') | NO | | N | || Repl_slave_priv | enum('N','Y') | NO | | N | || Repl_client_priv | enum('N','Y') | NO | | N | || Create_view_priv | enum('N','Y') | NO | | N | || Show_view_priv | enum('N','Y') | NO | | N | || Create_routine_priv | enum('N','Y') | NO | | N | || Alter_routine_priv | enum('N','Y') | NO | | N | || Create_user_priv | enum('N','Y') | NO | | N | || Event_priv | enum('N','Y') | NO | | N | || Trigger_priv | enum('N','Y') | NO | | N | || ssl_type | enum('','ANY','X509','SPECIFIED') | NO | | | || ssl_cipher | blob | NO | | NULL | || x509_issuer | blob | NO | | NULL | || x509_subject | blob | NO | | NULL | || max_questions | int(11) unsigned | NO | | 0 | || max_updates | int(11) unsigned | NO | | 0 | || max_connections | int(11) unsigned | NO | | 0 | || max_user_connections | int(11) unsigned | NO | | 0 | |+-----------------------+-----------------------------------+------+-----+---------+-------+

Page 7: Mysql权限体系结构   by junsansi

MYSQL 权限验证粒度 -- 数据库

数据库权限 全局权限

表对象权限 程序权限

列权限

拥有指定数据库中 [ 所有 ] 对象的 [ 所有 ] 权限权限信息记入 mysql.db 表

数据库级权限

Page 8: Mysql权限体系结构   by junsansi

MYSQL 权限验证粒度 -- 数据库

mysql> desc mysql.db;+-----------------------+---------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+-----------------------+---------------+------+-----+---------+-------+| Host | char(60) | NO | PRI | | || Db | char(64) | NO | PRI | | || User | char(16) | NO | PRI | | || Select_priv | enum('N','Y') | NO | | N | || Insert_priv | enum('N','Y') | NO | | N | || Update_priv | enum('N','Y') | NO | | N | || Delete_priv | enum('N','Y') | NO | | N | || Create_priv | enum('N','Y') | NO | | N | || Drop_priv | enum('N','Y') | NO | | N | || Grant_priv | enum('N','Y') | NO | | N | || References_priv | enum('N','Y') | NO | | N | || Index_priv | enum('N','Y') | NO | | N | || Alter_priv | enum('N','Y') | NO | | N | || Create_tmp_table_priv | enum('N','Y') | NO | | N | || Lock_tables_priv | enum('N','Y') | NO | | N | || Create_view_priv | enum('N','Y') | NO | | N | || Show_view_priv | enum('N','Y') | NO | | N | || Create_routine_priv | enum('N','Y') | NO | | N | || Alter_routine_priv | enum('N','Y') | NO | | N | || Execute_priv | enum('N','Y') | NO | | N | || Event_priv | enum('N','Y') | NO | | N | || Trigger_priv | enum('N','Y') | NO | | N | |+-----------------------+---------------+------+-----+---------+-------+

Page 9: Mysql权限体系结构   by junsansi

MYSQL 权限验证粒度 -- 表

表对象权限

全局权限

程序权限

列权限

拥有指定表对象的 [ 所有 ] 权限权限信息记入 mysql.tables_priv 表

表对象级权限

数据库权限

Page 10: Mysql权限体系结构   by junsansi

MYSQL 权限验证粒度 -- 表

mysql> desc mysql.tables_priv;+-------------+----------------------+------+-----+-------------------+-----------------------------+| Field | Type | Null | Key | Default | Extra |+-------------+----------------------+------+-----+-------------------+-----------------------------+| Host | char(60) | NO | PRI | | || Db | char(64) | NO | PRI | | || User | char(16) | NO | PRI | | || Table_name | char(64) | NO | PRI | | || Grantor | char(77) | NO | MUL | | || Timestamp | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP || Table_priv | set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter','Create View','Show view','Trigger')

| NO | | | || Column_priv | set('Select','Insert','Update','References')

| NO | | | |+-------------+----------------------+------+-----+-------------------+-----------------------------+

Page 11: Mysql权限体系结构   by junsansi

MYSQL 权限验证粒度 -- 列

列权限

全局权限

程序权限 MYSQL 权限体系中表对象的最细粒度拥有指定表对象的指定列的[ 所有 ] 权限权限信息记入 mysql.columns_priv 表和 mysql.tables_priv 表

列级权限

数据库权限

表对象权限

Page 12: Mysql权限体系结构   by junsansi

MYSQL 权限验证粒度 -- 列

mysql> desc mysql.columns_priv;+-------------+--------------------+------+-----+-------------------+-----------------------------+| Field | Type | Null | Key | Default | Extra |+-------------+--------------------+------+-----+-------------------+-----------------------------+| Host | char(60) | NO | PRI | | || Db | char(64) | NO | PRI | | || User | char(16) | NO | PRI | | || Table_name | char(64) | NO | PRI | | || Column_name | char(64) | NO | PRI | | || Timestamp | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP || Column_priv | set('Select','Insert','Update','References')

| NO | | | |+-------------+--------------------+------+-----+-------------------+-----------------------------+

Page 13: Mysql权限体系结构   by junsansi

MYSQL 权限验证粒度 -- 程序

程序权限

全局权限

列权限

特 指 Procedure 和 Function两类对象拥有指定对象的 [ 所有 ] 权限权限信息记入 mysql.procs_priv 表

程序权限

数据库权限

表对象权限

Page 14: Mysql权限体系结构   by junsansi

MYSQL 权限验证粒度 -- 程序

mysql> desc mysql.procs_priv;+--------------+-----------------------------+------+-----+-------------------+-----------------------------+| Field | Type | Null | Key | Default | Extra |+--------------+-----------------------------+------+-----+-------------------+-----------------------------+| Host | char(60) | NO | PRI | | || Db | char(64) | NO | PRI | | || User | char(16) | NO | PRI | | || Routine_name | char(64) | NO | PRI | | || Routine_type | enum('FUNCTION','PROCEDURE')| NO | PRI | NULL | || Grantor | char(77) | NO | MUL | | || Proc_priv | set('Execute','Alter Routine','Grant')

| NO | | | || Timestamp | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |+--------------+-----------------------------+------+-----+-------------------+-----------------------------+

Page 15: Mysql权限体系结构   by junsansi

MYSQL 权限验证粒度 -- 总结

mysql.user 表决定是否允许或拒绝客户端的连接请求。对于允许的连接, user 表授予的权限指出用户的全局权限,这些权限适用于服务器上的所有数据库。

mysql.db 表范围列决定用户能从哪个主机存取哪个数据库。权限列决定允许哪个操作。授予的数据库级别的权限适用于数据库和它的表。

tables_priv,columns_priv,procs_priv 提供对象级细粒度权限

user/db/host 几个字典表中, host 、 Column_name 值的对大小写不敏感。 User 、 Password 、 Db 和 Table_name 值对大小写敏感。

Page 16: Mysql权限体系结构   by junsansi

权限的授予

• 授予命令语法:GRANT priv_type [(column_list)] [, priv_type [(column_list)]] ... ON [object_type] priv_level TO user [IDENTIFIED BY [PASSWORD] 'password'] [, user [IDENTIFIED BY [PASSWORD] 'password']] ... [REQUIRE {NONE | ssl_option [[AND] ssl_option] ...}] [WITH with_option ...]

• 示例:授予 db 权限: grant all on jssdb.* to jss@'192.168.1.%';授予 col 权限: grant select (id) on jssdb.t1 to jss@'192.168.1.%';

• 手动方式授予权限: insert/update 权限表

Page 17: Mysql权限体系结构   by junsansi

权限的收回

• 收回命令语法:1>. REVOKE priv_type [(column_list)] [, priv_type [(column_list)]] ...

ON [object_type] priv_level FROM user [, user] ...

2>. REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ...

• 查看用户被授予的权限:show grants for [user];

• 示例:收回全局权限: revoke all from jss@'192.168.1.%';收回数据库权限: revoke all on jssdb.* from jss@'192.168.1.%';

Page 18: Mysql权限体系结构   by junsansi

授权表何时被重新加载

grant 、 revoke 、 set password 、 rename user 等系统命令对权限的修改,会立刻触发系统重新载入授权表 (grant tables)

手动修改权限相关字典表方式 (insert,update,delete) ,并不会重新加载授权表,除非重启 MySQL 服务,或DBA 手动执行命令重载授权表

Page 19: Mysql权限体系结构   by junsansi

授权表被重新加载后何时生效

表、列及过程级权限将在客户端下次执行操作时生效

全局权限对已连接的客户端无效,下次连接时才会生效( 含用户的密码修改 )

数据库的权限将在客户端执行 use db_name 语句时生效

Page 20: Mysql权限体系结构   by junsansi

MYSQL 中两个特殊的数据库

默认创建 默认所有用户均有操作权限 存在一定安全隐患 "test_" 开头数据库均有上述特点

虚拟对象,由MySQL自动维护 所有用户能够登录到mysql 的用户均有该库读取权限 无法为 information_schema 中的对象做授权操作

Page 21: Mysql权限体系结构   by junsansi

问答环节!