亚马逊AWS官方博客
AWS 等保基础服务篇(四):Amazon RDS(MySQL)自查和加固指南(上)
概述
Amazon Relational Database Service(RDS)是亚马逊云科技提供的一种关系型数据库服务,支持多种数据库引擎,如 MySQL、PostgreSQL、Oracle、SQL Server 等。RDS 可以自动执行诸如备份、软件补丁更新、故障检测和恢复等数据库管理任务,从而大大简化客户的数据库管理和运维工作。
MySQL 是一种开源的关系型数据库管理系统,使用 SQL 语言进行查询和管理。它被广泛应用于各种网站、软件应用程序等,具有高性能、可靠性好、成本低廉等优点。
为了提高数据库系统的安全性,满足国家网络安全等级保护制度(后文简称“等保”)的要求,本文章以亚马逊云科技北京区域的 Amazon RDS(MySQL 8.0.35 版本)为例,参考等保三级测评要求,探讨并为客户对 Amazon RDS(MySQL)在进行等保自查时提供整改和加固指南。
Amazon RDS(MySQL)等保三级自查及加固
一.身份鉴别
a)应对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
在身份鉴别方面,Amazon RDS 支持三种身份认证方式:口令认证、Kerberos 统一认证以及 Amazon IAM 数据库认证,其中最常用的是口令认证。
对于口令认证,我们可执行以下查询语句检查 MySQL 中是否存在空口令账号:
默认情况 Amazon RDS(MySQL)仅有一个仅限本地登录的 Amazon RDS 内部账号 rdsadmin 账号为空口令。
在用户身份标识唯一性方面,MySQL 数据库采用“username@host”组合来唯一标识用户,MySQL 无法创建相同”username@host”组合用户,因此用户标识唯一性默认满足。也可以执行以下查询语句检查 MySQL 中是否存在相同” username@host” 的账号:
在用户身份鉴别信息复杂度方面,Amazon RDS 在创建 MySQL 实例时,会要求用户创建一个主用户并设置口令,口令设置支持两种方式:“在 Amazon Secrets Manager 中管理”以及“自我管理”。其中,推荐使用的 Amazon Secrets Manager 是亚马逊云科技提供给客户统一进行口令管理的服务,默认情况下 Amazon Secrets Manager 创建的口令长度是 32 位,并且包含大小写字母、数字、以及特殊字符,满足复杂度要求。
而在自我管理方面,Amazon RDS 还支持自动生成口令和客户自设,自动生成口令是 Amazon RDS 随机给客户生成一个口令,用户在创建完成后,有且仅有一次机会保存该口令,后期将无法查询到该口令,自动生成的口令默认长度超过 8 位以上,包含大小写字符以及数字,同样可满足复杂度要求。对于客户自设的口令,Amazon RDS 控制对口令长度进行校验,至少八位,但是未对复杂度进行校验。
此外,我们还可以执行以下查询语句检查 MySQL 中是否安装和配置了 validate_password.so 插件,并且配置了合适的口令复杂度。
默认情况,MySQL 未安装 validate_password.so 插件,因此查询结果为空。
我们可以使用下列命令安装插件 validate_password.so 插件:
安装成功后,插件默认密码策略如下:
上述策略表示:口令长度最短 8 位以上,包含大小写、数字、特殊字符,且口令中不得包含用户名。
我们可以通过 CREATE 新账户或者 ALTER 原有账号对密码复杂度功能进行验证。如下图所示,只有设置的密码满足策略要求后,新用户才能创建成功。
在口令定期更换方面我们建议使用 Amazon Secrets Manager 来托管 Amazon RDS 口令,并且开启 Amazon Secrets Manager 口令自动轮转功能,实现 Amazon RDS 的口令自动更换功能,该方式为亚马逊云科技的最佳安全实践,且如前文所述 Amazon Secrets Manager 自动轮换的口令依旧是满足等保要求的。Amazon Secrets Manager 口令自动轮转功能参考截图如下:
在 Amazon RDS(MySQL)我们可执行以下查询语句检查 MySQL 中口令是否设置了定期更换时间:
default_password_lifetime 的单位是天,MySQL 默认设置为 0,即永不过期。如需设置定期更换,我们可以执行下列命令(该操作需要账号有 SUPER or SYSTEM_VARIABLES_ADMIN 权限):
临时修改该参数,但该变更在重启 MySQL 数据库后会失效。也可以切换到使用具有 rds_superuser 权限的用户。执行以下命令:
其中,SET PERSIST 命令可以将服务器系统变量值永久保存到 MySQL 实例的参数组中。
b)应具有登录失败处理功能,应配置并启用结束会话、限制非法登录次数和当登录连接超时自动退出等相关措施
在登录失败处理方面,我们可执行以下查询语句检查 MySQL 中是否给账号设置了口令锁定策略:
默认情况下,MySQL 不会对账号设置口令锁定策略,需要管理员手动显式设置,样例如下:
上述输出表明”test@%”被设定了密码锁定策略,密码输错 3 次后,将锁定 1 天。
实际执行效果如下:
我们可以通过 CREATE 或者 ALTER 给账号设定密码锁定策略:
对于锁定的账号,除了被动等待自动解锁之外,我们还可以通过管理员手动进行解锁:
解锁之后,账户即可正常登录。
在自动退出方面,我们可执行以下查询语句检查 MySQL 中是否给账号设置了空闲会话自动超时退出时间:
默认情况下,该值为 28800 秒,也就是 8 小时,超时时间过长,无法达到相应的安全防护目的,建议应设置为 15 分钟。具体设置方法可参考上述“default_password_lifetime”参数修改方法。
c)当进行远程管理时,应采取必要措施防止鉴别信息在网络传输过程中被窃听
在加密远程管理方面,我们可执行以下查询语句检查 MySQL 中是否启用 SSL 协议:
MySQL 默认启用 SSL 协议加密传输中的数据。
d)应采用口令、密码技术、生物技术等两种或两种以上组合的鉴别技术对用户进行身份鉴别,且其中一种鉴别技术至少应使用密码技术来实现
在多因子鉴别方面,我们可执行以下查询语句检查 MySQL 中的多因子认证策略:
默认输出如下:
表示仅采用单一认证方式对登录用户进行身份鉴别。
MySQL 配置多因子认证登录的方式较为复杂,有兴趣的客户可参考链接。
二.访问控制
a)应对登录的用户分配账户和权限
如上所述,Amazon RDS 在创建 MySQL 实例时,会要求用户创建一个主用户及口令,主用户拥有大部分 Amazon RDS 权限,但不是全部权限,详细的主用户权限可查阅参考链接,无用户则无法登录 MySQL 数据库,此项默认满足。
b)应重命名或删除默认账户,修改默认账户的默认口令
Amazon RDS(MySQL)在创建时默认会建立 mysql.infoschema@localhost、mysql.session@localhost、mysql.sys@localhost 以及 rdsadmin@localhost,前三者已经被锁定无法登录 ,rdsadmin@localhost 为仅限本地登录的 Amazon RDS 服务内部空口令账号,用户无权修改该默认账号。验证命令如下:
观察输出,可以看到默认账号已被锁定。
c)应及时删除或停用多余的、过期的账户,避免共享账户的存在
执行以下查询语句输出用户列表,手动检查未锁定账号中是否存在多余、过期以及多人共用共享使用的账号。如果存在,则应删除多余、过期的账号,为共享账号创建各自使用的账号:
d)应授予管理用户所需的最小权限,实现管理用户的权限分离
先执行以下查询语句输出 MySQL 中在用、未锁定的账号列表,
对每个未锁定的账号,依次执行:show grants for “username@host”,检查普通账号是否存在类似”GRANT ALL PRIVILEGES ON *.* TO……” 过度授权语句,并评估是否为用户分配了最小权限,实现数据库管理员、审计管理员和安全管理员的权限分离。
建议用户可参考如下表格为 MySQL 分别设置不同的数据库管理员、审计管理员以及安全管理员账号,从而实现管理员的权限分离。
管理用户 | 作用描述 | 建议分配的权限 |
数据库管理员 | 数据库管理员应该拥有管理整个 MySQL 服务器的权限,包括创建、修改和删除数据库、表、视图、存储过程等对象,以及管理用户账户和权限。 | Create_priv、Drop_priv、Reload_priv、Process_priv、Grant_priv、References_priv、Index_priv、Alter_priv、Show_db_priv、Create_tmp_table_priv、Lock_tables_priv、Execute_priv、Create_view_priv、Show_view_priv、Create_routine_priv、Alter_routine_priv、Create_user_priv、Event_priv、Trigger_priv |
审计管理员 | 审计管理员主要负责监控和审计数据库的操作,因此需要具有查看和读取数据库对象的权限,但不需要修改或删除数据的权限。 | Select_priv、Process_priv、References_priv、Index_priv、Show_db_priv、Execute_priv、Show_view_priv |
安全管理员 | 安全管理员主要负责管理 MySQL 服务器的安全性,包括用户账户管理、密码策略设置等。 | Grant_priv、Create_user_priv、Create_role_priv、Drop_role_priv、Password_reuse_history、Password_reuse_time、Password_require_current |
e)应由授权主体配置访问控制策略,访问控制策略规定主体对客体的访问规则
执行下列命令,检查当前用户在各个数据库上拥有的权限:
执行下列命令,检查当前用户在各个数据库表上拥有的权限:
f)访问控制的粒度应达到主体为用户级或进程级,客体为文件、数据库表级
MySQL 的访问控制粒度默认达到了主体为用户级别、客体为数据库表级别,此项默认符合。
g)应对重要主体和客体设置安全标记,并控制主体对有安全标记信息资源的访问
MySQL 的访问控制主要基于自主访问控制模型(Discretionary Access Control, DAC)。在这种模型下,对象的所有者(如数据库管理员)可以自主决定对其他主体(如用户)授予何种访问权限,MySQL 本身不直接支持强制访问控制模型(Mandatory Access Control, MAC),因此默认无法对主体和客体设置安全标记,此项默认不符合。
总结
本文基于笔者过往测评和咨询服务经验,对 Amazon RDS(MySQL)的等保三级测评要求进行分析,给客户提供了整改和加固指南建议,但内容仅供提供技术参考,最终等保测评要求及结果还需以测评机构的实际测评结果为准。