AWS RDS MySQL是否能实现登录限制类需求

问题描述:

此类问题一般来说在等保中会频繁遇到:

对于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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值