MySQL服务器的安全基础是:用户应该对他们需要的数据具有适当的访问权,既不能多也不能少。换句话说,普通用户不能对过多的数据具有过多的访问权。
最佳实践:
在生产环境中,不要使用root。应该创建一系列的账号,分别用于管理、供用户使用、供开发人员使用等。
用户管理
当MySQL安装完成后,MySQL用户账号信息存储在mysql数据库中。mysql数据库中有一个名为user的表,它包含所有的用户账号。用户管理就是围绕这个表开始的,当然还有一些表,例如:tables_priv,procs_priv,clumns_priv,information_schema数据库里面的USER_PRIVILEGES等。 1、创建用户账号
Syntax:
CREATE USER user_specification
[, user_specification] ...
user_specification:
user [IDENTIFIED BY [PASSWORD] 'password']
-- For each account, CREATE USER creates a new row in
-- the mysql.user table and assigns the account no privileges.
假设我想创建一个skype用户:
mysql> CREATE USER 'skype'@'localhost' IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.07 sec) 但是请注意,CREATE USER虽然可以创建用户,但是它也仅仅是创建用户,并没有给用户账号分配权限,它们能登录MySQL,但是不能执行任何数据库操作。所以我们还得单独使用GRANT命令为用户授权。
使用GRANT或INSERT GRANT语句和INSERT语句也可以创建用户账号,因为它们涉及直接操作mysql.user表,不建议这样操作。而使用CREATE USER更简单和清晰,推荐使用。 2、删除用户账号
Syntax:
DROP USER user [, user] ...
-- The DROP USER statement removes one or more MySQL accounts and their
-- privileges.
DROP USER 会删除用户账号和所有该账号相关的权限。
实例:删除我们刚才创建的账号
mysql> DROP USER 'skype'@'localhost';
Query OK, 0 rows affected (0.00 sec)
在这里为什么要用'skype'@'localhost'当用户名,而不是直接skype呢,因为mysql.user这张表,是通过用户名和host共同决定一个用户,你可查看一下表结构就知道了。如果不指定host,则使用默认的主机名 % 通配符。
用户的构成: uesrname@host
host可以是下面几种类型:
hostname
IP
网络地址, 如 192.168.%.%
账号:仅仅用于认证
权限:对资源的访问控制
show create table mysql.user \G; 你会发现有这个东西PRIMARY KEY (`Host`,`User`),表示联合主键
设置访问权限
创建用户账号之后,必须接着分配访问权限。新创建的用户账号没有访问权限。它们能登录MySQL,但是不能看到数据,不能执行任何数据库操作。 1、查看授予用户的权限
mysql> CREATE USER 'test1'@'localhost' IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.00 sec)
| MAX_USER_CONNECTIONS count -- 最大用户连接数
看着这一大堆语法头就晕了,那么只要根据上述那个图,就很好理解了:
GRANT 权限
ON 应用范围(数据库表,方法等)
TO 用户(用@隔开,前面是用户名后面是主机名'用户名'@'主机名')
IDENTITIED BY 密码
REQUIRE 要求什么的
WITH 对用户的进行的执行sql的条数控制。
假设,我为test1账号授予对study库中所有表有SELECT权限:
-- test1用户对study库中的所有表可SELECT
mysql> GRANT SELECT ON study.* TO 'test1'@'localhost';
Query OK, 0 rows affected (0.00 sec)
GRANT SELECT, UPDATE ON study.orders TO 'test1'@'localhost';
--对study.orders表有SELECT, UPDATE 权限
GRANT SELECT(order_num), update(order_num, order_date) ON study.orders TO 'test1'@'localhost';
-- 对orders表的order_num字段可SELECT,对order_num, order_date有UPDATE权限
相反, 我要取消test1用户的SELECT权限:
mysql> REVOKE SELECT ON study.* FROM 'test1'@'localhost';
Query OK, 0 rows affected (0.00 sec)
这个是去掉一个权限,如果我要全部去掉怎么办呢,一个一个写太麻烦了,看下面的一个例子
mysql> REVOKE ALL, GRANT OPTION FROM 'test1'@'localhost'; -- 这玩意儿很好用哦
Query OK, 0 rows affected (0.00 sec)