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更新当前登录用户的口令。
posted @ 2018-01-16 10:50  _sanjun  阅读(134)  评论(0编辑  收藏  举报