% mysqladmin -p -u root shutdown
# chown -R mysql /usr/local/mysql
# chgrp -R mysql /usr/local/mysql
% chmod -R go-rwx /usr/local/mysql/data
[mysqld]
user=mysql
可以让以root身份执行服务器程序时,自动切换为mysql身份来执行。
保护Unix套接字文件
对客户端至 localhost 的连接,服务器使用的是Unix域套接字文件。
此套接字文件常允许被公开访问,以便客户端程序可使用它。
对此文件需要客户端需要的是执行权限。
[mysqld]
socket=/usr/local/mysql/mysql.sock
[client]
socket=/usr/local/mysql/mysql.sock
保护选项文件
使用选项文件有潜在风险。
% chmod u=rw,go-rwx .my.cnf
数据库权限表。
权限表 | 内容 |
---|---|
user | 可连接到服务器的用户,及它们的全局性权限 |
db | 数据库权限 |
tables_priv | 表权限 |
columns_priv | 列权限 |
procs_priv | 存储例程权限 |
proxies_priv | 代理用户权限 |
执行CREATE USER语句时,需指定一个账户名和可选的授权信息(密码或授权方法),服务器会在 user 表里为这个新账户创建一个行。
在GRANT语句时,指定账户不存在,会先将其创建。
在使用GRANT语句时,如果指定了全局权限,也会被记录到user表里。
如果在GRANT里指定的权限只适用于给定的数据库,表,列,存储例程,则它们会被分别记录到db,tables_priv,columns_priv或procs_priv表里。
PROXY权限的分配会被记录在proxies_priv表里。
REVOKE可删除权限表里的权限,DROP USER可从各个表中删除与给定账户相关的所有行。
指定账户名
在账户管理语句里,account值由用户名和主机名构成
具体格式为 ‘user_name’@‘host_name’ 。 (主机名为客户端所在的主机)
将账户名里的主机值与DNS相匹配
DNS解析返回的应该与账户指定的完全一致才匹配(匹配按字符串逐字符匹配进行的)。
指定账户认证方式
CREATE USER 语句可借助于可选的auth_info来指定账户认证方式:
CREATE USER account [auth_info]
auth_info子句可采用两种形式如下所示:
为某个账户分配访问权限时,可用GRANT语句:
GRANT privileges [(columns)]
ON what
TO account [auth_info]
[REQUIRE encryption requirements]
[WITH grant or resource management options]
如果指定的账户存在,则GRANT会修改其权限。
如果指定的账户不存在,则GRANT会在创建它时带上分配的权限。
其中有几个子句是可选的,如无必要,完全可以不用指定它们。通常情况下,最为常用的是下面几个部分。
一个账户可被授予多种权限。
主要分为两类:管理权限,对象权限。
两个特殊的权限说明符:ALL 和 USAGE。
ALL表示所有权限;
USAGE表示无权限。
权限级别:
权限说明符 | 权限作用级别 |
---|---|
ON . | 全局权限,所有数据库+所有表 |
ON * | 默认数据库 |
ON db_name.* | 指定数据库 |
ON db_name.tbl_name | 指定数据库的指定表 |
ON tbl_name | 指定表 |
ON db_name.routine_name | 指定数据库的指定例程 |
ON account | 代理权限 |
想显式地指定权限要应用的对象类型,可以含TABLE, FUNCTION, PROCEDURE(如ON TABLE xx.xx 或 ON FUNCTION xx.xx)。
USAGE权限只能全局级指定(ON .)。
ALL会把给定级别上所有权限授予账户。
ALL下的所有权限不会包含GRANT和REVOKE所需的GRANT OPTION。
SHOW GRANTS FOR 'sampadm'@'localhost';
SHOW GRANTS;
REVOKE privileges [(columns)] ON what FROM account;
GRANT ALL ON sampdb.* TO 'boris'@'localhost';
REVOKE DELETE, UPDATE ON sampdb.* FROM 'boris'@'localhost';
要撤销某个权限,你需先自己拥有该权限,还需拥有GRANT OPTION权限。
各类权限管理SQL语句最终都变为对MySQL权限表的修改。
权限表控制着客户端对MySQL数据库的访问,位于mysql数据库里,会在将MySQL第一次安装至机器的过程中被初始化。
这些表的名字分别是:user、db、tables_priv、columns_priv、procs_priv、proxies_priv 。
服务器对它们的使用情况如下:
每个权限表含两种基本类型的列:
一个是访问访问列,用于确定何时应用于行;另一个是权限列,用于确定某个行授予了哪些权限。
user表还有几个用于身份认证,SSL连接和资源管理的列。
权限系统包含的表有 tables_priv、columns_priv、procs_priv,分别用于定义以下各项的权限:特定表、列、存储函数和存储过程。
当某个账户试图执行某个给定操作时,访问范围列的操作决定了服务器会使用哪些行来确定最终的权限。
权限表的每个行都包括Host列,User列,用于表明该行适用于由特定用户从给定主机发起的连接。
db表含一个Db列,用于表明该行适用于那个数据库。
tables_priv和columns_priv表的行里包含的访问范围列,使其访问范围进一步变窄,分别限定在数据库里的特定表和表里的特定列中。
procs_priv表的访问范围列则指定了一个行适用于那个存储函数或存储过程。
对每一行,这些权限列表明的是,由访问范围列标识出的那个用户拥有哪些权限。
在user表和db表里,指定的每种权限都是一个单独列。这些列被定义为ENUM(‘N’, ‘Y’)类型,其默认值为’N’。
如,Select_priv列定义如下:
Select_priv ENUM('N', 'Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N'
表tables_priv, columns_priv, procs_priv里的权限都是用SET表示的,从而可将存储在同一列的各种权限任意组合。
SET('Select','Insert',...,'Trigger')
CHARACTER SET utf8 NOT NULL DEFAULT ''
columns_priv表的Column_priv列的定义如下:
SET
('Select',...)
CHARACTER SET utf8 NOT NULL DEFAULT ''
user表有3个用于指明账户认证方式的列:Password、plugin、authentication_string 。
对某个给定账户在user表里对应的行,如果 plugin 列为空,则客户端进行账户认证时会使用Password列里的密码。
在user表里,有几个列适用于基于SSL的安全认证。
最主要的列是ssl_type,它表明账户是否需要安全连接。
MySQL服务器对客户端的访问控制分为两个阶段。
第一阶段在你试图连接服务器的时候。
第二阶段,服务器会对执行的每一条语句作两项检查。
首先,它检查每小时执行语句数目和每小时更新数目的限制。
其次,服务器会检查权限表,以验证你是否有足够的执行该语句的访问权限。
每个访问范围列都有一些约束规则,来定义哪些类型值是合法的,及服务器会如何解释它们。
学习参考资料:
《MySQL技术内幕》第5版