非法登录限制
在数据安全日益重要的今天,合理的连接控制和密码管理策略是数据库防护的关键。MatrixOne 提供了一系列全局参数,旨在加强连接安全和密码管理,防止恶意攻击和未授权访问。
-
连接控制参数
connection_control_failed_connections_threshold
:该参数设置在短时间内允许的最大失败连接次数。当超过阈值后,MatrixOne 将拒绝该客户端的进一步连接尝试,从而有效防止暴力破解和恶意攻击。connection_control_max_connection_delay
:该参数指定客户端连接失败后需要等待的最大延迟时间。该延迟将在连接失败次数达到阈值后应用,以阻止进一步的连接尝试,增加恶意攻击的成本。
-
密码管理参数
default_password_lifetime
:该参数指定用户密码的有效期,单位为天,默认值为 0,表示密码永不过期。当密码过期时,用户仍可登录数据库,但无法执行 SQL 操作,除非通过ALTER USER
修改密码。password_history
:此参数限制用户在更改密码时不能使用最近的历史密码。如果设置为 5,用户将不能重用最近的 5 个密码。此配置可有效避免密码重用带来的安全隐患。password_reuse_interval
:该参数控制用户在密码过期后,不能在指定时间范围内重用历史密码。单位为天,默认值为 0,表示不进行历史密码的重用检查。
查看
SELECT @@global.connection_control_failed_connections_threshold; --默认值为 3
SELECT @@global.connection_control_max_connection_delay; --默认值为 0
SELECT @@global.default_password_lifetime; --默认值为 0
SELECT @@global.password_history; --默认值为 0
SELECT @@global.password_reuse_interval; --默认值为 0
设置
设置后需退出重连方可生效。
set global connection_control_failed_connections_threshold=xx;
set global connection_control_max_connection_delay=xx;--单位:ms
set global default_password_lifetime=xx;--单位为天
set global password_history=xx;
set global password_reuse_interval=xx;--单位为天
示例
connection_control_failed_connections_threshold & connection_control_max_connection_delay
mysql> SELECT @@global.connection_control_failed_connections_threshold;
+---------------------------------------------------+
| @@connection_control_failed_connections_threshold |
+---------------------------------------------------+
| 3 |
+---------------------------------------------------+
1 row in set (0.00 sec)
mysql> SELECT @@global.connection_control_max_connection_delay;
+-------------------------------------------+
| @@connection_control_max_connection_delay |
+-------------------------------------------+
| 0 |
+-------------------------------------------+
1 row in set (0.00 sec)
set global connection_control_failed_connections_threshold=2;
set global connection_control_max_connection_delay=10000;
--exit,退出后重新连接
mysql> SELECT @@global.connection_control_failed_connections_threshold;
+---------------------------------------------------+
| @@connection_control_failed_connections_threshold |
+---------------------------------------------------+
| 2 |
+---------------------------------------------------+
1 row in set (0.00 sec)
mysql> SELECT @@global.connection_control_max_connection_delay;
+-------------------------------------------+
| @@connection_control_max_connection_delay |
+-------------------------------------------+
| 10000 |
+-------------------------------------------+
1 row in set (0.00 sec)
--创建普通用户并赋权
create user user1 identified by '111';
create role role1;
grant create database on account * to role1;
grant alter user on account * to role1;
grant role1 to user1;
用错误密码尝试登录 user1 用户
#第一次:用错误密码登录
(base) admin@admindeMacBook-Pro matrixorigin.io.cn % mysql -u user1 -h 127.0.0.1 -P 6001 -p123
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user user1. internal error: check password failed
#第二次:用错误密码登录
(base) admin@admindeMacBook-Pro matrixorigin.io.cn % mysql -u user1 -h 127.0.0.1 -P 6001 -p123
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user user1. internal error: check password failed
#第三次:用正确密码登录
(base) admin@admindeMacBook-Pro matrixorigin.io.cn % mysql -u user1 -h 127.0.0.1 -P 6001 -p111
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 20101 (HY000): internal error: user is locked, please try again later
#等待十秒左右,再次登录,登录成功
(base) admin@admindeMacBook-Pro matrixorigin.io.cn % mysql -u user1 -h 127.0.0.1 -P 6001 -p111
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2662
Server version: 8.0.30-MatrixOne-v MatrixOne
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
default_password_lifetime
mysql> SELECT @@global.default_password_lifetime;
+-----------------------------+
| @@default_password_lifetime |
+-----------------------------+
| 0 |
+-----------------------------+
1 row in set (0.00 sec)
set global default_password_lifetime=1;
mysql> SELECT @@global.default_password_lifetime; --重连后生效
+-----------------------------+
| @@default_password_lifetime |
+-----------------------------+
| 1 |
+-----------------------------+
1 row in set (0.00 sec)
停止 mo,并修改系统时间为 1 个月后
# 停止mo
>mo_ctl stop
# 修改系统时间为1个月后
> sudo date "122518302024"
Wed Dec 25 18:30:00 CST 2024
#查看修改后时间
> date
Wed Dec 25 18:30:02 CST 2024
#启动mo
>mo_ctl start
#root用户连接mo,确认当前时间
>mo_ctl connect
mysql> select current_timestamp;
+----------------------------+
| current_timestamp() |
+----------------------------+
| 2024-12-25 18:32:30.664877 |
+----------------------------+
1 row in set (0.00 sec)
#尝试以普通用户登录,预期可以登陆,但无法执行除alter user xxx identified by 'xxxx';以外的sql语句;而dump用户则不受此限制。
>mysql -u sys:user1:role1 -h 127.0.0.1 -P 6001 -p123
mysql> create database db1;
ERROR 20101 (HY000): internal error: password has expired, please change the password
mysql> alter user user1 identified by '123';
Query OK, 0 rows affected (0.01 sec)
#以修改后的密码登录
>mysql -u sys:user1:role1 -h 127.0.0.1 -P 6001 -p123
mysql> create database db1;
Query OK, 1 row affected (0.03 sec)
password_history
mysql> SELECT @@global.password_history;
+--------------------+
| @@password_history |
+--------------------+
| 0 |
+--------------------+
1 row in set (0.00 sec)
set global password_history=2;
mysql> SELECT @@global.password_history;
+--------------------+
| @@password_history |
+--------------------+
| 2 |
+--------------------+
1 row in set (0.01 sec)
mysql> create user user2 identified by '111';
Query OK, 0 rows affected (0.03 sec)
--修改密码为'123',成功
mysql> alter user user2 identified by '123';
Query OK, 0 rows affected (0.02 sec)
--修改密码为 111,失败,因为 password_history=2,MatrixOne 会保留最近 2 个密码的历史记录
mysql> alter user user2 identified by '111';
ERROR 20301 (HY000): invalid input: The password has been used before, please change another one.
--修改密码为'123',成功
mysql> alter user user2 identified by '234';
Query OK, 0 rows affected (0.02 sec)
--再次修改密码为'111',成功
mysql> alter user user2 identified by '111';
Query OK, 0 rows affected (0.01 sec)
password_reuse_interval
mysql> select @@global.password_reuse_interval;
+---------------------------+
| @@password_reuse_interval |
+---------------------------+
| 0 |
+---------------------------+
1 row in set (0.00 sec)
mysql> set global password_reuse_interval=30;
Query OK, 0 rows affected (0.00 sec)
mysql> select @@global.password_reuse_interval; --重连后生效
+---------------------------+
| @@password_reuse_interval |
+---------------------------+
| 30 |
+---------------------------+
1 row in set (0.02 sec)
--创建用户 user3
create user user3 identified by '111';
--修改用户密码,成功
mysql> alter user user3 identified by '123';
Query OK, 0 rows affected (0.02 sec)
--更改系统时间为十天后在重启 mo,修改 user3 密码为‘111’,失败
mysql> alter user user3 identified by '111';
ERROR 20301 (HY000): invalid input: The password has been used before, please change another one
--更改系统时间为两个月后在重启 mo,修改 user3 密码为‘111’,成功
mysql> alter user user3 identified by '111';
Query OK, 0 rows affected (0.01 sec)