一、数据库主从配置
原理:
(1)master将数据改变记录到二进制日志中,也就是配置文件log-bin指定的文件
(2)Slave通过I/O线程读取master中的binary log events并写入到它的relay log
(3)Slave 重做中继日志中的事件, 把中继日志中的事件信息一条一条的在本地执行一次,完 成数据在本地的存储, 从而实现将改变反映到它自己的数据(数据重放)。
登录MySQL数据库:mysql -uroot -p
Ubuntu IP:192.168.0.129
1、修改master和slave的配置文件/etc/my.cnf
2、创建用于赋值操作的用户tian
CREATE USER ‘tian’@‘localhost’ IDENTIFIED BY ‘1’;
GRANT REPLICATION SLAVE ON . TO ‘tian’@‘localhost’;
刷新授权表信息
flush privileges;
获取主节点当前binary log文件名和位置position
show master status;
3、在从slave节点上设置主节点参数
CHANGE MASTER TO MASTER_HOST=‘localhost’, MASTER_USER=‘tian’, MASTER_PASSWORD=‘1’, MASTER_LOG_FILE=‘binlog.000002’, MASTER_LOG_POS=1168;
4、查看主从同步状态
5、开启主从同步,并查看主从同步状态
start slave;
show slave status\G;
二、数据库备份
备份指定库中的部分表(备份shool数据库中的student表):
mysqldump -uroot -p school student >school-student.sql
配置一个或多个完整的库
mysqldump -uroot -p school >school.sql
备份所有库
Mysqldump -u root -p --all-databases >all.sql备份数据库school:mysqldump -uroot -p school > /home/school.sql
三、数据库恢复
1、进入MySQL数据库,彻底啊删除school数据库,然后重新创建school数据库
2、恢复数据库
第一种方法:
mysql -u root -p school < /home/school.sql
查看恢复后的数据库
第二种方法:
(1)先删除数据库school
(2)再创建数据库school,并使用数据库school
(3)导入备份文件
source /home/school.sql
(4)可以查看到恢复了删除之前的数据
四、数据库安全策略设置
1、账号
以普通账户安全运行mysqld,禁止mysql以root账号权限运行,攻击者可能通过mysql获取系统root超级用户权限,完全控制系统。
2、口令
方法一:shell命令
Mysqladmin -u root -p password ‘123456’;
方法二:MySQL数据库命令
update user set password=password(‘123456’) where user=’root’ and host=’localhost’;
3、权限设置
授权用户权限:grant 权限 on 权限范围 to 用户;
回收权限:revoke 权限 on 范围 from 用户;(1)查看权限show grant;
(2)使用GRANT命令定义用户的访问权。
仅能从school数据库的student表中使用select,无法改变数据库中这个表和其他表的任何数据。
(3)revoke命令从一个用户移除访问权
4、日志审计
数据库应配置日志功能
(1)、查看所有的log命令。
(2)、查看具体的log指令
5、禁用或限制远程访问
禁止网络连接,防止猜解密码攻击,溢出攻击和嗅探攻击。
如果数据库不需远程访问,可以禁止远程tcp/ip连接, 通过在mysqld服务器中参数中添加 --skip-networking 启动参数来使mysql不监听任何TCP/IP连接,增加安全性。强迫MySQL仅监听本机,方法是在my.cnf的[mysqld]部分增加下面一行:bind-address=127.0.0.1
5、禁用local infile
因为在某些情况下,local infile命名可被用于访问操作系统上的其他文件(如/etc/passwd)
为禁用local infile命令,在mysql配置文件中增加‘set-variable=local-infile=0’参数。
五、数据库安全审计
数据库审计能够实时记录网络上的数据库活动,对数据库操作进行细粒度审计的合规性管理,对数据库遭受到的风险行为进行告警,对攻击行为进行阻断。
方法一:Genreal Log
默认情况下,MySQL不开启General log;开启General log后,MySQL将所有到达MySQL Server的SQL语句记录下来。
(1)查看General Log开启情况:执行SQL命令show variables like '%general_log%’ ;可以看到默认general_log是OFF的:
(2)开启General Log: 执行SQL命令set global general_log=on 而后查看general_log打开了:
3、验证:general_log打开后,所有SQL的访问都会记录在general_log_file指向的日志文件。
执行几个sql语句
然后查看/var/lib/mysql/ubuntu.log日志文件里面的内容,可以发现所做的操作在日志里:
方法二:BinLog+Init_connect
BinLog是MySQL操作时留下的日志,BinLog一方面可以用在数据库的恢复与主从复制上,另外一方面可以用来做数据库的审计。由于BinLog日志里面无法查询是谁在哪个时间段登录的等信息,缺少审计必要的信息。在MySQL中,每个连接都会先执行init_connect进行连接的初始化,我们可以在这里获取用户的登录名称和thread ID值。然后配合BinLog,就可以追踪到每个操作语句的操作时间,操作人等信息,再加上BinLog的日志信息实现审计。
方法三:使用审计插件
六、数据库安全基线检查
1、禁用local_infile选项会降低攻击者通过SQL注入漏洞器读取敏感文件的能力,编辑Mysql配置文件/etc/my.cnf,在mysqld 段落中配置local-infile参数为0,并重启mysql服务:local-infile=0
2、修改默认3306端口,避免使用熟知的端口,降低被初级扫描的风险。编辑/etc/my.cnf文件,mysqld 段落中配置新的端口参数,并重启mysql服务:port=3506
3、为Mysql服务使用专用的最低特权帐户,使用最低权限帐户运行服务可减小MySQL天生漏洞的影响。受限帐户将无法访问与MySQL无关的资源。使用非root和非sudo权限用户启动mysql服务。
4、禁止使用–skip-grant-tables选项启动Mysql服务 ,使用此选项,会导致所有客户端都对所有数据库具有不受限制的访问权限。编辑Mysql配置文件/etc/my.cnf,删除skip-grant-tables参数,并重启mysql服务
5、删除’test’数据库 ,测试数据库可供所有用户访问,并可用于消耗系统资源。删除测试数据库将减少mysql服务器的攻击面。登陆数据库执行以下SQL语句删除test数据库:DROP DATABASE test;
6、确保配置了log-error选项,启用错误日志可以提高检测针对mysql和其他关键消息的恶意尝试的能力。编辑Mysql配置文件/etc/my.cnf,在mysqld_safe 段落中配置log-error参数,<log_path>代表存放日志文件路径,如:/var/log/mysqld.log,并重启mysql服务:
log-error=<log_path>
7、确保没有用户配置了通配符主机名,避免在主机名中只使用通配符,有助于限定可以连接数据库的客户端,否则服务就开放到了公网。执行SQL更新语句,为每个用户指定允许连接的host范围。 1. 登录数据库,执行use mysql; ; 2. 执行语句select user,Host from user where Host=’%’;查看HOST为通配符的用户; 3. 删除用户或者修改用户host字段,删除语句:DROP USER ‘user_name’@’%’; 。更新语句:update user set host = <new_host> where host = ‘%’;。 4. 执行SQL语句:
OPTIMIZE TABLE user;
flush privileges;
8、匿名登陆检查 ,检查mysql服务是否允许匿名登录。
登陆Mysql数据库,执行以下命令删除匿名帐户:
delete from user where user=’’;
flush privileges;
9、禁用symbolic-links选项 ,编辑Mysql配置文件/etc/my.cnf,在mysqld 段落中配置skip_symbolic_links=yes,并重启mysql服务。
10、确保MYSQL_PWD环境变量未设置,确保MYSQL_PWD环境变量未设置。删除系统环境变量中Mysql密码(MYSQL_PWD)配置。
11、确保log-raw选项没有配置为ON,当log-raw记录启用时,有权访问日志文件的人可能会看到纯文本密码。编辑Mysql配置文件/etc/my.cnf,删除log-raw参数。