摘要: 本篇博客仅做为笔记,若有侵权,请联系,当即删除(网上找博客学习,而后手记笔记,因纸质笔记不便保存,因此保存到网络笔记)。mysql
数据库服务器一般包含关键的数据,确保这些数据的安全和完整须要利用访问控制。本博将学习MySQL的访问控制和用户管理。sql
1、访问控制数据库
MySQL服务器的安全基础是:用户应该对他们须要的数据具备适当的访问权,既不能多也不能少。换句话说,用户不能对过多的数据具备过多的访问权。安全
考虑如下内容:服务器
(1)多数用户只须要对表进行读和写,但少数用户甚至须要能建立和删除表网络
(2)某些用户须要读表,但可能不须要更新表;函数
(3)你可能想容许用户添加数据,但不容许他们删除数据;学习
(4)某些用户(管理员)可能须要处理用户帐号的权限,但多数用户不须要;测试
(5)你可能想让用户经过存储过程访问数据,但不容许他们直接访问数据;加密
(6)你可能想根据用户登陆的地点限制对某些功能的访问。
这些都只是例子,但有助于说明一个重要的事实,即你须要给用户提供他们所需的访问权,且仅提供他们所需的访问权。这就是所谓的访问控制,管理访问控制须要建立和管理用户帐号。
注意:使用MySQL Administrator MySQL Administrator提供了一个图形用户界面,可用来管理用户及帐号权限。MySQL Administrator在内部利用本博介绍的语句,使你能交互地、方便地管理访问控制。
回忆一下前面的博客内容,咱们知道,为了执行数据库操做,须要登陆MySQL。MySQL建立一个名为root的用户帐号,它对整个MySQL服务器具备彻底的控制。你可能已经在本书各章的学习中使用root进行过登陆,在对非现实的数据库试验MySQL时,这样作很好。不过在现实世界的平常工做中,决不能使用root。应该建立一系列的帐号,有的用于管理,有的供用户使用,有的供开发人员使用,等等。
注意:防止无心的错误 重要的是注意到。访问控制的目的不只仅是防止用户的恶意企图。数据梦魇更为常见的是无心识错误的结果,如打错MySQL语句,在不适合的数据库中操做或其余一些用户错误。经过保证用户不能执行它们应该执行的语句,访问控制有助于避免这些状况的发生。
不要使用root 应该严肃对待root登陆的使用。仅在绝对须要时使用它(或许在你不能登陆其余管理帐号时使用)。不该该在平常的MySQL操做中使用root。
2、管理用户
MySQL用户帐号和信息存储在名为mysql的MySQL数据库中。通常不须要直接访问mysql数据库和表(你稍后会明白这一点),但有时须要直接访问。须要直接访问它的时机之一是在须要得到全部用户帐号列表时。为此,可以使用如下代码:
USE mysql; SELECT user FROM user;
分析:mysql数据库有一个名为user的表,它包含全部用户帐号。user表有一个名为user的列,它存储用户登陆名。新安装的服务器可能只有一个用户(如这里所示),过去创建的服务器可能具备不少用户。
注意:用多个客户机进行试验 试验对用户帐号和权限进行更改的最好办法是打开多个数据库客户机(如mysql命令行实用程序的多个副本),一个做为管理登陆,其余做为被测试的用户登陆。
一、建立用户帐号
为了建立一个新用户帐号,使用CREATE USER语句,以下所示:
CREATE USER ben IDENTIFIED BY 'p@$$wOrd';
CREATE USER建立一个新用户帐号。在建立用户帐号时不必定须要口令,不过这个例子用IDENTIFIED BY 'p@$$wOrd'给出了一个口令。
若是你再次列出用户帐号,将会在输出中看到新帐号。
注意:指定散列口令 IDENTIFIED BY指定的口令为纯文本,MySQL将在保存到user表以前对其进行加密。为了做为散列值指定口令,使用IDENTIFIED BY PASSWORD。
使用GRANT或INSERT GRANT语句(稍后介绍)也能够建立用户帐号,但通常来讲CREATE USER是最清楚和最简单的句子。此外,也能够经过直接插入行到user表来增长用户,不过为安全起见,通常不建议这样作。MySQL用来存储用户帐号信息的表(以及表模式等)极为重要,对它们的任何毁坏均可能严重地伤害到MySQL服务器。所以,相对于直接处理来讲,最好是用标记和函数来处理这些表。
为从新命名一个用户帐号,使用RENAME USER语句,以下所示:
RENAME USER ben TO bforta;
注意:MySQL 5以前 仅MySQL 5或以后的版本支持RENAME USER。为了在之前的MySQL中重命名一个用户,可以使用UPDATE直接更新user表。
二、删除用户帐号
为了删除一个用户帐号(以及相关权限),使用DROP USER语句,以下所示:
DROP USER bforta;
注意:MySQL 5以前 自MySQL 5以来,DROP USER删除用户帐号和全部相关的帐号权限。在MySQL 5之前,DROP USER只能用来删除用户帐号,不能删除相关的权限。所以,若是使用旧版本的MySQL,须要先用REVOKE删除与帐号相关的权限,而后再用DROP USER删除帐号。
三、设置访问权限
在建立用户帐号后,必须接着分配访问权限。新建立的用户帐号没有访问权限。它们能登陆MySQL,但不能看到数据,不能执行任何数据库操做。
为看到赋予用户帐号的权限,使用SHOW GRANTS FOR,以下所示:
SHOW GRANTS FOR bforta;
分析:输出结果显示用户bforta有一个权限USAGE ON *.*。USAGE表示根本没有任何权限,因此,此结果表示在任意数据库和任意表上对任何东西没有权限。
注意:用户定义为user@host MySQL的权限用用户名和主机名结合定义。若是不指定主机名,则使用默认的主机名%(授予用户访问权限而无论主机名)。
为设置权限,使用GRANT语句。GRANT要求你至少给出如下信息:
(1)要授予的权限;
(2)被授予访问权限的数据库或表;
(3)用户名。
如下例子给出GRANT的用法:
GRANT SELECT ON crashcourse.* TO bforta;
分析:此GRANT容许用户在crashcourse.*(crashcourse数据库的全部表)上使用SELECT。经过只授予SELECT访问权限,用户bforta对crashcourse数据库中的全部数据具备只读访问权限。
SHOW GRANTS反映这个更改:
SHOW GRANTS FOR bforta;
分析:每一个GRANT添加(或更新)用户的一个权限。MySQL读取全部受权,并根据它们肯定权限。
GRANT的反操做为REVOKE,用它来撤销特定的权限。下面举一个例子:
REVOKE SELECT ON crashcourse.* FROM bforta;
分析:这条REVOKE语句取消刚赋予用户bforta的SELECT访问权限。被撤销的访问权限必须存在,不然会出错。
GRANT和REVOKE可在几个层次上控制访问权限:
(1)整个服务器,使用GRANT ALL和REVOKE ALL;
(2)整个数据库,使用ON database.*;
(3)特定的表,使用ON database.table;
(4)特定的列;
(5)特定的存储过程。
下表列出能够授予或撤销的每一个权限。
ALL | 除GRANT OPTION外的全部权限 |
ALTER | 使用ALTER TABLE |
ALTER ROUTINE | 使用ALTER PROCEDURE和DROP PROCEDURE |
CREATE | 使用CREATE TABLE |
CREATE ROUTINE | 使用CREATE PROCEDURE |
CREATE TEMPORARY TABLES | 使用CREATE TEMPOTATY 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和REVOKE时,用户帐号必须存在,但对所涉及的对象没有这个要求,这容许管理员在建立数据库和表以前设计和实现安全措施。
这样作的反作用是,当某个数据库或表被删除时(用DROP语句),相关的访问权限仍然存在。并且,若是未来从新建立该数据库或表,这些权限仍然起做用。
简化屡次受权 可经过列出个权限并用逗号分隔,将多条GRANT语句串在一块儿,以下所示:
GRANT SELECT,INSERT ON crashcourse.* TO bforta;
四、更改口令
为了更改用户口令,可以使用SET PASSWORD语句。新口令必须以下加密:
SET PASSWORD FOR bforta = Password('n3w p@&&word';)
分析:SET PASSWORD更新用户口令。新口令必须传递到Password()函数进行加密。
SET PASSWORD还能够用来设置你本身的口令:
SET PASSWORD = Password('n3w p@&&word');
分析:在不指定用户名时,SET PASSWORD更新当前登陆用户的口令。
3、小结
本博学习了经过赋予用户特殊的权限进行访问控制和保护MySQL服务器。