MySQL OCP-12-安全

1月 28th, 2017

— 安全风险;
• 当多个用户同时访问MySQL服务器,尤其当这些用户通过Internet进行连接时,MySQL服务器将有安全风险;
• 不仅MySQL服务器处于危险中,整个服务器主机也可能受到损害;
• 有多种类型的安全攻击:
– 窃听
– 更改
– 播放
– 拒绝服务
• 对于所有连接,查询和其他操作,MySQL使用基于ACL(访问控制列表,access control list)的安全;
• ACL也支持MySQL客户机和服务器之间的SSL加密连接;

— MySQL安装安全风险;
最常见的安装安全风险为:
1.网络安全
1.MySQL服务器允许客户机通过网络进行连接并发出请求;
2.如果未限制特权,则用户可以查看客户机帐户信息:为每个帐户设置的特权应该仅提供对该帐户需要查看或修改的数据的访问权限;
3.任何没有口令的帐户都很容易受到攻击;
2.操作系统安全:通常使用专用的登录帐户管理MySQL;但是,该帐户所在的主机上可能还有其他登录帐户,将与MySQL不相关的帐户数量减至最少可以尽可能地降低此风险;
3.文件系统安全:服务器上的目录,数据库文件和日志文件可能会被不应具有访问权限的用户打开;

— 网络安全;
风险预防任务:
1.投资设置防火墙;
2.确保仅供授权的客户机进行访问;
3.限制服务器所使用的网络接口;
4.使用安全安装脚本:mysql_secure_installation;
5.遵守常规特权安全事项;
6.不通过Internet传输明文(未加密)数据:未加密的数据可被任何有时间和能力拦截该数据并使用它来达到自己目的的用户访问,因此,您应该使用SSL或SSH等加密协议;

— 口令安全;
风险预防任务:
1.使用强口令保护初始MySQL帐户;
2.不在数据库中存储任何纯文本口令:
1.mysql数据库将口令存储在user表中;
2.最好使用单向散列存储这些口令:MD5(),SHA1(),SHA2()。
3.不从字典中选择口令:有一些特殊程序可破译口令,应对这些程序的方法之一是使用由句子中每个单词的第一个字符组成的口令(例如,“Mary had a little lamb”可以生成口令“Mhall”);这种口令易于记忆和输入,但不知道句子的人很难猜到;

— 操作系统安全;
1.与配置的复杂程度有关:
1.将服务器主机上与MySQL不相关的任务数减至最少;
2.当为主机配置的任务较少时,与运行复杂配置以支持多个服务的主机相比,前一个主机更易于确保安全;
2.其他使用会导致潜在风险:所分配的MySQL服务器最好是主要用于MySQL或专供其用;
3.登录帐户对于专用于MySQL的计算机不是必需的;
4.完全专用于MySQL的系统可以在性能方面获益;

— 文件系统安全;
MySQL安装(目录和文件)风险预防任务:
1.更改所有权和访问权限后,再启动服务器:
1.将多用户系统的所有权设置为具有管理特权的帐户。
2.将与MySQL相关的目录和文件以及user和group表所有权设置为mysql,其中包括:
1.MySQL程序;
2.数据库目录和文件;
3.日志,状态和配置文件;
2.不要在保护文件之前设置口令,否则,将允许未经授权的用户替换文件;
3.设置一个专用于MySQL管理的帐户:
1.对于Linux之类的多用户系统,请将MySQL安装的所有组件的所有权设置为具有正确管理特权的专用登录帐户,这将保护安装免受不负责数据库管理的用户的访问;
2.设置此帐户的另外一个好处是,可以使用该帐户运行MySQL服务器,而不是从Linux root帐户运行服务器;具有root登录帐户特权的服务器拥有不必要的文件系统访问权限,从而成为一个安全风险;

— 保护数据;
用户可通过多种方法来损坏数据,必须采取措施以保护数据免受如SQL注入等攻击:
1.请勿信任应用程序用户输入的任何数据:
1.用户可以使用具有特殊意义的字符(如引号或转义序列)获取应用程序代码;
2.如果用户输入类似于DROP DATABASE mysql;的内容,请确保应用程序保持安全;
3.如果用户输入值234时,应用程序生成一个类似于SELECT * FROM table WHERE ID=234的查询,则用户可以输入值234 OR 1=1使应用程序生成查询SELECT * FROM table WHERE ID=234 OR 1=1;使用不会将值解释为SQL表达式的存储例程或预处理语句;
2.保护数值和字符串数据的值:
1.在数值字段中输入字符,空格和特殊符号而不是数字;应用程序应删除这些内容再将其传递给MySQL;
2.否则,用户可以获取对安全数据的访问权限,然后提交可以销毁数据或导致服务器负载过高的查询;
3.甚至需要保护公开可用的数据:
1.攻击会浪费服务器资源;
2.保护Web表单(在客户端校验),URL名称,特殊字符等;

— 使用安全连接;
1.默认情况下,MySQL使用未加密的客户机/服务器连接;
2.未加密连接无法满足在网络上安全传输数据的要求:
1.网络通信容易受到监视和攻击;
2.在客户机和服务器之间传输的数据可能会被更改;
3.使用加密算法可抵御大多数威胁:
1.这些算法会使所有类型的数据无法读取;
2.这可抵御多种类型的攻击;
4.某些应用程序需要加密连接所提供的安全性,对于这些连接,必须进行额外的计算(数据加密是CPU密集型操作,需要计算机执行额外工作);

— SSL协议;
1.MySQL支持MySQL客户机和服务器之间的SSL(secure sockets layer,安全套接字层)连接:MySQL可以针对单个连接启用加密,根据各个应用程序的需要,您可以选择常规的未加密连接或安全的加密SSL连接;
2.SSL连接协议具有以下特点:
1.使用不同的加密算法确保公共网络上数据的安全;
2.检测任何数据更改,丢失或重放;
3.结合了使用X509标准提供身份验证的算法;
3.需要额外安全保护(加密)的应用程序应使用SSL。
4.安全连接基于OpenSSL API。

补充:
X509使得在Internet上进行身份识别成为可能,这主要用于电子商务应用程序中;基本上,应该有一个受信任的证书颁发机构(Certificate Authority, CA),该机构将电子证书分配给任何需要它们的人;证书依赖于包含两个加密密钥(公钥和私钥)的非对称加密算法;

— 对MySQL服务器使用SSL;
1.SSL使用要求:
1.系统必须支持yaSSL(已随MySQL提供)或OpenSSL(http://www.openssl.org);
2.使用的MySQL版本必须包含SSL支持;
2.要获取安全连接以便使用MySQL和SSL,必须首先执行以下操作:
1.装入OpenSSL(如果使用的不是预编译的MySQL);
2.为MySQL配置SSL支持,要将MySQL源代码分发配置为使用SSL,请调用CMake: shell> cmake . -DWITH_SSL=bundled;
1.该操作会将分发配置为使用附带的yaSSL库;
2.要改用系统SSL库,请将相应选项指定为-DWITH_SSL=system;
3.确保MySQL数据库中的user表包含与SSL相关的列(ssl_*和x509_*),否则必须使用mysql_upgrade程序对其进行升级;
4.使用–ssl选项检查服务器二进制文件是否使用SSL支持进行编译;
shell> mysqld –ssl –help
060525 14:18:52 [ERROR] mysqld: unknown option ‘–ssl’
3.使用允许客户机使用SSL的选项启动服务器;

— 使用SSL启动MySQL服务器;
通过以下选项,使mysqld服务器客户机可以使用SSL进行连接:
1.–ssl-ca:确定要使用的证书颁发机构(Certificate Authority, CA)证书(加密必需);
2.–ssl-key:确定服务器公钥;
3.–ssl-cert:确定服务器私钥;
eg:shell> mysqld –ssl-ca=ca-cert.pem –ssl-cert=server-cert.pem –ssl-key=server-key.pem

— 要求SSL加密连接;
1.使用GRANT语句的REQUIRE SSL选项可仅允许某个帐户使用SSL加密连接:
GRANT ALL PRIVILEGES ON test.* TO ‘root’@’localhost’ IDENTIFIED BY ‘goodsecret’ REQUIRE SSL;
2.通过使用–ssl-ca选项启动mysql客户机可获得加密连接;
3.(可选)可以为X509连接指定–ssl-key和–ssl-cert选项:
shell> mysql –ssl-ca=ca-cert.pem –ssl-cert=server-cert.pem –ssl-key=server-key.pem

补充:
有很多方法可限制给定帐户的连接类型:
1.REQUIRE NONE:指示帐户没有SSL或X509要求;如果未指定与SSL相关的REQUIRE选项,则这是默认选项;如果用户名和口令有效,则允许未加密的连接;但是,如果客户机具有相应的证书和密钥文件,则客户机也可以通过指定一个选项来要求加密连接,即,客户机无需指定任何SSL命令选项,在这种情况下,连接是未加密的;
2.REQUIRE SSL:指示服务器仅允许帐户使用SSL加密连接;
3.REQUIRE X509:客户机必须具有有效的证书,但具体的证书,颁发者和主题无关紧要;唯一的要求是,应该可以使用其中一个CA证书验证其签名;

— 检查SSL状态;
1.检查正在运行的mysqld服务器是否支持SSL:mysql> SHOW VARIABLES LIKE ‘have_ssl’;
1.如果have_ssl的值为YES,则服务器支持SSL连接;
2.如果值为DISABLED,则服务器支持SSL连接,但在启动时未提供相应的–ssl-*选项;
2.使用ssl_cipher状态变量的值检查当前服务器连接是否使用了SSL:mysql> SHOW STATUS LIKE ‘ssl_cipher’;

例子:
1.Create clean environment
shell> /tmp
shell> rm -rf newcerts
shell> mkdir newcerts && cd newcerts
2.Create CA certificate
shell> openssl genrsa 2048 > ca-key.pem
shell> openssl req -new -x509 -nodes -days 3600 -key ca-key.pem -out ca-cert.pem
3.Create server certificate, remove passphrase, and sign it server-cert.pem = public key, server-key.pem = private key
shell> openssl req -newkey rsa:2048 -days 3600 -nodes -keyout server-key.pem -out server-req.pem
shell> openssl rsa -in server-key.pem -out server-key.pem
shell> openssl x509 -req -in server-req.pem -days 3600 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem
4.Create client certificate, remove passphrase, and sign it client-cert.pem = public key, client-key.pem = private key
shell> openssl req -newkey rsa:2048 -days 3600 -nodes -keyout client-key.pem -out client-req.pem
shell> openssl rsa -in client-key.pem -out client-key.pem
shell> openssl x509 -req -in client-req.pem -days 3600 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem
5.After generating the certificates, verify them:
shell> openssl verify -CAfile ca-cert.pem server-cert.pem client-cert.pem
server-cert.pem: OK
client-cert.pem: OK
6.修改my.cnf并且重新启动数据库服务器;
[mysqld]
ssl-ca=/tmp/newcerts/ca-cert.pem
ssl-cert=/tmp/newcerts/server-cert.pem
ssl-key=/tmp/newcerts/server-key.pem
7.检查是否支持SSL:mysql> SHOW VARIABLES LIKE ‘have_ssl’;
8.创建用户:GRANT ALL PRIVILEGES ON *.* TO ‘ssl_user’@’localhost’ IDENTIFIED BY ‘mysql’ REQUIRE SSL;
9.客户端连接:
shell> mysql -ussl_user -pmysql
ERROR 1045 (28000): Access denied for user ‘ssl_user’@’localhost’ (using password: YES)
shell> mysql -ussl_user -pmysql –ssl-ca=/tmp/newcerts/ca-cert.pem

— 使用SSL的优点和缺点;
1.优点:
1.提高了有需求的应用程序的安全性;
2.可以针对单个连接启用;
3.可用于复制操作;
2.缺点:
1.占用大量CPU资源;
2.降低了客户机/服务器协议的速度;
3.可能会推迟其他SQL任务;

— 与MySQL的安全远程连接;
1.MySQL支持与远程MySQL服务器的SSH(secure shell,安全shell)连接,这一功能要求:
– 客户机上存在 SSH 客户机;
– 通过 SSH 隧道进行从客户机到服务器的端口转发;
– 具有 SSH 客户机的计算机上存在客户机应用程序;
2.设置完成后,将有一个本地端口托管到 MySQL 的 SSH 连接并使用 SSH 进行加密;

— MySQL安全常见问题;
file:///Users/royalwzy/Applications/refman-5.6-en.html-chapter/faqs.html#faqs-security

— 课后练习;

标签:
目前还没有任何评论.