1、数据目录安全性 show variables like 'datadir';
-------设置相应的权限 防止数据被拷贝
-------用专门的安全加固软件防止数据随意被拷贝
2、安装完mysql后需要做的工作
运行
mysql_secure_installation设置相关的安全访问属性
需要安装mysql-client,才可以。运行mysql_secure_installation会执行几个设置:
[root@localhost ~]# mysql_secure_installation
a)为root用户设置密码
b)删除匿名账号
c)取消root用户远程登录
d)删除test库和对test库的访问权限
e)刷新授权表使修改生效
通过这几项的设置能够提高mysql库的安全。
3、skip-networking bind-address=127.0.0.1
若不需要联网,可以开启这个选项
4、禁用LOCAL INFILE local-infile=0 (否则会带来sql注入问题) 导入外部数据用的命令
示例: 创建一数据库和一个表 然后倒入数据看看是否能够导入
关闭local_infile
mysql> set @@global.local_infile=0;
mysql> show variables like 'local_infile'
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| local_infile | OFF |
+---------------+-------+
1 row in set (0.00 sec)
mysql> load data local infile '/tmp/tt' into table tt;
ERROR 1148 (42000): The used command is not allowed with this MySQL version
打开这个参数:
mysql>
set @@global.local_infile = 1;
再测试一次
mysql> load data local infile '/tmp/tt' into table tt;
Query OK, 5 rows affected (0.04 sec)
Records: 5 Deleted: 0 Skipped: 0 Warnings: 0
mysql> select * from tt;
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
+------+
5 rows in set (0.02 sec)
生产环境下一般是需要时再打开
select load_file("/etc/password")
MYSQL注入中,load_file()函数在获得web shell以及提权过程中起着十分重要的作用,常被用来读取各种配置文件.
5、数据库上面的历史操作命令都会被记录在根下面的.mysql_history上面
定时用脚本清空次文件 cat /dev/null > ~/.mysql_history
==========数据传输安全==========
SSL OPENSSL YASSL
一般在AB复制跨地域传输的时候开启
========== 用户相关 ==========
1、user @ ip or host
通过授权命令,限定允许登录的用户和主机
2、权限最小化
授权的时候,不要一下子就给了all的权限,而应该开放最小权限。
安全权限控制思想
权限最好是由小设置为大 不要先给最大权限最后才缩小
这样导致后期生产系统很多问题出现
(1)、(重点)写库账号默认给select insert update delect 不要给创建修改表create alter权限 更不能给给all权限
(2)、读库账号默认select(配合mysql read-only --ROOT没限制的)
(3)、根据需要,最好专库专账号,不要一个账号管理多个库
(4) 、grant select,insert,update,delect on blog.* to 'blog'@'10.0.0%'indentified b '123456'; ---数据库连接密码最好采用: 数字+字母+特殊符号,而不要过于简单。
查看用户开放的权限:
SHOW GRANTS FOR user_name@ip
例如:
mysql> show grants for 'dbtest'@'192.168.56.%'\G;
*************************** 1. row ***************************
Grants for dbtest@192.168.56.%: GRANT
ALL PRIVILEGES ON *.* TO 'dbtest'@'192.168.56.%' IDENTIFIED BY PASSWORD '*767C46297043DBC2F444C7D28E4B226047DA5C38'
1 row in set (0.00 sec)
(5)保护好超级用户的密码
mysql> select user,host from mysql.user;
+--------+-----------------------+
| user | host |
+--------+-----------------------+
| root | 127.0.0.1 |
| dbtest | 192.168.56.% |
| root | ::1 |
| root | localhost |
| root | localhost.localdomain |
+--------+-----------------------+
mysql> rename user root@127.0.0.1 to ccc@127.0.0.1;
mysql> show grants for admin@127.0.0.1;
(6)删除密码为空的用户
mysql> select user,host,password from mysql.user;
+--------+-----------------------+---------------------------------------------------------+
| user | host | password |
+--------+-----------------------+---------------------------------------------------------+
| root | localhost | *767C46297043DBC2F444C7D28E4B226047DA5C38 |
| root | localhost.localdomain | |
| root | 127.0.0.1 | |
| root | ::1 | |
| dbtest | 192.168.56.% | *767C46297043DBC2F444C7D28E4B226047DA5C38 |
+--------+-----------------------+----------------------------------------------------------+
5 rows in set (0.00 sec)
mysql> delect from mysql.user where user='' or password='';
(7)定期去检查用户表里面的用户,看看里面的用户是否是你创建的,特别是 SQL