> 数据库文件不可以存放在 /,/var,/usr目录内
> 连上mysql数据,mysql -uroot -p --回车输入密码
> select @@datadir;
或
> show variables where variable_name=‘datadir’;
> 设置指定安全的路径
> set global datadir=‘路径’ ;
> 或者修改配置文件my.cnf中的datadir值
> datadir=‘路径’
> linux系统: 不是是高权限账号(root)运行mysql,也不可以是在高权限用户组内
> ps 命令查看进程 ,grep过滤结果,使用下面命令查看运行mysql的用户
> ps -ef | grep mysql
groupadd mysql -M -s /sbin/nologin
useradd -r -g mysql mysql
> passwd mysql
chown -R mysl.mysql mysql安装路径
chmod 755 mysql安装根路径
chmod 755 mysql安装后执行目录(bin)
chmod 755 mysql安装后lib库(libexec)
chmod -R go-rwx mysql数据存储目录(data)
> service mysqld start
查看系统中是存在.mysql_history文件:find / -name “.mysql_history” ,存在表示需要加固
加固方法
echo “export MYSQL_HISTORY=dev/null” >> /etc/profile
ln -s /dev/null .mysql_history文件路径
rm -r .mysql_history文件路径
查看慢查询日志文件名称和路径,然后查看权限,日志文件权限应满足:chmoed 660 和chmod mysq.mysql
如果没有开启慢查询,表示安全
select @@slow_query_log_file;
show variables like ‘slow_query_log_file’;
show variables like ‘%query%’;
cat /etc/my.cnf
logout=file
slow_query_log=on
slow_query_log_file=路径
long_query_time=2
ls -l 慢查询日志文件路径
chmod 660 慢查询日志文件
chmod msyql.mysql 慢查询日志文件
查看通用日志文件名字和权限,日志文件权限应满足:chmoed 660 和chmod mysq.mysql
如果没有开启慢查询,表示安全
show variables like '%general%';
根据第一步查看获取日志文件的位置查看通用日志文件的权限
ls -l 通用日志文件
chmod 660
chown mysql:mysql
查看 审计日志文件名字和权限,日志文件权限应满足:chmoed 660 和chmod mysq.mysql
如果没有开启慢查询,表示安全
#查看文件路径
show variables like '%audit_log_file%';
ls -l 审计日志文件
修改权限和所属权限
chmod 660
chown mysql:mysql
show variables like 'version';
安装补丁
升级到mysql 最新版本
如果存在test默认数据库,需要进行删除做加固
如果没有,就不需要加固
#1. 查看系统数据库
show databases;
drop database test;
确认mysql数据库关闭对本地文件的读取功能,local_infile应为OFF
# 查看是否开启本地读取文件功能
show variables like 'local_infile'
set @@local_infile=0;
永久设置,修改/etc/my.cnf 加入local-infile=0
在[mysqld]下面加入
local-infile=0
查看所有数据库用户
select user,host from mysql.user;
2.执行以下两条语句确保结果智能是数据库管理员
SELECT user, host FROM mysql.user WHERE (Select_priv = 'Y') OR (Insert_priv = 'Y') OR (Update_priv = 'Y')
OR (Delete_priv = 'Y') OR (Create_priv = 'Y') OR (Drop_priv = 'Y');
SELECT user, host FROM mysql.db WHERE db = 'mysql' AND ((Select_priv = 'Y') OR (Insert_priv = 'Y') OR (Update_priv = 'Y') OR (Delete_priv = 'Y') OR (Create_priv = 'Y') OR (Drop_priv = 'Y'));
确保一个数据库使用一个用户(尽可能的每个数据库使用单独的用户),每个用户只能对自己的库和表有全部权限,对其他库表根据情况有部分权限
确保权限管理只能是管理员
授权操作 :授予xiaoming用户对数据库test的goods表privileges权限
grant privileges on test.goods to xiaoming@localhost
privileges:表示要授予什么权力,例如可以有 select , insert ,delete,update等,如果要授予全部权力,则填 ALL
atabasename.tablename:表示用户的权限能用在哪个库的哪个表中,如果想要用户的权限很作用于所有的数据库所有的表,则填 .,*是一个通配符,表示全部。
username@host:表示授权给哪个用户。
GRANT select,insert ON zje.zje TO ‘aaa’@’%’; //表示给用户aaa授权,让aaa能给zje库中的zje表 实行 insert 和 select。
GRANT ALL ON . TO ‘aaa’@’%’;//表示给用户aaa授权,让aaa能给所有库所有表实行所有的权力。
drop user ‘test’@’%’; #删除 test用户
revoke privileges ON database.tablename FROM ‘username’@‘host’;
privileges,database.tablename,‘username’@'host’同上
根据实际情况对数据库用户进行权限的回收
file_priv:表示是否允许用户读取数据库所在主机的本地文件;
Process:表示是否允许用户查询所有用户的命令执行信息;
Super_priv:表示用户是否有设置全局变量、管理员调试等高级别权限;
Shutdown_priv:表示用户是否可以关闭数据库;
Create_user_priv:表示用户是否可以创建或删除其他用户;
Grant_priv:表示用户是否可以修改其他用户的权限;
应确保只有数据库管理员才有上述权限,使用如下sql语句查看拥有各个权限的数据库账号:
select user, host from mysql.user where File_priv = 'Y';
select user, host from mysql.user where Process_priv = 'Y';
select user, host from mysql.user where Process_priv = 'Y';
SELECT user, host FROM mysql.user WHERE Shutdown_priv = 'Y';
SELECT user, host FROM mysql.user WHERE Create_user_priv = 'Y';
SELECT user, host FROM mysql.user WHERE Grant_priv = 'Y';
SELECT user, host FROM mysql.db WHERE Grant_priv = 'Y';
REVOKE FILE ON *.* FROM '';
REVOKE PROCESS ON *.* FROM '';
REVOKE SUPER ON *.* FROM '';
REVOKE SHUTDOWN ON *.* FROM '';
REVOKE CREATE USER ON *.* FROM '';
REVOKE GRANT OPTION ON *.* FROM ;
其中user为上述查询到的非管理员用户。
例如:回收用户xiaoming的本地文件读取权限
revoke file on *.* from 'xiaoming';
DML/DDL语句包括创建或修改数据库结构的权限,例如insert、update、delete、create、drop和alter语句,在任何数据库中都要控制用户的此类权限,确保只授权给有业务需求的非管理员用户。Mysql命令行下执行如下命令:
SELECT User,Host,Db FROM mysql.db WHERE Select_priv='Y' OR Insert_priv='Y' OR Update_priv='Y' OR Delete_priv='Y' OR Create_priv='Y'
OR Drop_priv='Y' OR Alter_priv='Y';
REVOKE SELECT ON . FROM ;
REVOKE INSERT ON . FROM ;
REVOKE UPDATE ON . FROM ;
REVOKE DELETE ON . FROM ;
REVOKE CREATE ON . FROM ;
REVOKE DROP ON . FROM ;
REVOKE ALTER ON . FROM ;
错误日志包括数据库运行和停止过程中的一系列活动信息,有助于分析数据库运行过程中的一些异常活动,一般情况下需要开启错误日志记录功能,使用如下命令查询:
show variables like 'log_error';
[mysqld_safe]
log-error=log文件路径
日志文件随着数据库的运行会不断增加,如果存放在系统区域,则会影响系统的正常运行,使用如下命令进行查询:
show variables like 'log_error';
原始日志选项会决定一些敏感信息是否会被明文写进日志中,例如查询日志、慢查询日志、二进制日志,确保数据库配置文件中存在如下配置项:
cat /etc/my.cnf
[mysqld_safe]
log-raw=1
old_passwords的值不能为0,如果为0则用户密码可被破解
select @@old_passwpords;
set global old_passwords=1;
set global old_passwords=2;
[mysqld_safe]
old_passords=1 #或者等于2
如果客户端采用Old_passwords发起连接请求,如果服务器端设置了secure_auth,则客户端会拒绝连接请求,可以根据安全需求在配置文件中做相应配置。
cat /etc/my.cnf
[mysqld_safe]
secure_auth=1 #或者等于2
执行如下语句查询是否有用户不需要密码即可登录:
SELECT User,host FROM mysql.user WHERE (plugin IN('mysql_native_password', 'mysql_old_password') AND (LENGTH(Password) = 0 OR Password IS NULL))OR (plugin='sha256_password' AND LENGTH(authentication_string) = 0);
select user,host from msyql.user;
#对空口零的用户加入密码user的值指定用户, password(’’)对用户密码加密,new password指定用户的密码
update mysql.user set password=password('new password') where user='root';
定时对数据备份,异地备份,全量备份
a.新建备份文件并赋予可以执行的权限
mkdir -p /home/mysql_backup/
touch /home/mysql_backup/mysql_backup.sh
chmod 551 /home/mysql_backup/mysql_backup.sh
b.编辑/home/mysql_backup/mysql_backup.sh
vim /home/mysql_backup/mysql_backup.sh
c.写入以下内容
backupdir=/home/mysql_backup
time=
date +%Y_%m_%d_%H_%M_%S
db_user=root
db_pass=123456
mysqldump --all-databases -u d b u s e r − p db_user -p dbuser−pdb_pass | gzip > b a c k u p d i r / backupdir/ backupdir/time.sql.gz
find $backupdir -name “*.sql.gz” -type f -mtime +5 -exec rm -rf {} ; > /dev/null 2>&1
d.编辑crontab
crontab -e
e.在最后一行加入
* */1 * * * root /home/mysql_backup/mysql_backup.sh
f.重启crontab
service crond restart