MySQL安全、用户语句和函数

用户访问权限信息存储在一组规则的MyISAM表中,称之为授权表。这些表位于mysql数据库中,分别是:

  • user :全局层级权限(gobal privileges)
  • db:数据库层级权限(database-specific privileges)
  • tables_priv:表层级权限(table-specific privilege)
  • columns_priv:列层级权限(column-specific privilege)

其他表提供了用户访问和安全的细调(fine-tuning)。可以直接使用标准的SQL语句在这些表中操纵数据,后面接着FLUSH PRIVILEGES语句来更新服务器缓存。不过更推荐专门的SQL语句来管理用户并设置访问权

  • CREATE USER:创建用户
  • GRANT:创建用户账户,为新用户账户设置权限或者为现有的用户设置权限
  • REVOKE:撤销权限
  • RENAME USER:修改用户名
  • SET PASSWORD:修改密码
  • DROP USER:删除用户账户

语句和函数

与安全和用户有关的语句列表
CREATE USER、DROP USER、FLUSH、GRANT、RENAME USER、RESET、REVOKE、SE PASSWORD、SHOW GRANTS、SHOW PRIVILEGES

与函数有关的语句列表
AES_DECRYPT()、AES_ENCRYPT()、CURRENT_USER()、DECODE()、DES_DECRYPT()、DES_ENCRYPT()、ENCODE()、ENCRYPT()、MD5()、OLD_PASSWORD()、PASSWORD()、SESSION_USER()、SHA()、SHA1()、SYSTEM_USER()、USER()

CREATE USER

CREATE USER 'user'[@'host'] [IDENTIFIED BY [PASSWORD] 'password'][, ...]

host使用localhost或者127.0.0.1可以本地访问MySQL,使用通配符%允许客户端指定用户从任意主机连接。
用户密码位于IDENTIFIED BY子句之后,并在引号中用存文本给出。不必使用PASSWORD()对密码加密;密码加密工作会自动完成。如果打算把密码设置成哈希值,使用IDENTIFIED BY PASSWORD子句,如果没有指定password子句,密码为空。后续使用SET PASSWORD语句来设置密码。

使用逗号分隔的列表指定多个用户账户。

DROP USER

DROP USER 'user'@'host'

从MySQL5.0.2版本开始,这条语句将删除用户账户和来自所有授权表的特权。
一些用户可能不止有一个账户(用户和主机的组合)。为了确保这一点,应该检查mysql.user表:

select user,host from mysql.user where user like 'sss';

5.0.2版本之前,drop user并不删除具有全局权限的用户。为了撤销用户账户的权限,在使用drop user之前,使用revoke语句

revoke  all on *.* from ''@'';
drop user 'use'@'host'

all选项用以确保删除所有权限。*.* 涵盖了所有数据库中的所有表。
在mysdql4.1.1版本之前,必须使用如下语句而不是drop user语句:

delete from mysql.user where user='' and host = '';
flush privileges;

必须使用flush privileges才能令前面的delete 语句失效。而在drop user语句之后,这个语句并非必须的。

FLUSH语法

FLUSH [LOCAL|NO_WRITE_TO_BINLOG] option[,…]
选项:
DES_KEY_FILE,HOSTS,LOGS,MASTER,PRIVILEGE,QUERY_CACHE,STATUS,TABLE,TABLES,TABLES WITHOUT READ LOCK,USER_RESOURCES

使用FLUSH语句可以清楚并且重载MySQL的临时缓存。想要执行FLUSH命令,必须拥有RELOAD权限。为了防止该语句携入二进制日志文件,可以使用NO_WRITE_TO_BINLOG标记或者其别名LOCAL。
从5.1版本开始,FLUSH不能用在存储函数和触发器中,但是可以用在存储过程之中。

GRANT 语法

GRANT
    priv_type [(column_list)]
      [, priv_type [(column_list)]] ...
    ON [object_type] priv_level
    TO user [auth_option] [, user [auth_option]] ...
    [REQUIRE {NONE | tls_option [[AND] tls_option] ...}]
    [WITH {GRANT OPTION | resource_option} ...]


GRANT PROXY ON user
    TO user [, user] ...
    [WITH GRANT OPTION]

object_type: {
    TABLE
  | FUNCTION
  | PROCEDURE
}

priv_level: {
    *
  | *.*
  | db_name.*
  | db_name.tbl_name
  | tbl_name
  | db_name.routine_name
}

user:
    (see Section 6.2.4, “Specifying Account Names”)

auth_option: {
    IDENTIFIED BY 'auth_string'
  | IDENTIFIED WITH auth_plugin
  | IDENTIFIED WITH auth_plugin BY 'auth_string'
  | IDENTIFIED WITH auth_plugin AS 'auth_string'
  | IDENTIFIED BY PASSWORD 'auth_string'
}

tls_option: {
    SSL
  | X509
  | CIPHER 'cipher'
  | ISSUER 'issuer'
  | SUBJECT 'subject'
}

resource_option: {
  | MAX_QUERIES_PER_HOUR count
  | MAX_UPDATES_PER_HOUR count
  | MAX_CONNECTIONS_PER_HOUR count
  | MAX_USER_CONNECTIONS count
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章