亚马逊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 中是否存在空口令账号:

select user,host,authentication_string from mysql.user where authentication_string = '' or authentication_string is NULL;

默认情况 Amazon RDS(MySQL)仅有一个仅限本地登录的 Amazon RDS 内部账号 rdsadmin 账号为空口令。

在用户身份标识唯一性方面,MySQL 数据库采用“username@host”组合来唯一标识用户,MySQL 无法创建相同”username@host”组合用户,因此用户标识唯一性默认满足。也可以执行以下查询语句检查 MySQL 中是否存在相同” username@host” 的账号:

select user ,host from mysql.user;

在用户身份鉴别信息复杂度方面,Amazon RDS 在创建 MySQL 实例时,会要求用户创建一个主用户并设置口令,口令设置支持两种方式:“在 Amazon Secrets Manager 中管理”以及“自我管理”。其中,推荐使用的 Amazon Secrets Manager 是亚马逊云科技提供给客户统一进行口令管理的服务,默认情况下 Amazon Secrets Manager 创建的口令长度是 32 位,并且包含大小写字母、数字、以及特殊字符,满足复杂度要求。

而在自我管理方面,Amazon RDS 还支持自动生成口令和客户自设,自动生成口令是 Amazon RDS 随机给客户生成一个口令,用户在创建完成后,有且仅有一次机会保存该口令,后期将无法查询到该口令,自动生成的口令默认长度超过 8 位以上,包含大小写字符以及数字,同样可满足复杂度要求。对于客户自设的口令,Amazon RDS 控制对口令长度进行校验,至少八位,但是未对复杂度进行校验。

此外,我们还可以执行以下查询语句检查 MySQL 中是否安装和配置了 validate_password.so 插件,并且配置了合适的口令复杂度。

SHOW VARIABLES LIKE 'validate_password%';

默认情况,MySQL 未安装 validate_password.so 插件,因此查询结果为空。

我们可以使用下列命令安装插件 validate_password.so 插件:

INSTALL PLUGIN validate_password SONAME '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 中口令是否设置了定期更换时间:

SHOW VARIABLES LIKE 'default_password_lifetime';

default_password_lifetime 的单位是天,MySQL 默认设置为 0,即永不过期。如需设置定期更换,我们可以执行下列命令(该操作需要账号有 SUPER or SYSTEM_VARIABLES_ADMIN 权限):

SET GLOBAL default_password_lifetime=90;

临时修改该参数,但该变更在重启 MySQL 数据库后会失效。也可以切换到使用具有 rds_superuser 权限的用户。执行以下命令:

SET PERSIST default_password_lifetime = 90;

其中,SET PERSIST 命令可以将服务器系统变量值永久保存到 MySQL 实例的参数组中。

b)应具有登录失败处理功能,应配置并启用结束会话、限制非法登录次数和当登录连接超时自动退出等相关措施

在登录失败处理方面,我们可执行以下查询语句检查 MySQL 中是否给账号设置了口令锁定策略:

SELECT user, host,User_attributes FROM mysql.user;

默认情况下,MySQL 不会对账号设置口令锁定策略,需要管理员手动显式设置,样例如下:

上述输出表明”test@%”被设定了密码锁定策略,密码输错 3 次后,将锁定 1 天。

实际执行效果如下:

我们可以通过 CREATE 或者 ALTER 给账号设定密码锁定策略:

ALTER USER aUser2@localhost FAILED_LOGIN_ATTEMPTS  3 PASSWORD_LOCK_TIME 1;
CREATE USER aUser@localhost IDENTIFIED BY 'pAssw0rD' FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 1;

对于锁定的账号,除了被动等待自动解锁之外,我们还可以通过管理员手动进行解锁:

alter user 'test'@'%' ACCOUNT UNLOCK;

解锁之后,账户即可正常登录。

在自动退出方面,我们可执行以下查询语句检查 MySQL 中是否给账号设置了空闲会话自动超时退出时间:

SHOW VARIABLES LIKE 'wait_timeout';

默认情况下,该值为 28800 秒,也就是 8 小时,超时时间过长,无法达到相应的安全防护目的,建议应设置为 15 分钟。具体设置方法可参考上述“default_password_lifetime”参数修改方法。

c)当进行远程管理时,应采取必要措施防止鉴别信息在网络传输过程中被窃听

在加密远程管理方面,我们可执行以下查询语句检查 MySQL 中是否启用 SSL 协议:

show variables like '%have_ssl%';

MySQL 默认启用 SSL 协议加密传输中的数据。

d)应采用口令、密码技术、生物技术等两种或两种以上组合的鉴别技术对用户进行身份鉴别,且其中一种鉴别技术至少应使用密码技术来实现

在多因子鉴别方面,我们可执行以下查询语句检查 MySQL 中的多因子认证策略:

show variables like 'authentication_policy';

默认输出如下:

表示仅采用单一认证方式对登录用户进行身份鉴别。

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 服务内部空口令账号,用户无权修改该默认账号。验证命令如下:

select user, host, account_locked,authentication_string from mysql.user;

观察输出,可以看到默认账号已被锁定。

c)应及时删除或停用多余的、过期的账户,避免共享账户的存在

执行以下查询语句输出用户列表,手动检查未锁定账号中是否存在多余、过期以及多人共用共享使用的账号。如果存在,则应删除多余、过期的账号,为共享账号创建各自使用的账号:

select user, host, account_locked from mysql.user;

d)应授予管理用户所需的最小权限,实现管理用户的权限分离

先执行以下查询语句输出 MySQL 中在用、未锁定的账号列表,

select user, host, account_locked from mysql.user;

对每个未锁定的账号,依次执行: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)应由授权主体配置访问控制策略,访问控制策略规定主体对客体的访问规则

执行下列命令,检查当前用户在各个数据库上拥有的权限:

select * from mysql.db;

执行下列命令,检查当前用户在各个数据库表上拥有的权限:

select * from mysql.tables_priv;

f)访问控制的粒度应达到主体为用户级或进程级,客体为文件、数据库表级

MySQL 的访问控制粒度默认达到了主体为用户级别、客体为数据库表级别,此项默认符合。

g)应对重要主体和客体设置安全标记,并控制主体对有安全标记信息资源的访问

MySQL 的访问控制主要基于自主访问控制模型(Discretionary Access Control, DAC)。在这种模型下,对象的所有者(如数据库管理员)可以自主决定对其他主体(如用户)授予何种访问权限,MySQL 本身不直接支持强制访问控制模型(Mandatory Access Control, MAC),因此默认无法对主体和客体设置安全标记,此项默认不符合。

总结

本文基于笔者过往测评和咨询服务经验,对 Amazon RDS(MySQL)的等保三级测评要求进行分析,给客户提供了整改和加固指南建议,但内容仅供提供技术参考,最终等保测评要求及结果还需以测评机构的实际测评结果为准。

本篇作者

王俊峰

亚马逊云科技专业服务团队安全顾问,负责云安全合规、云安全解决方案等的咨询设计及落地实施,致力于为客户上云提供安全最佳实践,并解决客户上云中碰到的安全需求。

李阳

亚马逊云科技安全解决方案架构师,负责基于亚马逊云科技云原生安全服务的解决方案架构设计、咨询和落地,包括网络安全等级保护解决方案、多账号安全治理解决方案等。加入亚马逊云科技前曾在移动通信 5G 安全技术研究和标准化、国密算法及标准化、云计算安全产品管理(云安全运维审计、云应用身份管理 IDaaS)和解决方案方面有着丰富经验。