26 安全管理
26.1 访问控制
- MySQL服务器idea安全基础是:用户应该对他们需要的数据具有适当的访问权,既不能多也不能少。换句话说,用户不能对过多的数据具有过多的访问权。
- 可虑以下内容:
- 多数用户只需要对表进行读和写,但少数用户甚至需要能创建和删除表
- 某些用户需要读表,但可能不需要更新表
- 你可能想允许用户添加数据,但不允许他们删除数据
- 某些用户(管理员)可能需要处理用户账号的权限,但多数用户不需要
- 你可能想让用户通过存储过程访问数据,但不允许他们直接访问数据
- 你可能想根据用户的登录点限制对某些功能的访问
- 即你需要给用户提供他们所需要的访问权,且仅提供他们所需的访问权。这就是所谓的访问控制,管理访问控制需要创建和管理用户账号。
- 使用MySQL Administrator 它提供一个图形用户界面,可用来管理用户及账号权限。
- 在现实世界的日常工作中,绝不能使用root。应该创建一系列的账号,有的用于管理,有的供用户使用,有的供开发人员使用,等等。
- 防止无意的错误 访问控制的目的不仅仅是防止用户的恶意企图。数据梦魇更为常见的是无意识错误的结果,如错打SQL语句,在不合适的数据库中操作或其他一些用户错误。通过保证用户不能执行他们不应该执行的语句,访问控制有助于避免这些情况的发生。
- 不要使用root 应该严肃对待root登录的使用。仅在绝对需要时使用它。不应该在日常的MySQL操作中使用root。
26.2 管理用户
- MySQL用户账号和信息存储在名为mysql的MySQL数据库中。一般不需要直接访问mysql数据库和表,但有时需要直接访问。需要直接访问它的时机之一是在需要获得所有用户账号列表时。为此,可使用以下代码:
use mysql;
select user from user;
+-----------+
| user |
+-----------+
| mysql.sys |
| root |
+-----------+
- mysql数据库有一个名为user的表,它包含所有的用户账号。user表有一个名为user的列,它存储用户登录名。
26.2.1 创建用户账号
- 为了创建一个新用户账号,使用create user语句,如下所示:
create user ben identified by 'p@$$w0rd';
- create user创建一个新用户账号。在创建用户账号时不一定需要口令,不过这个例子用identified by 'p@$$w0rd' 给出了一个口令。
- 指定散列口令 identified by指定的口令为纯文本,MySQL将在保存到user表之前对其进行加密。为了作为散列值指定口令,使用identified by password。
- 使用grant或insert grant语句也可以创建用户账号,但一般来说create user是最清楚和最简单的语句。此外,也可以直接插入行到user表来增加用户,不过为安全起见,一般不建议这样做。MySQL用来存储用户账号信息的表极为重要,对它们的任何毁坏都可能严重地伤害到MySQL服务器。因此,相对于直接处理来说,最好是用标记和函数来处理这些表。
- 为了重新命名一个用户账号,使用rename user语句,如下所示:
rename user ben to bforta;
26.2.2 删除用户账号
- 为了删除一个用户账号,使用drop user语句,如下所示:
drop user bforta;
__26.2.3 设置访问权限
- 在创建用户账号后,必须接着分配访问权限。新创建的用户账号没有访问权限。它们能登录MySQL,但不能看到数据,不能执行任何数据库操作。
- 为看到赋予用户账号的权限,使用show grants for,如下所示:
show grants for bforta;
+------------------------------------+
| Grants for bforta@% |
+------------------------------------+
| GRANT USAGE ON *.* TO 'bforta'@'%' |
+------------------------------------+
- 输出结果显示用户bforta有一个权限usage on .。usage表示根本没有权限,所以,此结果表示在任意数据库和任意表上对任何东西没有权限。
- 为了设置权限,使用grant语句。grant要求你至少给出以下信息:
- 要授予的权限
- 被授予访问权限的数据库或表
- 用户名
- 以下例子给出grant的用法:
grant select on crashcourse.* to bforta;
- 此grant允许用户在crashcourse.*(crashcourse数据库的所有表)上使用select。通过只授予select访问权限,用户bforta对crashcourse数据库中的所有数据具有只读访问权限。
- show grants反映这个更改:
show grants for bforta;
+-------------------------------------------------+
| Grants for bforta@% |
+-------------------------------------------------+
| GRANT USAGE ON *.* TO 'bforta'@'%' |
| GRANT SELECT ON `crashcourse`.* TO 'bforta'@'%' |
+-------------------------------------------------+
- 每个grant添加用户的一个权限。MySQL读取所有授权,并根据它们确定权限。
- grant的反操作为revoke,用它来撤销特定的权限。下面举一个例子:
revoke select on crashcourse.* from bforta;
- 这条revoke语句取消刚赋予用户bforta的select访问权限。被撤销的访问权限必须存在,否则会出错。
- 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 | 无访问权限 |
- 使用grant和revoke,在结合表列出的权限,你能对用户可以有完全控制。
- 简化多次授权 可通过列出各权限并用逗号分隔,将多条grant语句串在一起,如下所示:
grant select, insert on crashcourse.* to bforta;
26.2.4 更改口令
- 为了更改口令,可使用set password语句。新口令必须如下加密:
set password for bforta = Password('n3w p@$$w0rd');
- set password更新用户口令。新口令必须传递到Password()函数进行加密。
- set password还可以用来设置你自己的口令:
set password = Password('n3w p@$$w0rd');
- 在不指定用户名时,set password更新当前登录用户的口令。