mysql用户和权限管理
作为一名mysql数据库管理员,有责任维护数据库系统上的数据的的完整性和安全性,使得只有被正确授权的用户才可以访问。这将涉及到数据库的外部安全性和内部安全星=性。
所谓外部安全性:就是决定用户是否可以登入到mysql数据库系统上,这样可以有效的避免来自外部网络对服务器连接的***。
内部安全性:即是防止服务器上已存在的用户对mysql服务器上面的数据进行***,因此,一个用户的权限如果设置不好的话,可能导致数据库上面的数据被删除、修改等等。
mysql的授权表
mysql客户能否访问mysql数据库是由mysql的授权表来决定的,这些授权表是在刚刚安装mysql时,进行mysql初始化(mysql_install_db脚本)生成的。这些授权表公有6个,分别是:
user:该表存放了可以访问mysql服务器的用户名和密码,该表中启用的权限为全局权限,且适用于所有库。
db:该表存放的是所有的数据库,该表启用的权限只对该数据库有效。因此,这个表设置的是数据库级别的权限。
host:该表已被废弃
tables_priv:用于指定表级别权限
columns_priv:用于指定烈级别权限
procs_priv:用于指定存储过程和存储函数的相关权限
proxies_priv:用于指定代理用户的相关权限
mysql的权限管理
出于对数据的安全性保护,因此,授予正确的权限给用户史非常重要的,下面这张表记录的就是mysql的所有权限。包括库级别、表级别、索引级别、字段级别、存储函数和存储过程级别、视图级别、文件访问级别以及全局权限等等众多权限。每一个级别及其相关的权限都在下表显示。
context:表示这些权限可以用在哪些环境或级别下。
http://dev.mysql.com/doc/mysql-security-excerpt/5.5/en/privileges-provided.html#priv_create_temporay_tables(使用这个网址可以查询到如下表结构)
PrivilegeColumnContextCreate_privdatabases, tables, or indexes
Drop_privdatabases, tables, or views
Grant_privdatabases, tables, or stored routines
Lock_tables_privdatabases
References_privdatabases or tables
Event_privdatabases
Alter_privtables
Delete_privtables
Index_privtables
Insert_privtables or columns
Select_privtables or columns
Update_privtables or columns
Create_tmp_table_privtables
Trigger_privtables
Create_view_privviews
Show_view_privviews
Alter_routine_privstored routines
Create_routine_privstored routines
Execute_privstored routines
File_privfile access on server host
Create_tablespace_privserver administration
Create_user_privserver administration
Process_privserver administration
See proxies_privtableserver administration
Reload_privserver administration
Repl_client_privserver administration
Repl_slave_privserver administration
Show_db_privserver administration
Shutdown_privserver administration
Super_privserver administration
server administration
server administration
创建用户、为用户授权和取消授权
1、创建用户
mysql> CREATE USER username@’host’ [IDENTIFIED BY ‘password’]
其中username必须在16个字符以内才行
host:可以表示的方法有这些:
HOSTNAME:例如www.baidu.com
IP:例如192.168.1.1
NETWORK:例如172.16.0.0/255.255.0.0
通配符表示法:
%:任意长度的任意字符,如%.xsl.com:表示这个域内的所有主机。
_:表示任意单个字符。
[IDENTIFIED BY ‘password’]:表示在创建用户的时候为该用户设置密码。
在连接mysql服务器时,mysql服务器为了验证远程主机的合法性,一般会进行正解和反解主机名,使用--skip-name-resolv选项可以忽略名称解析过程,这可以在某一程度上缓解mysql服务器的连接和加速mysql的性能及节约时间。
2、为用户授权
授权命令使用GRANT
GRANT的语法格式为:
mysql> GRANT
priv_type [(column_list)] [, priv_type [(column_list)]] ...
ON [object_type] priv_level
TO user_specification [, user_specification] ...
[REQUIRE {NONE | ssl_option [[AND] ssl_option] ...}]
[WITH with_option ...]
其中priv_type:表示权限类型,就是上表最左边的字段,那里有所有的权限类型
column_list:是可选字段,表示对指定的字段授权。可以指定多个。
object_type:表示对象类型,主要有有三个:
TABLE(表)、FUNCTION(存储函数)、PROCEDURE(存储过程)
priv_level:表示权限级别,设置在哪个级别下的权限
*:表示授予当前数据库级别下的权限。
| *.*:如果使用这中方式,必须要指定对象类型字段。用来说明是设定库的表、库的存储函数还是库的存储过程等相关权限。默认对象类型为table,因此默认表示所有库的所有表。
| db_name.*:如果使用这中方式,必须要指定对象类型字段。用来说明是设定库的表、库的存储函数还是库的存储过程等相关权限。默认对象类型为table,因此默认表示指定库下的所有表。
| db_name.tbl_name:表示设定某个库下的某个表的权限。
| tbl_name:表示设定在某个表的权限。
| db_name.routine_name:表示设定某个库的某个存储程序的相关权限。
user_specification:username@’hostname’ [IDENTIFIED BY [PASSWORD] 'password'],为某个用户授权。
[IDENTIFIED BY [PASSWORD] 'password']:如果该用户密码已经存在,则命令会修改该用户的密码。
说明:如果要想创建库的话,还需指定对所有的表有权限。如:
mysql> grant create on *.* to test@'localhost';
mysql> grant create on testdb.* to test@'localhost';
ssl_option:这些是使用ssl来建立mysql会话时使用的选项
SSL
| X509
with_option:
GRANT OPTION:允许将此权限传授给其他用户。
| MAX_QUERIES_PER_HOUR count:每小时的最大查询请求数
| MAX_UPDATES_PER_HOUR count:每小时的最大更新请求数
| MAX_CONNECTIONS_PER_HOUR count:每小时的最大连接数
| MAX_USER_CONNECTIONS count:同一个账号最多可以连接几次
查看用户授权信息
授权完毕后,执行flush privilege命令让系统重读授权表
重读授权表
Flush privileges
在帮用户授权完毕后,执行该命令,可以让内存重读授权表。当mysql服务启动后,系统会加载授权表到内存中去,因此,一旦授权表更改,必须让内存重读授权表。
3、取消用户授权revoke
REVOKE命令可以用来取消用户相关权限的,其语法和命令和GRANT命令大概一致
mysql> REVOKEpriv_type [(column_list)] [, priv_type [(column_list)]] ...ON [object_type] priv_level
FROM user [,user] …