『MySQL』安全管理
访问控制
MySQL服务器的安全基础是:用户应该对他们需要的数据具有适当的访问权,既不能多也不能少。
换句话说,用户不能对过多的数据具有过多的访问权。
考虑以下内容:
- 多数用户只需要对表进行读和写,但少数用户甚至需要能创建和删除表。
- 某些用户需要读表,但可能不需要更新表。
- 你可能想允许用户添加数据,但不允许他们删除数据。
- 某些用户(管理员)可能需要处理用户账号的权限,但多数用户不需要。
- 你可能想让用户通过存储过程访问数据,但不允许他们直接访问数据。
- 你可能想根据用户登陆的地点限制对某些功能的访问。
这些都只是例子,这有助于说明一个重要的事实,即你需要给用户提供他们所需的访问全,且仅提供他们所需的访问权。这就是访问控制,管理访问控制需要创建和管理用户账号。
使用MySQL Administrator:MySQL Administrator提供了一个图形用户界面,可用来管理用户及账号权限。
MySQL创建一个名为
root
的用户账号,它对整个MySQL服务器具有完全的控制。不过在现实世界的日常工作中,绝不能使用
root
,应该创建一系列的账号,有的用于管理,有的供用户使用,有的供开发人员使用。
防止无意的错误:访问控制的目的不仅仅是防止用户的恶意企图。数据梦魇更为常见的是无意识错误的结果,如打错MySQL语句,在不合适的数据库中操作或其他一些用户错误。通过保证用户不能执行他们不应该执行的语句,访问控制有助于避免这些情况发生。
不要使用root:应该严肃对待
root
登录的使用。仅在绝对需要时使用它(或许在你不能登录其他管理账号时使用)。不应该在日常的MySQL操作中使用
root
。
管理用户
MySQL用户账号和信息存储在名为
mysql
的数据库中。一般不需要直接访问mysql
数据库和表。需要直接访问它的时机之一是在需要获得所有用户账号列表时。
1 | -- 获得所有用户账号列表 |
- 用多个客户机进行试验:试验对用户账号和权限进行更改的最好办法是打开多个数据库客户机(如mysql命令行实用程序的多个副本),一个作为管理登录,其他作为被测试的用户登录。
创建用户账号
1 | -- 创建新用户账号 |
指定散列口令:
IDENTIFIED BY
指定的口令为纯文本,MySQL将在保存到user
表之前对其进行加密。为了作为散列值指定口令,使用
IDENTIFIED BY PASSWORD
。使用GRANT或INSERT:
GRANT
语句也可以创建用户账号,但一般来说CREATE USER
是最清楚最简单的句子。此外,也可以通过直接插入行到
user
表来增加用户,不过为安全起见,一般不建议这样做。MySQL用来存储用户账号信息的表(以及表模式等)极为重要,对它们的任何毁坏都可能严重的伤害到MySQL服务器。因此,相对于直接处理来说,最好是用标记和函数来处理这些表。
1 | -- 重新命名一个用户账号 |
仅在MySQL 5或之后的版本支持
RENAME USER
。为了在以前的MySQL中重命名一个用户,可使用
UPDATE
直接更新user
表。
删除用户账号
1 | -- 删除一个用户账号,以及相关的权限 |
MySQL 5之前:自MySQL 5以来,
DROP USER
删除用户账号和所有相关的账号权限。在MySQL 5之前,
DROP USER
只能用来删除账号,不能删除相关的权限。因此,如果使用旧版本的MySQL,需要先用
REVOKE
删除与账号相关的权限,然后再用DROP USER
删除账号。
设置访问权限
在创建用户账号后,必须接着分配访问权限。
新创建的用户账号没有访问权限。
1 | -- 查看赋予用户账号的权限 |
用户定义为user@host:MySQL的权限用用户名和主机名结合定义。
如果不指定主机名,则使用默认的主机名
%
(授予用户访问权限而不管主机名)。GRANT
要求至少给出以下信息:- 要授予的权限。
- 被授予访问权限的数据库或表。
- 用户名。
1 | GRANT SELECT ON crashcourse.* TO bforta; |
GRANT
和REVOKE
可在几个层次上控制访问权限:- 整个服务器,使用
GRANT ALL
和REVOKE ALL
。 - 整个数据库,使用
ON database.*
。 - 特定的表,使用
ON database.table
。 - 特定的列。
- 特定的存储过程。
如下列出可以授予或撤销的每个权限:
- 整个服务器,使用
权限 | 说明 |
---|---|
ALL | 除GRANT OPTION 外的所有权限 |
ALTER | 使用ALTER TABLE |
ALTER ROUTINE | 使用ALTER PROCEDURE 和DROP PROCEDURE |
CREATE | 使用CREATE TABLE |
CREATE ROUTINE | 使用CREATE PROCEDURE |
CREATE TEMPORARY TABLES | 使用CREATE TEMPORARY TABLE |
CREATE USER | 使用CREATE USER 、DROP USER 、RENAME USER 和REVOKE ALL PRIVILEGES |
CREATE VIEW | 使用CREATE VIEW |
DELETE | 使用DELETE |
DROP | 使用DROP TABLE |
EXECUTE | 使用CALL 和存储过程 |
FILE | 使用SELECT INTO OUTFILE 和LOAD DATA INFILE |
GRANT OPTION | 使用GRANT 和REVOKE |
INDEX | 使用CREATE INDEX 、DROP INDEX |
INSERT | 使用INSERT |
LOCK TABLES | 使用LOCK TABLES |
PROCESS | 使用SHOW FULL PROCESSLIST |
RELOAD | 使用FLUSH |
REPLICATION CLIENT | 服务器位置的访问 |
REPLICATION SLAVE | 由复制从属使用 |
SELECT | 使用SELECT |
SHOW DATABASES | 使用SHOW DATABASES |
SHOW VIEW | 使用SHOW CREATE VIEW |
SHUTDOWN | 使用mysqladmin shutdown (用来关闭MySQL) |
SUPER | 使用CHANGE MASTER 、KILL 、LOGS 、PURGE 、MASTER 和SET GLOBAL 。还允许mysqladmin 调试登录 |
UPDATE | 使用UPDATE |
USAGE | 无访问权限 |
未来的授权:允许管理员在创建数据库和表之前设计和实现安全措施。
副作用是,当某个数据库或表被删除时(用
DROP
语句),相关的访问权限仍然存在。而且,如果将来重新创建该数据库或表,这些权限仍然起作用。简化多次授权:可通过列出各权限并用逗号分隔,将多条
GRANT
语句串在一起,如下:GRANT SELECT, INSERT ON crashcourse.* TO bforta;
更改口令
1 | -- 为了更改用户口令,可使用SET PASSWORD语句。新口令必须如下加密: |