数据库原理及 MySQL 应用 | 数据库安全加固
数据库安全至关重要,可从多方面对数据库进行加固。
数据库安全怎么强调都不过分,可以从以下方面对数据库进行加固,让它更安全。
01、操作系统级别
可从以下七方面实现操作系统级别的安全加固。
1. 使用数据库专用服务器
使用专用的服务器安装 MySQL 服务,卸载或删除操作系统上的不必要的应用或服务,避免因为其他应用或服务存在安全漏洞给 MySQL 运行带来的安全风险,这样也能减少服务器的负担,提高性能。
2. 关闭不需要的端口
使用网络扫描工具(如 nmap 等)扫描服务器端口,检查除了 MySQL 需要监听的端口(默认为 3306)之外,还有哪些端口是打开的,关闭不必要的端口。
3. 不要将数据库和日志文件放在系统分区
系统分区是保存引导文件和系统文件的分区,操作系统运行时,会频繁对系统分区进行读写,也是各种病毒、木马、恶意软件等最关注的地方。例如 Windows 系统通常是 C 盘,Linux 系统是“/”“/var”“/usr”等,不管是出于安全还是性能上考虑,都不建议将 MySQL 安装在系统分区,也不要将数据文件和日志文件放在系统分区。
4、使用专用的最小权限账号运行数据库进程 mysqld
强烈建议使用专用的最小权限账号运行 mysqld 守护进程,不要用操作系统管理员的身份,提高本地安全性,防止 mysqld 对本地文件的存取对系统构成威胁。因为任何具有 FILE 权限的数据库用户都可以利用此账号创建文件,也可以将此账号能访问的任何文件读到数据库表中。
5. 严格管理操作系统账号
严格管理操作系统账号,防止账号信息外泄,尤其是系统管理员和运行 mysqld 守护进程的账号。配置密码策略,提高密码复杂度,定期更改密码。
6. 不要复用数据库账号
运行 MySQL 服务的操作系统账号不要用来运行其他应用或服务,避免因其他应用或服务被攻击而给 MySQL 服务带来的影响。
7. 数据文件夹及日志文件权限控制
合理设置 MySQL 的数据文件夹以及二进制日志文件、错误日志文件、慢查询日志文件、通用日志文件、审计日志文件等文件的访问权限,确保只有合适的账号拥有合适的权限,防止数据或日志文件被误删除、窃取或破坏。例如,只让运行 mysqld 守护进程的专用账号拥有完全控制的权限,禁用其他所有用户的读写权限。
02、MySQL 级别
可从以下 9 方面实现 MySQL 级别的安全加固。
1. 安全安装
MySQL 安装完成之后,建议使用 mysql_secure_installation 工具进行安全性设置,直接在 DOS 命令提示符窗口运行此命令即可。用此工具可以启用验证密码组件(VALIDATE PASSWORD COMPONENT)、评估密码强度、更改 root 用户的密码、删除匿名用户、限制 root 用户只能在本地登录、删除 test 数据库、重新加载权限表等。
2. 安装最新的补丁
可用“SHOW VARIABLES WHERE Variable_name LIKE "version";”或“SELECT VERSION();”命令查询 MySQL 的版本,如果有需要安装的补丁包,要及时安装。
3. 密码安全
确保所有用户都使用非空密码,尽量不使用固定密码,每个用户使用不同的密码,若需要将密码保存在特定全局配置文件或脚本中时,可用 MySQL 自带的用于安全加密登录的工具 mysql_config_editor,将密码加密储存,避免直接保存明文密码。另外,还可以根据需要设置以下几方面的内容,增加密码安全性。
1) 密码策略
设置合适级别的密码策略,强制用户的密码符合一定的要求,如密码长度在 8 位以上,使用数字、大小写、特殊字符等的随机组合。
可以用“SHOW VARIABLES LIKE 'validate_password%';”命令查看当前的密码策略配置,如图 11-4 所示。其中,validate_password.check_user_name 表示是否需要检查用户名;validate_password.dictionary_file 表示密码策略文件,只有密码策略强度为 STRONG 时才需要;validate_password.length 表示密码最小长度;validate_password.mixed_case_count 表示大小写字符长度,至少 1 个;validate_password.number_count 表示数字至少 1 个;validate_password.policy 表示密码策略强度为 MEDIUM,还可以设置为 LOW 或 STRONG;validate_password.special_char_count 表示特殊字符至少 1 个。
可在 MySQL 命令提示符窗口,用 SET 命令进行修改,其基本语法格式如下所示。
提示
若“SHOW VARIABLES LIKE 'validate_password%';”命令的输出结果为空集,说明没有安装密码验证组件,可在 MySQL 中运行下面命令安装密码验证组件。
若想卸载密码验证组件,可在 MySQL 中运行下面命令。
2) 密码过期及重用策略
根据需要设定密码过期时间,强制用户定期更改密码,可在全局及每个用户基础上建立密码重用策略,保存已使用过的历史密码,限制重复使用以前的密码。
3) 密码认证机制
尽量采用新的密码认证机制。MySQL 不断加固数据库的安全性,在 MySQL 8.0 中将之前的 mysql_native_password 机制,升级到新的 caching_sha2_password。
mysql_native_password 是 MySQL 5.6、5.7 默认的密码认证机制。当用户连接 MySQL 实例时,通过 challenge-response 的密码校验机制进行认证,使用 SHA1 哈希算法进行认证校验,并将用户的密码通过 SHA1(SHA1(password))两次哈希计算,保存在表“mysql.user”的列 authentication_string 中,但相同的密码必然会有相同的哈希值,而且随着时间的推移,SHA1 哈希算法也已经变得比较容易破解了。
cache_sha2_password 是 MySQL 8.0 默认的密码认证机制,它进行了如下几个方面的改进。
(1) 哈希算法升级为更为安全的 SHA256 算法,哈希算法的 round 次数从原来的 2 次,提升为 5000 次,round 次数越多,每次计算哈希值的代价越大,破解难度也就越大。
(2) 保存在列 authentication_string 中的哈希值为加盐(salt)后的值,这样就算两个不同用户的密码相同,保存在 mysql.user 表中的哈希值也不同。
(3) 用 TLS 加密或 RSA 密钥传输方式从客户端将密码传送到服务端。
4. 用户安全
建立不同类型的用户账号,如超级管理员账号、系统应用账号(实现备份、监控、审计等)、应用业务账号、业务人员账号、开发人员账号、测试人员账号、其他专用账号等,并制定相应的命名规则。
用户根据密码策略设置符合要求的密码,保护好自己的账号密码,防止泄露,非必要人员不需要知道账号的名称,尤其要控制可以访问所有数据库的账号。
对于不必要的用户,可以先禁用,后删除,做到无匿名账户和无废弃账户。
5. 权限安全
熟悉 MySQL 的权限系统,了解权限表中的每个权限,遵循最小权限原则,业务需要什么给什么,而不是直接给每个用户分配所有权限。坚持最小权限,是数据库安全的重要步骤。
以下几个是比较特殊的权限,应确保只有数据库管理员才能拥有。
(1) FILE:表示是否允许用户读取数据库所在主机的本地文件。
(2) PROCESS:表示是否允许用户查询所有用户的命令执行信息。
(3) SUPER:表示用户是否有设置全局变量、管理员调试等高级别权限。
(4) SHUTDOWN:表示用户是否可以关闭 MySQL 服务。
(5) CREATE_USER:表示用户是否可以创建或删除其他用户。
(6) GRANT:表示用户是否可以修改其他用户的权限。
另外,要合理控制 DDL 和 DML 语句的授权。因为它们会导致数据库结构或数据发生变化,在任何数据库中都要控制用户的此类权限,确保只授权给有业务需求的非管理员用户。
6. 端口安全
MySQL 默认端口是 3306,如果条件允许,建议定期修改。
7. 连接访问安全
使用专门主机与数据库连接,创建用户时指定主机信息,确保访问数据库的主机为已知用户或主机,把非法请求阻止在数据库以外。对已经连接的 IP 网段进行规范化、统一化的管理,定期进行权限复核操作,对系统所属 IP、用户进行权限梳理工作。
严禁开启外网访问,尽可能禁止远程网络连接,防止猜解密码攻击、溢出攻击和嗅探攻击。如果客户端在外网,不应该直接访问数据库,而是使用中间件堡垒机或其他替代方案。
有些连入数据库的应用程序存在后门,会造成数据库安全隐患,为此要检查所有连接数据库程序的安全性。
8. 限制 LOCAL INFILE/OUTFILE
禁用或限制 LOCAL INFILE/OUTFILE,防止造成任意文件读取或 webshell 写出,防止非授权用户访问本地文件。可以在 MySQL 的配置文件 my.ini 中设置“Local-infile=0”“secure_file_priv=NULL”“secure_file_priv=指定目录”来禁用或限制通过文件实现数据的导入和导出。
9. 日志审计加固
根据需要启用二进制日志、错误日志、通用查询日志、慢查询日志等日志,监控数据库的运行状态,查询出错原因,进行数据恢复,优化数据库性能等。对重要业务表的所有行为,最好全部审计。
MySQL 8.0 对于安全做了很多层的加固,除了以上提到的,还有 InnoDB 表空间加密、InnoDB redo/undo 加密、二进制日志加密等
03、网络级别
可从以下两方面在网络级别实现对 MySQL 安全的加固。
1. 使用 SSL 或 X509 加密连接
如果对数据保密要求非常严格,或 MySQL 数据库服务器与应用是跨信任域部署的,则需要考虑在数据库服务器与应用服务器之间建立 SSL 或 X509 加密通道,将传输数据进行加密。
2. 限定网络
数据库应该只对应用程序服务器开放,不要将其开放给整个网络,通过防火墙或其他白名单和中间件白名单过滤机制,限制对 MySQL 端口的访问。
最后需要强调的是,人才是安全的主导,最好根据具体情况制定详细的规章制度,对员工进行安全培训,增强员工的系统安全观念,做到细心操作,安全操作。
版权声明: 本文为 InfoQ 作者【TiAmo】的原创文章。
原文链接:【http://xie.infoq.cn/article/cc5fc3bf78a7b8ad0fa02ecc8】。文章转载请联系作者。
评论