问题描述:
此类问题一般来说在等保中会频繁遇到:
对于AWS RDS MySQL 5.7和8.0的实例,能否做到如下限制和需求:
1. 一个连接到数据库的session,超过一段时间以后被RDS MySQL结束的功能:
RDS MySQL 5.7和8.0中,均可以通过更改参数组中wait_timeout 和 interactive_timeout参数来设置。当连接空闲并超过参数设置的时长,那么会导致RDS MySQL自动断掉这个连接。
wait_timeout对于非交互用户(例如后台应用程序、自动化或其他脚本)是适用的,而interactive_timeout对于交互用户(例如MySQL shell、phpMyAdmin或其他GUI工具)是适用的。
我们需要更改RDS的参数组为自建参数组,而后在参数组中搜索wait_timeout和interactive_timeout值为您需要的值,来实现此功能。
我们的测试为mysql client,在连接一段时间以后,再次运行query,遇到如下报错,但重连成功:
ERROR 2013 (HY000): Lost connection to MySQL server during query
No connection. Trying to reconnect...
Connection id: 15
Current database: *** NONE ***
2. 限制非法登录次数, 在RDS MySQL 5.7中无法实现,但是在RDS MySQL 8.0中可以实现:
我们可以参考文档[1] 安装相应插件, 这一步 RDS MySQL 5.7和RDS MySQL 8.0中均可实现:
mysql> INSTALL PLUGIN CONNECTION_CONTROL SONAME 'connection_control.so';
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW VARIABLES LIKE 'connection_control%';
+-------------------------------------------------+------------+
| Variable_name | Value |
+-------------------------------------------------+------------+
| connection_control_failed_connections_threshold | 3 |
| connection_control_max_connection_delay | 2147483647 |
| connection_control_min_connection_delay | 1000 |
+-------------------------------------------------+------------+
3 rows in set (0.00 sec)
mysql> ^C
mysql> INSTALL PLUGIN CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS SONAME 'connection_control.so';
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'connection%';
+------------------------------------------+---------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+------------------------------------------+---------------+
| CONNECTION_CONTROL | ACTIVE |
| CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS | ACTIVE |
+------------------------------------------+---------------+
2 rows in set (0.01 sec)
而后,在RDS MySQL 8.0中,我们创建了测试用户以进行验证:
mysql> create user test identified by 'password' failed_login_attempts 3 password_lock_time 3;
Query OK, 0 rows affected (0.03 sec)
--在多次输入密码错误以后,我们在登录时遇到如下报错:
[ec2-user@ip-192-168-0-87 ~]$ mysql -utest -p'password1' -h rdsresmysql8xxxxxnorth-1.amazonaws.com.cn
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 3955 (HY000): Access denied for user 'test'@'192.168.0.87'. Account is blocked for 3 day(s) (3 day(s) remaining) due to 3 consecutive failed logins.
对于RDS MySQL 5.7来说,如上功能不支持,仅能做到,一旦连续的失败登陆次数超过设定阈值,那么就会产生延迟,并且延迟随着失败次数增加而增加,上限为connection_control_max_connection_delay的设置; 具体的计算方式如下:
MIN ((failed_attempts - threshold) * MIN_DELAY), MAX_DELAY)
3. 当登录连接超时自动退出功能:
登录连接超时与第1条中的参数更改可以达到的效果相似,但是“超时自动退出”更像是客户端主动退出,而不是被RDS服务被动打断连接。可能需要我们在客户端方面进行设置,让客户端在超时以后主动退出。
此外,RDS Proxy有类似功能可以实现此需求:
根据文档[2]中的RDS Proxy的IdleClientTimeout参数,我们可以通过此参数指定在代理关闭客户端连接之前,客户端连接可以处于空闲状态的时长。如果应用程序未在上一请求完成后的指定时间内提交新请求,则将客户端连接视为空闲。底层数据库连接保持打开状态并返回到连接池。因此,它可以重复用于新的客户端连接。
参考文档:
[1] https://repost.aws/zh-Hans/knowledge-center/rds-mysql-connection-control-plugin
[2] https://docs.amazonaws.cn/AmazonRDS/latest/UserGuide/rds-proxy-managing.html