mysql安全向加固validate_password和connection_control

首先查看系统变量plugin_dir,找到插件(Plugins)所在的路径,如下所示

mysql> select version() from dual;
5.7.27-log
mysql> show variables like 'plugin_dir';
plugin_dir  /usr/lib64/mysql/plugin/
[root@node3 ~]# ll /usr/lib64/mysql/plugin/
总用量 59436
-rwxr-xr-x 1 root root    96336 6月  10 2019 adt_null.so
-rwxr-xr-x 1 root root   349760 6月  10 2019 authentication_ldap_sasl_client.so
-rwxr-xr-x 1 root root    36336 6月  10 2019 auth_socket.so
-rwxr-xr-x 1 root root   933000 6月  10 2019 connection_control.so
drwxr-xr-x 2 root root     4096 2月   7 2021 debug
-rwxr-xr-x 1 root root 21655880 6月  10 2019 group_replication.so
-rwxr-xr-x 1 root root   473544 6月  10 2019 ha_example.so
-rwxr-xr-x 1 root root   961176 6月  10 2019 innodb_engine.so
-rwxr-xr-x 1 root root   957000 6月  10 2019 keyring_file.so
-rwxr-xr-x 1 root root   452832 6月  10 2019 keyring_udf.so
-rwxr-xr-x 1 root root  1177392 6月  10 2019 libmemcached.so
-rwxr-xr-x 1 root root  8966704 6月  10 2019 libpluginmecab.so
-rwxr-xr-x 1 root root    21424 6月  10 2019 locking_service.so
-rwxr-xr-x 1 root root    46712 6月  10 2019 mypluglib.so
-rwxr-xr-x 1 root root    33872 6月  10 2019 mysql_no_login.so
-rwxr-xr-x 1 root root 22233728 6月  10 2019 mysqlx.so
-rwxr-xr-x 1 root root    42280 6月  10 2019 rewrite_example.so
-rwxr-xr-x 1 root root   590904 6月  10 2019 rewriter.so
-rwxr-xr-x 1 root root   926624 6月  10 2019 semisync_master.so
-rwxr-xr-x 1 root root   152696 6月  10 2019 semisync_slave.so
-rwxr-xr-x 1 root root   202296 6月  10 2019 validate_password.so
-rwxr-xr-x 1 root root   499104 6月  10 2019 version_token.so

--------------------------------------------------------
mysql> select version() from dual;
8.0.23
mysql> show variables like 'plugin_dir';
plugin_dir  /usr/lib64/mysql/plugin/
[root@mysql8 ~]# ll /usr/lib64/mysql/plugin/
总用量 96728
-rwxr-xr-x. 1 root root   178600 12月 11 2020 adt_null.so
-rwxr-xr-x. 1 root root   661280 12月 11 2020 authentication_ldap_sasl_client.so
-rwxr-xr-x. 1 root root   117040 12月 11 2020 auth_socket.so
-rwxr-xr-x. 1 root root   273584 12月 11 2020 component_audit_api_message_emit.so
-rwxr-xr-x. 1 root root   199456 12月 11 2020 component_log_filter_dragnet.so
-rwxr-xr-x. 1 root root   469224 12月 11 2020 component_log_sink_json.so
-rwxr-xr-x. 1 root root   155160 12月 11 2020 component_log_sink_syseventlog.so
-rwxr-xr-x. 1 root root   539808 12月 11 2020 component_mysqlbackup.so
-rwxr-xr-x. 1 root root    39896 12月 11 2020 component_query_attributes.so
-rwxr-xr-x. 1 root root   928936 12月 11 2020 component_reference_cache.so
-rwxr-xr-x. 1 root root   511328 12月 11 2020 component_validate_password.so
-rwxr-xr-x. 1 root root  1351456 12月 11 2020 connection_control.so
-rwxr-xr-x. 1 root root  3200552 12月 11 2020 ddl_rewriter.so
drwxr-xr-x. 2 root root     4096 3月   8 2021 debug
-rwxr-xr-x. 1 root root 64278200 12月 11 2020 group_replication.so
-rwxr-xr-x. 1 root root   637960 12月 11 2020 ha_example.so
-rwxr-xr-x. 1 root root  1365312 12月 11 2020 ha_mock.so
-rwxr-xr-x. 1 root root  1312904 12月 11 2020 innodb_engine.so
-rwxr-xr-x. 1 root root  2699400 12月 11 2020 keyring_file.so
-rwxr-xr-x. 1 root root   552008 12月 11 2020 keyring_udf.so
-rwxr-xr-x. 1 root root  1286656 12月 11 2020 libmemcached.so
-rwxr-xr-x. 1 root root  9070376 12月 11 2020 libpluginmecab.so
-rwxr-xr-x. 1 root root    92840 12月 11 2020 locking_service.so
-rwxr-xr-x. 1 root root   117880 12月 11 2020 mypluglib.so
-rwxr-xr-x. 1 root root  2807760 12月 11 2020 mysql_clone.so
-rwxr-xr-x. 1 root root   114736 12月 11 2020 mysql_no_login.so
-rwxr-xr-x. 1 root root   117152 12月 11 2020 rewrite_example.so
-rwxr-xr-x. 1 root root  1582552 12月 11 2020 rewriter.so
-rwxr-xr-x. 1 root root  1711920 12月 11 2020 semisync_master.so
-rwxr-xr-x. 1 root root   795144 12月 11 2020 semisync_slave.so
-rwxr-xr-x. 1 root root   441344 12月 11 2020 validate_password.so
-rwxr-xr-x. 1 root root  1382792 12月 11 2020 version_token.so

安装插件

第一种方式:

mysql> INSTALL PLUGIN CONNECTION_CONTROL SONAME 'connection_control.so';
Query OK, 0 rows affected (0.05 sec)

mysql> INSTALL PLUGIN CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS SONAME 'connection_control.so';
Query OK, 0 rows affected (0.00 sec)
mysql> install plugin validate_password soname 'validate_password.so';
Query OK, 0 rows affected, 1 warning (0.01 sec)

运行时注册插件,无需重启mysql。

第二种方式:
my.cnf配置文件添加,之后需要重启mysql

[mysqld]
plugin-load-add=validate_password.so
plugin-load-add = connection_control.so

检查插件是否安装成功

#使用 show plugins;查看安装组件中有无validate_password参数
mysql> show plugins;
+------------------------------------------+----------+--------------------+-----------------------+---------+
| Name                                     | Status   | Type               | Library               | License |
+------------------------------------------+----------+--------------------+-----------------------+---------+
| binlog                                   | ACTIVE   | STORAGE ENGINE     | NULL                  | GPL     |
| mysql_native_password                    | ACTIVE   | AUTHENTICATION     | NULL                  | GPL     |
| sha256_password                          | ACTIVE   | AUTHENTICATION     | NULL                  | GPL     |
| caching_sha2_password                    | ACTIVE   | AUTHENTICATION     | NULL                  | GPL     |
| sha2_cache_cleaner                       | ACTIVE   | AUDIT              | NULL                  | GPL     |
| daemon_keyring_proxy_plugin              | ACTIVE   | DAEMON             | NULL                  | GPL     |
| CSV                                      | ACTIVE   | STORAGE ENGINE     | NULL                  | GPL     |
| MEMORY                                   | ACTIVE   | STORAGE ENGINE     | NULL                  | GPL     |
| InnoDB                                   | ACTIVE   | STORAGE ENGINE     | NULL                  | GPL     |
| INNODB_TRX                               | ACTIVE   | INFORMATION SCHEMA | NULL                  | GPL     |
| INNODB_CMP                               | ACTIVE   | INFORMATION SCHEMA | NULL                  | GPL     |
| INNODB_CMP_RESET                         | ACTIVE   | INFORMATION SCHEMA | NULL                  | GPL     |
| INNODB_CMPMEM                            | ACTIVE   | INFORMATION SCHEMA | NULL                  | GPL     |
| INNODB_CMPMEM_RESET                      | ACTIVE   | INFORMATION SCHEMA | NULL                  | GPL     |
| INNODB_CMP_PER_INDEX                     | ACTIVE   | INFORMATION SCHEMA | NULL                  | GPL     |
| INNODB_CMP_PER_INDEX_RESET               | ACTIVE   | INFORMATION SCHEMA | NULL                  | GPL     |
| INNODB_BUFFER_PAGE                       | ACTIVE   | INFORMATION SCHEMA | NULL                  | GPL     |
| INNODB_BUFFER_PAGE_LRU                   | ACTIVE   | INFORMATION SCHEMA | NULL                  | GPL     |
| INNODB_BUFFER_POOL_STATS                 | ACTIVE   | INFORMATION SCHEMA | NULL                  | GPL     |
| INNODB_TEMP_TABLE_INFO                   | ACTIVE   | INFORMATION SCHEMA | NULL                  | GPL     |
| INNODB_METRICS                           | ACTIVE   | INFORMATION SCHEMA | NULL                  | GPL     |
| INNODB_FT_DEFAULT_STOPWORD               | ACTIVE   | INFORMATION SCHEMA | NULL                  | GPL     |
| INNODB_FT_DELETED                        | ACTIVE   | INFORMATION SCHEMA | NULL                  | GPL     |
| INNODB_FT_BEING_DELETED                  | ACTIVE   | INFORMATION SCHEMA | NULL                  | GPL     |
| INNODB_FT_CONFIG                         | ACTIVE   | INFORMATION SCHEMA | NULL                  | GPL     |
| INNODB_FT_INDEX_CACHE                    | ACTIVE   | INFORMATION SCHEMA | NULL                  | GPL     |
| INNODB_FT_INDEX_TABLE                    | ACTIVE   | INFORMATION SCHEMA | NULL                  | GPL     |
| INNODB_TABLES                            | ACTIVE   | INFORMATION SCHEMA | NULL                  | GPL     |
| INNODB_TABLESTATS                        | ACTIVE   | INFORMATION SCHEMA | NULL                  | GPL     |
| INNODB_INDEXES                           | ACTIVE   | INFORMATION SCHEMA | NULL                  | GPL     |
| INNODB_TABLESPACES                       | ACTIVE   | INFORMATION SCHEMA | NULL                  | GPL     |
| INNODB_COLUMNS                           | ACTIVE   | INFORMATION SCHEMA | NULL                  | GPL     |
| INNODB_VIRTUAL                           | ACTIVE   | INFORMATION SCHEMA | NULL                  | GPL     |
| INNODB_CACHED_INDEXES                    | ACTIVE   | INFORMATION SCHEMA | NULL                  | GPL     |
| INNODB_SESSION_TEMP_TABLESPACES          | ACTIVE   | INFORMATION SCHEMA | NULL                  | GPL     |
| MyISAM                                   | ACTIVE   | STORAGE ENGINE     | NULL                  | GPL     |
| MRG_MYISAM                               | ACTIVE   | STORAGE ENGINE     | NULL                  | GPL     |
| PERFORMANCE_SCHEMA                       | ACTIVE   | STORAGE ENGINE     | NULL                  | GPL     |
| TempTable                                | ACTIVE   | STORAGE ENGINE     | NULL                  | GPL     |
| ARCHIVE                                  | ACTIVE   | STORAGE ENGINE     | NULL                  | GPL     |
| BLACKHOLE                                | ACTIVE   | STORAGE ENGINE     | NULL                  | GPL     |
| FEDERATED                                | DISABLED | STORAGE ENGINE     | NULL                  | GPL     |
| ngram                                    | ACTIVE   | FTPARSER           | NULL                  | GPL     |
| mysqlx_cache_cleaner                     | ACTIVE   | AUDIT              | NULL                  | GPL     |
| mysqlx                                   | ACTIVE   | DAEMON             | NULL                  | GPL     |
| CONNECTION_CONTROL                       | ACTIVE   | AUDIT              | connection_control.so | GPL     |
| CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS | ACTIVE   | INFORMATION SCHEMA | connection_control.so | GPL     |
| validate_password                        | ACTIVE   | VALIDATE PASSWORD  | validate_password.so  | GPL     |
+------------------------------------------+----------+--------------------+-----------------------+---------+
48 rows in set (0.00 sec)

最后三行就是新安装的插件
validate_password安装完默认值即为MEDIUM,通过show variables like 'validate_password%'; 查看已经开启密码策略。

# 查看 validate_password 的相关MySQL系统变量
mysql> show variables like 'validate_password%';
+--------------------------------------+--------+
| Variable_name                        | Value  |
+--------------------------------------+--------+
| validate_password_check_user_name    | ON     |       检查密码与用户名是否相同或相反,on检查,off不检查。
| validate_password_dictionary_file    |        |       检查密码与密码字典,字典文件的路径
| validate_password_length             | 8      |       检查密码的最小长度,即密码长度必须大于或等于8
| validate_password_mixed_case_count   | 1      |       如果密码策略是中等或者更强的,validate_password要求密码具有的小写和大写字符的最小数量。对于给定的这个值密码必须有那么多小写字符和那么多大写字符。
| validate_password_number_count       | 1      |       密码必须包含的数字个数
| validate_password_policy             | MEDIUM |       密码强度等级:可以使用数字0、1、2或者相应的符号值LOW、MEDIUM、STRONG来指定。
0/LOW:只检查长度
1/MEDIUM:检查长度、数字、大小写、特殊字符
2/STRONG:检查长度、数字、大小写、特殊字符、字典文件。
| validate_password_special_char_count | 1      |      密码必须包含的特殊字符个数。
+--------------------------------------+--------+
7 rows in set (0.00 sec)

修改配置方式:

mysql> set global validate_password_mixed_case_count=2
注意
动态修改,不一定会直接影响到validate_password_length的长度,如果validate_password_length已经是最小值时才会被动态修改掉,否则不会。
注意
validate_password_number_count,validate_password_special_char_count,validate_password_mixed_case_count三个的改动只会直接修改掉已经处在最小值的valide_password_length的值。
mysql> set global validate_password_policy=2

修改my.cnf配置文件之后重启mysql

[mysqld]
validate_password = on
plugin-load=validate_password.so
validate_password_policy=2
#服务器在启动时加载插件,并防止在服务器运行时删除插件。
validate-password=FORCE_PLUS_PERMANENT

检查Connection-Control的相关MySQL系统变量

mysql> SELECT PLUGIN_NAME, PLUGIN_LIBRARY, PLUGIN_STATUS, LOAD_OPTION  FROM INFORMATION_SCHEMA.PLUGINS  WHERE PLUGIN_LIBRARY = 'CONNECTION_CONTROL.SO';
+------------------------------------------+-----------------------+---------------+-------------+
| PLUGIN_NAME                              | PLUGIN_LIBRARY        | PLUGIN_STATUS | LOAD_OPTION |
+------------------------------------------+-----------------------+---------------+-------------+
| CONNECTION_CONTROL                       | connection_control.so | ACTIVE        | ON          |
| CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS | connection_control.so | ACTIVE        | ON          |
+------------------------------------------+-----------------------+---------------+-------------+
2 rows in set (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.01 sec)

  • connection_control_failed_connections_threshold
    登陆失败次数限制,默认值为3
  • connection_control_max_connection_delay
    限制重试时间最大值,单位为毫秒( milliseconds),默认值2147483647
  • connection_control_min_connection_delay
    限制重试时间最小值,单位为毫秒( milliseconds),默认值为1000毫秒,也就是1秒
    注意事项:
    connection_control_min_connection_delay的值必须小于connection_control_max_connection_delay,connection_control_max_connection_delay不能小于connection_control_min_connection_delay的值。

设置Connection-Control的相关系统变量

mysql> set global connection_control_min_connection_delay=60000;
Query OK, 0 rows affected (0.00 sec)

注意,命令方式设置全局系统变量在服务器重启后丢失,所以最好的方式在参数文件my.cnf设置全局系统变量

修改my.cnf配置文件
[mysqld]
plugin-load-add = connection_control.so          #不是必须
connection-control = FORCE                       #不是必须
connection-control-failed-login-attempts = FORCE #不是必须
connection_control_min_connection_delay = 60000
connection_control_max_connection_delay = 1800000 
connection_control_failed_connections_threshold = 3

三次连续输错密码后,就会在第四次输入密码后挂起

注意,MySQL服务重启过后,INFORMATION_SCHEMA.CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS中的数据全部前空。

必须激活CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS插件才能使用该表CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS,并且要么激活CONNECTION_CONTROL插件,要么该表的内容始终为空。

该表仅包含已进行一次或多次连续失败连接尝试而没有随后成功尝试的客户端的行。 当客户端成功连接时,其失败连接计数将重置为零,并且服务器将删除与该客户端对应的任何行。

在运行时为connection_control_failed_connections_threshold系统变量分配一个值会将所有累积的失败连接计数器重置为零,这将导致表变空。

解除账号延迟响应限制

方法1: 重启MySQL实例

方法2: 调整系统变量connection_control_failed_connections_threshold的值。

mysql> SELECT * FROM  INFORMATION_SCHEMA.CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS;
+-------------------+-----------------+
| USERHOST          | FAILED_ATTEMPTS |
+-------------------+-----------------+
| 'test'@'192.168%' |               5 |
+-------------------+-----------------+
1 row in set (0.00 sec)


mysql> set global connection_control_failed_connections_threshold=2;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM  INFORMATION_SCHEMA.CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS;
Empty set (0.00 sec)

卸载插件plugin

mysql> UNINSTALL PLUGIN CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS;
mysql> UNINSTALL PLUGIN CONNECTION_CONTROL;

卸载 validate_password 插件

### 卸载 validate_password  插件
mysql> UNINSTALL PLUGIN validate_password;

扩展

如果想关闭内置插件,比如MRG_MYISAM插件,配置如下:

[mysqld]
MRG_MYISAM=OFF
validate_password = OFF
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343