2.10 尽量避免通过 symlinks 访问表
不要允许使用表的符号链接。(可以用--skip-symbolic-links 选项禁用)。如果 你
用 root 运行 mysqld 则特别重要,因为任何对服务器的数据目录有写访问权限的人
则能够删除系统中的任何文件!
2.11 防止 DNS 欺骗
如果你不信任你的 DNS,你应该在授权表中使用 IP 数字而不是主机名。在任何情况下,你应该非常小心地使用包含通配符的主机名来创建 授权表条目!
2.12 DROP TABLE 命令并不收回以前的相关访问授权
drop 表的时候,其他用户对此表的权限并没有被收回,这样导致重新创建同名的表时,以前其他用户对此表的权限会自动赋予,导致权限外流。
因此,要在删除表时,同时取消其他用户在此表上的相应权限。
2.13 REVOKE 命令漏洞
grant all privileges on *.* to guest@localhost; 后
revoke all privileges on *.* from guest@localhost; 不起作用,必须针对每个数据单独使用 revoke
2.14 如果可能,给所有用户加上访问 IP 限制
给所有用户加上 ip 限制将拒绝所有未知的主机进行的连接,保证只有受信任的主
机才可以进行连接。例如:
Grant select on dbname.* to ‘username’@’ip’ identified by ’passwd’;
2.15 严格控制操作系统帐号和权限
在数据库服务器上要严格控制操作系统的帐号和权限,比如:
锁定 mysql 用户
其他任何用户都采取独立的帐号登陆,管理员通过普通用户管理 mysql;或者通过 root su到 mysql 用户下进行管理。
禁止修改 mysql 用户下的任何资源
2.16 增加防火墙
购买防火墙。这样可以保护你防范各种软件中至少 50%的各种类型的攻击。把MySQL放到防火墙后或隔离区(DMZ)
2.17 严格模式
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
2.18 限制MYSQL的访问目录
--chroot
2.19 防止在连接MYSQL是使用TCP/IP套接字
--skip-networking
2.20 防止连接到MYSQL数据库时使用主机名
--skip-name-resolve
2.21 防止没有SHOW DATABASES权限的用户使用此命令
--skip-show-database
2.22 如果对user表没有INSERT权限,可以防止这些用户通过GRANT命令创建用户
--safe-user-create
3 其他安全配置
MySQL 本身带有一些选项,适当的使用这些选项将会使数据库更加安全。
3.1 使用 skip-network
在网络上不允许 TCP/IP 连接,所有到数据库的连接必须由命名管道 (Named Pipes) 或共享内存(Shared Memory) 或 UNIX 套接字 SOCKET 文件进行。这个选项适合应用和数据库共用一台服务器的情况,其他客户端将无法通过网络远程访问数据库,大大增强了数据库的安全性,但同时也带来了管理维护上的不方便。 MySQL 仅能通过命名管道或共享内存 ( 在 widows 中 ) 或 Unix 套接字文件 ( 在 Unix 系统中 ) 来和客户端连接交互。以下为配置实例:
skip-networking
-S 是 --socket 的简写形式,如: -s /tmp/mysql.sock,而其值必须和服务端设置的相同
--protocol 是严格指定连接类型,如果一些设置使用默认值时,如windows下服务器端设置--socket=mysql(mysql是默认值),在连接时指定 --protocol=pipe 后 --socket=mysql 可省略指定。
1. 命名管道
只适合在 Windows 系统下用来连接本机的 MySQL ,性能可比一般的TCP/IP方式提升30%~50%。
服务端设置要求
enable-named-pipe #或 named_pipe=ON
socket=MySQL
客户端连接
mysql --protocol=pipe --socket=mysql
2. 共享内存
4.1版本后,mysql对windows系统还提供了共享内存方式的连接
服务端设置要求
shared-memory=ON
shared_memory_base_name=MYSQL
客户端连接
mysql --protocol=memory --shared-memory-base-name=mysql
3. UNIX套接字
linux和unix环境下,可以使用unix域套接字,来连接同在一台机器上的mysql;
服务端设置要求
socket=/tmp/mysql.sock
客户端连接
mysql --protocol=socket --socket=/tmp/mysql.sock
3.2 allow-suspicious-udfs
该选项控制是否可以载入主函数只有 xxx 符的用户定义函数。默认情况下,该选项被关闭,并且只能载入至少有辅助符的 UDF。这样可以防止从未包含合法 UDF 的共享对象文件载入函数。
3.3 old-passwords
强制服务器为新密码生成短(pre-4.1)密码哈希。当服务器必须支持旧版本客户端程序时,为了保证兼容性这很有用。
3.4 safe-user-create
如果启用, 用户不能用 GRANT 语句创建新用户,除非用户有 mysql.user 表的 INSERT
权限。如果你想让用户具有授权权限来创建新用户,你应给用户授予下面的权限:
mysql> GRANT INSERT(user) ON mysql.user TO 'user_name '@'host_name';
这样确保用户不能直接更改权限列,必须使用 GRANT 语句给其它用户授予该权限。
3.5 secure-auth
不允许鉴定有旧(pre-4.1)密码的账户
3.6 skip-grant-tables
这个选项导致服务器根本不使用权限系统。这给每个人以完全访问所有的数据库的权力!(通过执行 mysqladmin flush-privileges 或 mysqladmin reload 命令,或执行 FLUSH PRIVILEGES 语句,你能告诉一个正在运行的服务器再次开始使用授权表 。 )
3.7 skip-show-database
使用该选项,只允许有 SHOW DATABASES 权限的用户执行 SHOW DATABASES 语句,该
语句显示所有数据库名。不使用该选项,允许所有用户执行 SHOW DATABASES,但
只显示用户有 SHOW DATABASES 权限或部分数据库权限的数据库名。请注意全局权
限指数据库的权限。
3.8 使用 SSL
SSL ( Secure Socket Layer 安全套接字)是一种安全协议,最初由 Netscape 公司所开发,用以保障在Internet 上数据传输的安全 , 利用数据加密技术,可确保数据在网络上的传输过程中不会被截取。
应用场景,在主从数据库复制中使用,提供以下服务保障。
a) 认证用户和服务器,确保数据发送到正确的客户和服务器。
b) 加密数据以防止数据中途被窃取。
c) 维护数据的完整性,确保数据在传输过程中不被破坏。
在 MySql 中使用 SSL 进行安全传输,需要在命令行或选项文件中设置 ‘SSL’ 选项。下面以命令行为例,进行安装介绍。
A. 安装证书管理工具
a) 所需部件Win32OpenSSL-0_9_8g.exe ,可从网上下载
b) 安装 双击Win32OpenSSL-0_9_8g.exe 按提示进行安装。安装在C:\OpenSSL 目录下
c) 在C:\OpenSSL\bin 目录下创建root ,server ,client 三个子路径
d) 在创建证书时输入的用户名,密码请妥善保存
B. 创建根证书,并采用自签名签署它
a) 创建私钥 进入DOS 窗口,进入C:\OpenSSL\bin 路径,然后输入openssl genrsa -out root/root-key.pem 1024 命令,按Enter 键。
b) 创建证书请求 继续输入openssl req -new -out root/root-req.csr -key root/root-key.pem ,然后按Enter 键,要求输入一系列信息,可根据实际情况输入,但是CommonName :一定要输入root
c) 自签署根证书 继续输入openssl x509 -req -in root/root-req.csr -out root/root-cert.pem -signkey root/root-key.pem -days 3650 ,然后按Enter 键
d) 查看根证书内容 要先进入证书所在路径 例:C:\OpenSSL\bin\root ,然后输入keytool -printcert -file root-cert.pem,然后按Enter 键。
C. 创建服务器证书,并采用根证书签署它
a) 创建私钥 进入DOS 窗口,进入C:\OpenSSL\bin 路径,然后输入openssl genrsa -out server/server-key.pem 1024 命令,按Enter 键。
b) 创建证书请求 继续输入openssl req -new -out server/server-req.csr -key server/server-key.pem ,然后按Enter键,要求输入一系列信息,可根据实际情况输入,但是CommonName :一定要输入localhost 或服务器的域名(存在域名情况下)。
c) 签署服务器证书 继续输入openssl x509 -req -in server/server-req.csr -out server/server-cert.pem -signkey server/server-key.pem -CA root/root-cert.pem -CAkey root/root-key.pem -CAcreateserial -days 3650 ,然后按Enter 键。
d) 查看服务器证书内容 要先进入证书所在路径 例:C:\OpenSSL\bin\server ,然后输入keytool -printcert -file server-cert.pem ,然后按Enter 键。
D. 创建客户证书,并采用根证书签署它
a) 创建私钥 进入DOS 窗口,进入C:\OpenSSL\bin 路径,然后输入openssl genrsa -out client/client-key.pem 1024 命令,按Enter 键。
b) 创建证书请求 继续输入openssl req -new -out client/client-req.csr -key client/client-key.pem ,然后按Enter键,要求输入一系列信息,可根据实际情况输入,CommonName :输入用户ID 。
c) 签署客户证书 继续输入openssl x509 -req -in client/client-req.csr -out client/client-cert.pem -signkey client/client-key.pem -CA root/root-cert.pem -CAkey root/root-key.pem -CAcreateserial -days 3650 ,然后按Enter 键。
d) 查看客户证书内容 要先进入证书所在路径 例:C:\OpenSSL\bin\client ,然后输入keytool -printcert -file client-cert.pem ,然后按Enter 键。
完成以上步骤后,将所生成的证书root 、server 和client 文件夹,拷到C:\mysll 目录下。 至此,已部署完在启动服务器时所用的有关选项指明证书文件和密钥文件。在建立加密连接前,要准备三个文件,一个 CA 证书,是由可信赖第三方出具的证书,用来验证客户端和服务器端提供的证书。 CA 证书可向商业机构购买,也可自行生成。第二个文件是证书文件,用于在连接时向对方证明自已身份的文件。第三个文件是密钥文件,用来对在加密连接上传输数据的加密和解密。 MySQL 服务器端的证书文件和密钥文件必须首先安装,在 myssl 目录里的几个文件:root-cert.pem(CA 证书 ) , server-cert.pem( 服务器证书 ) , server-key.pem( 服务器公共密钥 ) 。
在主数据库创建从数据库操作所用的用户,并指定必须用SLL 认证。
CREATE USER ‘test_guest’@’localhost’ IDENTIFIED BY ‘1234’;
GRANT ALL PRIVILEGES ON music_shop.* TO ‘ test_guest ‘@’10.12.1.42’ REQUIRE ssl;
关闭主数据库
>mysqladmin -uroot shutdown
重启服务器,使配置生效。
>mysqld--ssl-ca=C:\myssl\server\root-cert.pem --ssl-cert=C:\myssl\server\server-cert.pem --ssl-key=C:\myssl\server\server-key.pem
用从数据库客户程序建立加密连接。
>mysql -u test_guest --ssl-ca=C:\myssl\client\root-cert.pem --ssl-cert=C:\myssl\client\client-cert.pem --ssl-key=C:\myssl\client\client-key.pem
配置完成后,调用 mysql 程序运行 \s 或 SHOW STATUS LIKE ‘SSL%’ 命令,如果看到 SSL: 的信息行就说明是加密连接了。如果把 SSL 相关的配置写进选项文件,则默认是加密连接的。也可用 mysql 程序的 --skip-ssl 选项取消加密连接。