Mysql 安全

由于经常被抓取文章内容,在此附上博客文章网址:,偶尔会更新某些出错的数据或文字,建议到我博客地址 :  --> 点击这里

1 正确设置目录权限:
设置目录权限的原则是软件和数据分开,具体如下:
1. 将mysql 安装在单独的用户下
2. 安装时,以root 用户进行安装,mysql 的软件默认都为root 权限
3. 安装完毕后,将数据目录权限设置为实际运行mysql 的用户权限,比如:

Chown –R mysql:mysql /home/mysql/data


2 尽量避免以root 权限运行mysql:
将目录权限设置完毕后,启动、停止mysql 以及日常的维护工作都可以在mysql 用户下进行,没有必要su 到root 后再用—user=mysql 来启动和关闭mysql,这样就没有必要授权维护人员root 权限,而且最重要的一定是因为任何具有FILE权限的用户能够用root 创建文件。


3 删除匿名帐号:
安装完毕mysql 后,会自动安装一个空帐号,普通用户只需要执行mysql 命令即可登陆mysql,给系统造成隐患,建议删除此空帐号:

 

4 给mysql root 帐号设置口令:
Mysql 安装完毕后,root 默认口令为空,需要马上修改root 口令:

[zzx@localhost data]$ mysql –uroot
mysql> set password=password('123');
Query OK, 0 rows affected (0.00 sec)


5 设置安全密码并定期修改:
尽量使用安全密码,建议使用6 位以上字母、数字、下画线和一些特殊字符组合而成的字符串


6 只授予帐号必须的权限:
只需要赋予普通用户必须的权限,比如:

Grant select,insert,update,delete on tablename to ‘username’@’hostname’;


7 除root 外,任何用户不应有mysql 库user 表的存取权限:
如果拥有mysql 库中user 表的存取权限(select、update、insert、delete),就可以轻易的增加、修改、删除其他的用户权限,造成系统的安全隐患。


8 不要把FILE、PROCESS 或SUPER 权限授予管理员以外的帐号:
FILE 权限可以被滥用于将服务器主机上MySQL 能读取的任何文件读入到数据库表中。包括任何人可读的文件和服务器数据目录中的文件。可以使用SELECT 访问数据库表,然后将其内容传输到客户端上。

不要向非管理用户授予FILE 权限。有这权限的任何用户能在拥有mysqld 守护进程权限的文件系统那里写一个文件!为了更加安全,由SELECT ... INTO OUTFILE 生成的所有文件对每个人是可写的,并且你不能覆盖已经存在的文件。

9 load data local 带来的安全问题:
由MySQL 服务器启动文件从客户端向服务器主机的传输。理论上,打过补丁的服务器可以告诉客户端程序传输服务器选择的文件,而不是客户用LOAD DATA 语句指定的文件。这样服务器可以访问客户端上客户有读访问权限的任何文件。在Web 环境中,客户从Web 服务器连接,用户可以使用LOAD DATA LOCAL 来读取Web 服务器进程有读访问权限的任何文件(假定用户可以运行SQL 服务器的任何命令)。在这种环境中,MySQL 服务器的客户实际上是Web 服务器,而不是连接Web 服务器的用户运行的程序。
解决方法:
可以用

--local-infile=0 

选项启动mysqld 从服务器端禁用所有LOAD DATA LOCAL 命令。

对于mysql 命令行客户端,可以通过指定--local-infile[=1]选项启用LOAD DATA LOCAL,或通过--local-infile=0 选项禁用。类似地,对于mysqlimport,-- local or -L 选项启用本地数据文件装载。在任何情况下,成功进行本地装载需要服务器启用相关选项。


10 尽量避免通过symlinks 访问表:
不要允许使用表的符号链接。(可以用--skip-symbolic-links 选项禁用)。如果你用root 运行mysqld 则特别重要,因为任何对服务器的数据目录有写访问权限的人则能够删除系统中的任何文件!


11 drop table 命令并不收回以前的相关访问授权:
drop 表的时候,其他用户对此表的权限并没有被收回,这样导致重新创建同名的表时,以前其他用户对此表的权限会自动赋予,导致权限外流。因此,要在删除表时,同时取消其他用户在此表上的相应权限。

 

12 如果可能,给所有用户加上访问IP 限制:
给所有用户加上ip 限制将拒绝所有未知的主机进行的连接,保证只有受信任的主机才可以进行连接。例如:

Grant select on dbname.* to ‘username’@’ip’ identified by ‘passwd’;


13 严格控制操作系统帐号和权限:
在数据库服务器上要严格控制操作系统的帐号和权限,比如:锁定mysql 用户
其他任何用户都采取独立的帐号登陆,管理员通过普通用户管理mysql;或者通过root su 到mysql 用户下进行管理。禁止修改mysql 用户下的任何资源


14 增加防火墙:

15  其他安全设置选项:
1 allow-suspicious-udfs:
该选项控制是否可以载入主函数只有xxx 符的用户定义函数。默认情况下,该选项被关闭,并且只能载入至少有辅助符的UDF。这样可以防止从未包含合法UDF 的共享对象文件载入函数。


2 old-passwords:
强制服务器为新密码生成短(pre-4.1)密码哈希。当服务器必须支持旧版本客户端程序时,为了保证兼容性这很有用

 

3 safe-user-create:
如果启用,用户不能用GRANT 语句创建新用户,除非用户有mysql.user 表的INSERT权限。如果你想让用户具有授权权限来创建新用户,你应给用户授予下面的权限:

mysql> GRANT INSERT(user) ON mysql.user TO 'user_name '@'host_name';

这样确保用户不能直接更改权限列,必须使用GRANT 语句给其它用户授予该权限。


4 secure-auth:
不允许鉴定有旧(pre-4.1)密码的账户。


5 skip-grant-tables:
这个选项导致服务器根本不使用权限系统。这给每个人以完全访问所有的数据库的权力!(通过执行mysqladmin flush-privileges 或mysqladmin reload 命令,或执行FLUSH PRIVILEGES 语句,你能告诉一个正在运行的服务器再次开始使用授权表。)


6 skip-networking:
在网络上不允许TCP/IP 连接。所有到mysqld 的连接必须经由Unix 套接字进行


7 skip-show-database:
使用该选项,只允许有SHOW DATABASES 权限的用户执行SHOW DATABASES 语句,该语句显示所有数据库名。不使用该选项,允许所有用户执行SHOW DATABASES,但只显示用户有SHOW DATABASES 权限或部分数据库权限的数据库名。请注意全局权限指数据库的权限。

posted @ 2017-09-11 20:19  hongxinerke  阅读(623)  评论(0编辑  收藏  举报