Upload
beenyoung-lee
View
4.413
Download
0
Embed Size (px)
DESCRIPTION
在与互动技术团队内部分享MySQL权限体系时,所用的PPT
Citation preview
MYSQL 权限体系结构君三思 2011-3-X
MYSQL 权限认证
换一种描述方式的话,就是 YY只有从 XX 连接过来,才能够访问 ZZ
MYSQL 权限验证类别
能不能连接?
能不能操作?
MYSQL 权限验证粒度
mysql.user针对 MYSQL 服务器中
所有数据库的所有对象
全局权限
数据库级权限
mysql.db针对 MySQL 服务器中的
某个数据库
* 来访主机权限
mysql.host针对来访主机
表对象权限
mysql.tables_priv针对数据库中的表对象
表列权限
mysql.columns_priv针对表中的具体列
过程权限 mysql.proc_priv
mysql.procs_priv针对程序的权限
( 含 Procedure 和 Function)
MYSQL 权限验证粒度 -- 全局
全局权限数据库权限
表对象权限 程序权限
列权限
拥有该 MySQL 服务器下所有数据库的 [ 所有 ] 对象的 [ 所有 ] 权限权限信息记入 mysql.user 表新建用户默认拥有登录权限及访问 TEST 和 TEST_% 库权限查询 mysql.user 获取已授予权限,或通过 show grants 命令获取。
全局权限
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 | |+-----------------------+-----------------------------------+------+-----+---------+-------+
MYSQL 权限验证粒度 -- 数据库
数据库权限 全局权限
表对象权限 程序权限
列权限
拥有指定数据库中 [ 所有 ] 对象的 [ 所有 ] 权限权限信息记入 mysql.db 表
数据库级权限
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 | |+-----------------------+---------------+------+-----+---------+-------+
MYSQL 权限验证粒度 -- 表
表对象权限
全局权限
程序权限
列权限
拥有指定表对象的 [ 所有 ] 权限权限信息记入 mysql.tables_priv 表
表对象级权限
数据库权限
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 | | | |+-------------+----------------------+------+-----+-------------------+-----------------------------+
MYSQL 权限验证粒度 -- 列
列权限
全局权限
程序权限 MYSQL 权限体系中表对象的最细粒度拥有指定表对象的指定列的[ 所有 ] 权限权限信息记入 mysql.columns_priv 表和 mysql.tables_priv 表
列级权限
数据库权限
表对象权限
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 | | | |+-------------+--------------------+------+-----+-------------------+-----------------------------+
MYSQL 权限验证粒度 -- 程序
程序权限
全局权限
列权限
特 指 Procedure 和 Function两类对象拥有指定对象的 [ 所有 ] 权限权限信息记入 mysql.procs_priv 表
程序权限
数据库权限
表对象权限
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 |+--------------+-----------------------------+------+-----+-------------------+-----------------------------+
MYSQL 权限验证粒度 -- 总结
mysql.user 表决定是否允许或拒绝客户端的连接请求。对于允许的连接, user 表授予的权限指出用户的全局权限,这些权限适用于服务器上的所有数据库。
mysql.db 表范围列决定用户能从哪个主机存取哪个数据库。权限列决定允许哪个操作。授予的数据库级别的权限适用于数据库和它的表。
tables_priv,columns_priv,procs_priv 提供对象级细粒度权限
user/db/host 几个字典表中, host 、 Column_name 值的对大小写不敏感。 User 、 Password 、 Db 和 Table_name 值对大小写敏感。
权限的授予
• 授予命令语法: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 权限表
权限的收回
• 收回命令语法: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.%';
授权表何时被重新加载
grant 、 revoke 、 set password 、 rename user 等系统命令对权限的修改,会立刻触发系统重新载入授权表 (grant tables)
手动修改权限相关字典表方式 (insert,update,delete) ,并不会重新加载授权表,除非重启 MySQL 服务,或DBA 手动执行命令重载授权表
授权表被重新加载后何时生效
表、列及过程级权限将在客户端下次执行操作时生效
全局权限对已连接的客户端无效,下次连接时才会生效( 含用户的密码修改 )
数据库的权限将在客户端执行 use db_name 语句时生效
MYSQL 中两个特殊的数据库
默认创建 默认所有用户均有操作权限 存在一定安全隐患 "test_" 开头数据库均有上述特点
虚拟对象,由MySQL自动维护 所有用户能够登录到mysql 的用户均有该库读取权限 无法为 information_schema 中的对象做授权操作
问答环节!