9:MySQL-服务器管理3

安全性与访问控制

- 保护对MySQL文件系统的访问
- 如何窃取数据
1.在服务器主机上安装一个自己的"流氓"MySQL服务器
使用与官方服务器不同的端口,套接字文件和数据目录
2.运行mysql_install_db
初始化数据目录
此动作可让你以MySQL的root用户身份访问你的服务器,
建立一个test数据库,用于存储窃取到的表.
3.访问你想攻击的服务器的数据目录
将想窃取的表对应的文件复制到你
自己那个服务器数据目录下的test目录.
4.启动流氓服务器
可通过SQL访问复制表的信息
5.对"流氓"数据库不设权限
外部用户通过"流氓"数据库来访问本无权限访问的内容
- 保护MySQL安装
1.停止MySQL服务器
%mysqladmin -p -u root shutdown
2.用以下命令,
把整个MySQL安装的所有者和组名设为MySQL管理账户.
#chown -R mysql /usr/local/mysql
#chgrp -R mysql /usr/local/mysql
3.对客户端应能访问的基本目录及其子目录,需更改它们的模式
以便mysql拥有其全部权限.而其他人只有其读取和执行权限.
4.更改数据目录及其下面所有文件和子目录的访问模式
只允许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
- 保护选项文件	
使用选项文件有潜在风险
1.如某个选项文件含有诸如MySQL账户名或密码类的敏感信息,
则不要让其可公共读取
2./etc/my.cnf
该文件常允许公共可读
它是一个用于指定全局客户端选项的地方.
不要把服务器的选项放入其中.
3.每个用户特有的user-specific.my.cnf选项文件
应该隶属于它所在主目录对应的那个用户
且只可被此用户访问
%chmod u=rw,go-rwx .my.cnf
4.其他选项文件则需根据它们的具体用途来设置其访问模式

管理MySQL用户账户

数据库权限表
- CREATE USER/DROP USER/RENAME USER
分别用于创建,删除和重命名MySQL账户
- GRANT
用于指定账户权限[如账户不存在,则创建它们]
- REVOKE
用于移除MySQL账户的权限
- SET PASSWORD
用于分配账户的密码
- SHOW GRANTS
用于显示账户所拥有的权限
权限表				内容
user				可连接到服务器的用户,及它们的全局性权限
db					数据库权限
tables_priv			表权限
columns_priv		列权限
procs_priv			存储例程权限
proxies_priv		代理用户权限
执行CREATE USER时,需指定一个账户名和可选的授权信息
GRANT时,指定账户不存在,会先将其创建.
GRANT时,如指定了全局权限,也会被记录到user表里.
如在GRANT里指定的权限只适用于给定的数据库,表,列,存储例程,
则它们会被分别记录到
db,tables_priv,columns_priv或procs_priv表里.
PROXY权限的分配会被记录在proxies_priv表里.
REVOKE可删除权限表里的权限
DROP USER可从各个表中删除与给定账户相关的所有行.
- MySQL账户的高级管理
1.指定账户名
在账户管理语句里
account值由用户名和主机名构成
具体格式为
'user_name'@'host_name' // 主机名为客户端所在的主机
2.将账户名里的主机值与DNS相匹配
DNS解析返回的应该与账户指定的完全一致才匹配
[匹配按字符串逐字符匹配进行的]
- 指定账户认证方式
CREATE USER可借助于可选的auth_info来指定账户认证方式
CREATE USER account [auth_info]
auth_info子句可采用两种形式如下所示:
1.账户采用密码认证	
2.权限分配
为某个账户分配访问权限时,可用GRANT
GRANT privileges [(columns)]
	ON what
	TO account [auth_info]
	[REQUIRE encryption requirements]
	[WITH grant or resource management options]
如指定的账户存在,
则GRANT会修改其权限
如指定的账户不存在,
则GRANT会在创建它时带上分配的权限
a.privileges
权限
b.columns
指定受权限影响的列(xx,xxx, xx)
c.what
表示权限应用的级别
最高级别是全局级,
其中的权限会应用到所有数据库和所有表
也可指定应用到数据库/表/列/存储例程
d.account
表示被授予权限的账户
格式为
'user_name'@'host_name'
e.auth_info
表示账户密码或认证方法
f.REQUIRE
会设置账户,
要求其在进行连接时需使用安全的安全套接字层连接
g.WITH
可用于授予GRANT OPTION权限
进而让账户能把自己的权限转授给其他用户
- 定义账户的权限
一个账户可被授予多种权限
管理权限
对象权限
两个特殊的权限说明符:ALL和USAGE
ALL表示所有权限
USAGE表示无权限
1.CREATE USER
此权限允许使用的语句含
CREATE USER 
DROP USER
RENAME USER
REVOKE ALL PRIVILEGES
2.FILE
可让你告诉服务器读取或写入服务器主机的文件
3.GRANT OPTION
可让你将自己拥有的权限授予其他用户
4.PROCESS
5.PROXY
使你能获得另一用户的权限
6.RELOAD
让你能执行某些服务器管理操作
让你可执行FLUSH/RESET等
还可执行
reload/refresh/flush-hosts/flush-logs等mysqladmin命令
7.REPLICATION CLIENT
使你可使用SHOW MASTER STATUS/SHOW SLAVE STATUS来查询主/从服务器的位置和状态
8.SHOW DATABASES
9.SHUTDOWN
可让你关闭服务器
10.SUPER
11.ALTER
使你可执行ALTER TABLE xxx
12.ALTER ROUTINE
使你能更改或删除存储函数和存储过程
13.CREATE
使你能创建数据库和表
14.CREATE ROUTINE
使你能创建存储函数和存储过程
15.CREATE TABLESPACE
使你能创建,删除,或更改表空间
16.CREATE TEMPORARY TABLES
创建临时表
17.CREATE VIEW
创建视图
18.DELETE
删除表里的行
19.DROP
删除数据库和表
20.EVENT
使你能对事件调度器的各个事件进行操作
21.EXECUTE
使你能执行存储函数和存储过程
22.INDEX
使你能创建或删除表的索引,
为键缓存分配索引,将索引预加载到键缓存
23.INSERT
使你能将行插入到表
24.LOCK TABLES
锁定表
25.REFERENCES
26.SELECT
检索
27.SHOW VIEW
查看视图
28.TRIGGER
添加和删除触发器
29.UPDATE
修改表里的行

权限级别
权限说明符				权限作用级别
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.
- 使用无权限的USAGE权限
让你更改某个账户的特性,同时保证原有权限不受影响
- 要求账户使用安全连接
- 让账户拥有管理权限
- 限制账户的资源占用
- 显示账户权限
SHOW GRANTS FOR 'sampadm'@'localhost';
SHOW GRANTS;
- 撤销权限
REVOKE
REVOKE没有auth_info, REQUIRE, WITH子句
REVOKE privileges [(columns)] ON what FROM account;
GRANT ALL ON sampdb.* TO 'boris'@'localhost';
REVOKE DELETE, UPDATE ON sampdb.* FROM 'boris'@'localhost';
要撤销某个权限,你需先自己拥有该权限,
还需拥有GRANT OPTION权限.
- 更改密码或重置丢失的密码
- 插入式身份认证和代理用户
1.使用身份认证插件

权限表结构和内容

各类权限管理SQL语句最终都变为对MySQL权限表的修改
权限表控制着客户端对MySQL数据库的访问,位于mysql数据库里
会在将MySQL第一次安装至机器的过程中被初始化.
名字分别是:
user
db
tables_priv
columns_priv
procs_priv
proxies_priv
服务器对它们的使用情况如下:
1.user表列出的是可连接至服务器的各个用户账户
及每个用户所拥有的全局权限
在user表里启用的所有权限都是全局权限,适用于所有数据库.
user表还包含用于身份认证的列,
用于使用SSL建立安全连接的SSL选项列,
用于防止给定账户独占该服务器的资源管理列.
2.db表列出的是哪些账户对哪些数据库有权限.
此处授予的权限可应用于数据库内的所有对象[包括表,存储例程等]
3.tables_priv表
列出的是各种表级别的权限.
此处指定的权限适用于表里的所有列
4.columns_priv表
列出的是列级别的权限
此处指定的权限适用于表中的特定列
5.procs_priv表
包含的是适用于各种存储例程[存储函数,存储过程]的权限
此处指定的权限适用于数据库里的特定例程
6.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列里的密码
- 权限表SSL相关列
在user表里
有几个列适用于基于SSL的安全认证
最主要的列是ssl_type
它表明账户是否需要安全连接
- 权限表资源管理列
- 服务器如何控制客户端访问
MySQL服务器对客户端的访问控制分为两个阶段,
第一阶段在你试图连接服务器的时候
第二阶段,服务器会对执行的每一条语句作两项检查
首先,它检查每小时执行语句数目和每小时更新数目的限制
其次,服务器会检查权限表,以验证你是否有足够的执行该语句的访问权限
- 访问范围列的内容
每个访问范围列都有一些约束规则,来定义哪些类型值是合法的,及服务器会如何解释它们.
1.Host
主机名/IP地址
localhost代表本地主机
2.User
3.Db
4.Table_name,Column_name和Routine_name
5.Routine_type
6.Proxied_host,Proxied_user
- 语句访问验证
- 访问范围列匹配顺序
- 使用SSL建立安全连接

数据库维护,备份,复制

- 预防性维护的基本原则
1.启用MySQL服务器提供的自动恢复
2.定期备份+开启二进制日志
- 在服务器运行时维护数据库
1.为只读或读/写访问锁定单个表
如要用服务器的内部锁定机制来防止它访问你正在处理的表,
可用mysql连接服务器
执行LOCK TABLE锁定表
处理表文件
释放锁
2.为只读访问锁定表
a.在窗口A里,调mysql,执行下列语句,获得读锁,刷新表
%mysql db_name
mysql>LOCK TABLE tbl_name READ;
mysql>FLUSH TABLE tbl_name;
b.切换到窗口B
开始处理表文件
%cp tbl_name.* /var/backup
c.完成对表的处理后,再切换回窗口A里的mysql会话,释放表锁
mysql>UNLOCK TABLE;
3.为读/写访问锁定表
既要获取读锁,也要获取写锁
处理完后需FLUSH TABLE
a.在窗口A里调mysql程序
执行下面语句,以获得写锁,在刷新表
%mysql db_name
mysql>LOCK TABLE tbl_name WRITE;
mysql>FLUSH TABLE tbl_name;
b.切换到窗口B
直接处理表文件
%cp /var/backup/tbl_name.* .
c.刷新并释放表
mysql>FLUSH TABLE tbl_name;
mysql>UNLOCK TABLE;
- 为只读访问锁定所有数据库
mysql>FLUSH TABLES WITH READ LOCK;
mysql>SET GLOBAL read_only = ON;
FLUSH可获得一个全局性读锁
SET会进入阻塞
如想再次允许修改
mysql>SET GLOBAL read_only = OFF;
mysql>UNLOCK TABLES;
- 基本的预防性维护
1.启用MySQL服务器提供的自动恢复
2.安排预防性维护,定期对表检查
3.制定定期备份策略

数据库备份

数据库备份分为以下两类
1.文本格式的备份
可通过mysqldump程序把表内容写入转储文件
文件内语句可用于后续恢复表
2,二进制备份
可通过直接复制包含表内容的文件来获得
文件拷贝
- 存储引擎的可移植特点
- 用mysqldump制作文本备份
%mysqldump sampdb member > member.sql
%mysql sampdb < member.sql
// 对整个数据库产生一个文件
%mysqldump sampdb > /archive/mysql/sampdb.2013-01-02
- 制作二进制数据库备份
%cd /usr/local/mysql/data
%tar czf /archive/mysql/backup-all-2013-04-11.tar.gz .

%cd /usr/local/mysql/data
%cp -r mydb /archive/mysql // 备份mydb数据库
- 备份InnoDB表
要制作InnoDB表的二进制备份
需复制以下文件
1.系统表空间文件
2.每个表的.frm文件
3.每个表的.ibd文件
4.InnoDB日志文件
5.系统表空间配置所特有的选项文件
- 将数据库复制到另一个服务器
两种方法
1.把数据库备份为一个文件或一组文件
可把这些文件复制到第二台服务器主机上,
并把它们加载到第二台主机的MySQL服务器里.
a.创建转储文件
%mysqldump --databases sampdb  > sampdb.sql
b.把转储文件复制到远程主机
%scp sampdb.sql boa.example.com:/tmp
c.登录远程主机,把转储文件加载到它的MySQL服务器
%mysql < /tmp/sampdb.sql

也可用二进制备份计数
%cd /usr/local/mysql/data
%scp -r mydb boa.example.com:/var/mysql/data
2.通过网络把数据库从一个服务器直接转储到另一个服务器
- 将数据库从一个服务器复制到另一个
%mysqldump --databases sampdb | mysql -h boa.example.com
- 检查和修复数据库表
- 使用备份来恢复数据
数据恢复过程涉及两个信息源:
备份文件
二进制日志
备份文件可以是转储文件,也可是二进制文件
二进制日志文件里记载着自该次备份后所执行过的表更改语句.
mysqlbinlog可把这些日志文件转换回文本形式的SQL语句
以便使用mysql来执行它们
进而重新应用在备份和问题出现这两个时间点之间所产生的更改.
1.恢复整个数据库
a.复制一份数据库目录的内容
b.用最近的备份文件重新加载数据库
如你的备份是用mysqldump生成的转储文件
需依次将每个文件作为mysql的输入
重新加载它们

如需恢复的数据库里有含权限表的mysql数据库
且打算用转储文件来恢复那些表
则可在服务器运行时,
用--skip-grant-tables来重新加载它们
把表都恢复好后
需关闭服务器
重启它

如备份文件源自二进制备份
则需停止服务器
在把备份文件复制到它们原来的位置
重启服务器
c.利用二进制日志
重新应用制作备份后的数据更改
- 恢复单个表
对由mysqldump生成的转储文件
其包含要恢复的表
单独加载它即可

对二进制方式的备份
1.找到包含目标表的数据库
恢复其全部内容
应用二进制日志
2.从第二个数据库开始
用mysqldump转储感兴趣的表
3.删除原先表
加载转储文件
重建删除的表
- 重新执行二进制日志文件里的语句
mysqlbinlog可把二进制日志文件转换为文本形式的语句
其输出可用作mysql输入
%mysqlbinlog binlog.[0-9]* > text_file
%vi text_file
%mysql < text_file
- 应对InnoDB的自动恢复问题
如需恢复所有的InnoDB表,则需用备份
1.如是二进制备份
你应有这样几个文件的副本
系统和单个的表空间文件,
InnoDB日志文件,各个表的.frm文件,选项文件.
服务器停止后,删掉已有的InnoDB文件,将其替换为备份副本.
2.如用运行musqldump生成的转储文件来备份InnoDB
应重新初始化系统表空间和InnoDB日志文件
并将这个转储文件重新加载到InnoDB
a.停止服务器
删除已有的与InnoDB有关的文件
如系统表空间文件,单个表空间文件,InnoDB日志文件,InnoDB表的.frm文件
b.按原先设置重新配置系统表空间
重启服务器
c.将转储文件当做mysql输入的方式重新加载它们

- 设置复制服务器
1.复制工作原理
a.复制关系中
一种为主服务器,一种为从服务器
每个服务器会分配一个唯一的复制ID
b.每个主服务器可有多个从服务器
一个从服务器可作为另一个从服务器的主服务器
c.每个从服务器开始时,
其数据库需与主服务器上的数据库同步
d.更新通信基于主服务器的二进制日志
主服务器上需启用二进制日志功能
e.每个从服务器需有权限连接主服务器,并请求更新
从服务器连到主服务器时,会告诉主服务器,
自它上次连接来在主服务器的二进制日志里已进展了多远
主服务器将把在二进制日志里记录的,
自给定坐标后发生的事件传送给从服务器
f.主服务器有新的更新时,
会把这些更新写入主服务器的二进制日志
后续再传给从服务器
g.从服务器最大连接个数可通过参数设置
h.从服务器
I/O线程接收来自主服务器的待处理事件,将其写到从服务器的中继日志
SQL线程从中继日志中读出事件,并执行
- 建立主从复制关系
1.确定你向分配给每个服务器的ID值
把它们记录到服务器在启动时会读取的选项文件
主服务器需启用二进制日志
[mysqld]
server-id=master_server_id
log-bin=binlog_name
[mysqld]
server-id=slave_server_id
2.在主服务器上,创建一个账户
让从服务器可用它来连接主服务器,并请求更新信心
3.连接主服务器
通过执行SHOW MASTER STATUS确定其当前的复制坐标
>FLUSH TABLES;SHOW MASTER STATUS;
确保确定复制坐标到数据快照传到从服务器后这段时间主服务器上没发生过更新
4.需在从服务器上为将要复制的数据库建立一个副本
5.连接从服务器
使用CHANGE MASTER来配置它
6.让从服务器开始复制

猜你喜欢

转载自blog.csdn.net/x13262608581/article/details/112297293