MySQL必知应会-第28章-安全管理

第28章-安全管理

数据库服务器通常包含关键的数据,确保这些数据的安全和完整需要利用访问控制。本章将学习MySQL的访问控制和用户管理。

28.1 访问控制

MySQL服务器的安全基础是:
用户应该对他们需要的数据具有适当的访问权,既不能多也不能少。换句话说,用户不能对过多的数据具有过多的访问权。考虑以下内容:

  • 多数用户只需要对表进行读和写,但少数用户甚至需要能创建和删除表;
  • 某些用户需要读表,但可能不需要更新表;
  • 你可能想允许用户添加数据,但不允许他们删除数据;
  • 某些用户(管理员)可能需要处理用户账号的权限,但多数用户不需要;
  • 你可能想让用户通过存储过程访问数据,但不允许他们直接访问数据;
  • 你可能想根据用户登录的地点限制对某些功能的访问。这些都只是例子,但有助于说明一个重要的事实,即你需要给用户提供他们所需的访问权,且仅提供他们所需的访问权。这就是所谓的访问控制,管理访问控制需要创建和管理用户账号。263198 使用MySQL Administrator MySQL Administrator (在第2章中描述)提供了一个图形用户界面,可用来管理用户及账号权限。MySQL Administrator在内部利用本章介绍的语句,使你能交互地、方便地管理访问控制。回忆一下第3章的内容,我们知道,为了执行数据库操作,需要登录MySQL。 MySQL创建一个名为root的用户账号,它对整个MySQL服务器具有完全的控制。你可能已经在本书各章的学习中使用root进行过登录,在对非现实的数据库试验MySQL时,这样做很好。不过在现实世界的日常工作中,决不能使用root。应该创建一系列的账号,有的用于管理,有的供用户使用,有的供开发人员使用,等等。防止无意的错误 重要的是注意到,访问控制的目的不仅仅是防止用户的恶意企图。数据梦魇更为常见的是无意识错误的结果,如错打MySQL语句,在不合适的数据库中操作或其他一些用户错误。通过保证用户不能执行他们不应该执行的语句,访问控制有助于避免这些情况的发生。不要使用root 应该严肃对待root登录的使用。仅在绝对需要时使用它(或许在你不能登录其他管理账号时使用)。不应该在日常的MySQL操作中使用root。

28.2 管理用户

MySQL用户账号和信息存储在名为mysql的MySQL数据库中。一般不需要直接访问mysql数据库和表(你稍后会明白这一点),但有时需要直接访问。需要直接访问它的时机之一是在需要获得所有用户账号列表时。为此,可使用以下代码:
pic
mysql数据库有一个名为user的表, 它包含所有用户账号。user表有一个名为user的列,它存储用户登录名。新安装的服务器可能只有一个用户(如这里所示), 过去建立的服务器可能具有很多用户。用多个客户机进行试验 试验对用户账号和权限进行更改的最好办法是打开多个数据库客户机(如mysql命令行实用程序的多个副本),一个作为管理登录,其他作为被测试的用户登录。

28.2.1 创建用户账号

为了创建一个新用户账号,使用CREATE USER语句,如下所示:
pic
CREATE USER创建一个新用户账号。在创建用户账号时不一定需要口令,不过这个例子用IDENTIFIED BY ‘p@$$wOrd’给出了一个口令。如果你再次列出用户账号,将会在输出中看到新账号。指定散列口令 IDENTIFIED BY指定的口令为纯文本, MySQL将在保存到user表之前对其进行加密。为了作为散列值指定口令,使用IDENTIFIED BY PASSWORD。使用GRANT或INSERT GRANT语句(稍后介绍)也可以创建用户账号,但一般来说CREATE USER是最清楚和最简单的句子。此外, 也可以通过直接插入行到user表来增加用户, 不过为安全起见,一般不建议这样做。 MySQL用来存储用户账号信息的表(以及表模式等)极为重要,对它们的任何毁坏都可能严重地伤害到MySQL服务器。因此,相对于直接处理来说,最好是用标记和函数来处理这些表。为重新命名一个用户账号,使用RENAME USER语句,如下所示:
pic

MySQL 5之前 仅MySQL 5或之后的版本支持RENAME USER。为了在以前的MySQL中重命名一个用户,可使用UPDATE直接更新user表。

28.2.2 删除用户账号

为了删除一个用户账号(以及相关的权限),使用DROP USER语句,如下所示:
pic
MySQL 5之前 自MySQL 5以来, DROP USER删除用户账号和所有相关的账号权限。在MySQL 5以前, DROP USER只能用来删除用户账号,不能删除相关的权限。因此,如果使用旧版本的MySQL,需要先用REVOKE删除与账号相关的权限,然后再用DROP USER删除账号。

28.2.3 设置访问权限

在创建用户账号后,必须接着分配访问权限。新创建的用户账号没有访问权限。它们能登录MySQL,但不能看到数据,不能执行任何数据库操作。为看到赋予用户账号的权限,使用SHOW GRANTS FOR,如下所示:
pic

输出结果显示用户bforta有一个权限USAGE ON *.*。 USAGE表示根本没有权限(我知道,这不很直观),所以,此结果表示在任意数据库和任意表上对任何东西没有权限。用户定义为user@host MySQL的权限用用户名和主机名结合定义。如果不指定主机名,则使用默认的主机名%(授予用户访问权限而不管主机名)。为设置权限,使用GRANT语句。 GRANT要求你至少给出以下信息:

  • 要授予的权限;
  • 被授予访问权限的数据库或表;
  • 用户名。
    以下例子给出GRANT的用法:
    pic

此GRANT允许用户在crashcourse.*(crashcourse数据库的所有表)上使用SELECT。通过只授予SELECT访问权限,用户bforta对crashcourse数据库中的所有数据具有只读访问权限。
每个GRANT添加(或更新)用户的一个权限。 MySQL读取所有授权,并根据它们确定权限。GRANT的反操作为REVOKE,用它来撤销特定的权限。下面举一个例子:
pic
这条REVOKE语句取消刚赋予用户bforta的SELECT访问权限。 被撤销的访问权限必须存在,否则会出错。
GRANT和REVOKE可在几个层次上控制访问权限:

  • 整个服务器,使用GRANT ALL和REVOKE ALL;
  • 整个数据库,使用ON database.*;
  • 特定的表,使用ON database.table;
  • 特定的列;
  • 特定的存储过程。

表28-1列出可以授予或撤销的每个权限。
pic
pic
使用GRANT和REVOKE,再结合表28-1中列出的权限,你能对用户可以就你的宝贵数据做什么事情和不能做什么事情具有完全的控制。未来的授权 在使用GRANT和REVOKE时,用户账号必须存在,但对所涉及的对象没有这个要求。这允许管理员在创建数据库和表之前设计和实现安全措施。这样做的副作用是,当某个数据库或表被删除时(用DROP语句),相关的访问权限仍然存在。而且,如果将来重新创建该数据库或表,这些权限仍然起作用。简化多次授权 可通过列出各权限并用逗号分隔,将多条GRANT语句串在一起,如下所示:

28.2.4 更改口令

为了更改用户口令,可使用SET PASSWORD语句。新口令必须如下加密:
pic
SET PASSWORD更新用户口令。新口令必须传递到Password()函数进行加密。270204 SET PASSWORD还可以用来设置你自己的口令:
set password = password(‘myownpassword’);

在不指定用户名时, SET PASSWORD更新当前登录用户的口令。

28.3 小结

本章学习了通过赋予用户特殊的权限进行访问控制和保护MySQL服务器。

猜你喜欢

转载自www.cnblogs.com/LearnFromNow/p/9349881.html