
{"id":2136,"date":"2018-03-01T10:58:14","date_gmt":"2018-03-01T09:58:14","guid":{"rendered":"http:\/\/dasini.net\/blog\/?p=2136"},"modified":"2020-05-27T07:31:11","modified_gmt":"2020-05-27T06:31:11","slug":"mysql-security-password-validation-plugin","status":"publish","type":"post","link":"https:\/\/dasini.net\/blog\/2018\/03\/01\/mysql-security-password-validation-plugin\/","title":{"rendered":"MySQL Security \u2013 Password Validation Plugin"},"content":{"rendered":"<p>When thinking about security within a MySQL installation, you should consider a wide range of possible procedures \/ best practices and how they affect the security of your MySQL server and related applications. MySQL provides many tools \/ features \/ plugins in order to protect your data including some advanced features like<a href=\"http:\/\/dasini.net\/blog\/2018\/04\/10\/mysql-security-mysql-enterprise-transparent-data-encryption\/\" target=\"_blank\" rel=\"noopener noreferrer\"> Transparent Data Encryption aka TDE<\/a>,\u00a0<a href=\"http:\/\/dasini.net\/blog\/2018\/04\/04\/mysql-security-mysql-enterprise-audit\/\" target=\"_blank\" rel=\"noopener noreferrer\">Audit<\/a>, <a href=\"http:\/\/dasini.net\/blog\/2019\/03\/19\/mysql-security-mysql-enterprise-data-masking-and-de-identification\/\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"Data Masking &amp; De-Identification (opens in a new tab)\">Data Masking &amp; De-Identification<\/a>, <a href=\"http:\/\/dasini.net\/blog\/2018\/04\/16\/mysql-security-mysql-enterprise-firewall\/\" target=\"_blank\" rel=\"noopener noreferrer\">Firewall<\/a>, <a href=\"http:\/\/dasini.net\/blog\/2018\/03\/07\/mysql-security-password-management\/\" target=\"_blank\" rel=\"noopener noreferrer\">Password Management<\/a>, <a href=\"http:\/\/dasini.net\/blog\/2018\/03\/14\/mysql-security-user-account-locking\/\" target=\"_blank\" rel=\"noopener noreferrer\">User Account Locking<\/a>, <a href=\"http:\/\/dasini.net\/blog\/2018\/03\/29\/mysql-security-the-connection-control-plugins\/\" target=\"_blank\" rel=\"noopener noreferrer\">The Connection-Control Plugins<\/a>, etc&#8230;<\/p>\n<p><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/MySQL_DB_Lock2.png?resize=169%2C179\" alt=\"MySQL Security\" width=\"169\" height=\"179\" \/><\/p>\n<p>In this article, 1st of a <strong>MySQL Security<\/strong> series, we will see how to enforce Strong Passwords\u00a0with\u00a0<a href=\"https:\/\/dev.mysql.com\/doc\/refman\/5.7\/en\/validate-password.html\" target=\"_blank\" rel=\"noopener noreferrer\">Password Validation Plugin<\/a>\u00a0when using MySQL 5.7.<\/p>\n<p>Authentication with ID and password is a very simple and\u00a0common (because it&rsquo;s simple) way to secure the access to a resource, however the password can be the weak point of this system. In order to increase the security level, you can required that your <strong>user\u00a0passwords meet certain minimal security requirements<\/strong>, using the MySQL\u00a0Password\u00a0validation plugin!<\/p>\n<h2>Password Validation Plugin<\/h2>\n<p>The Password\u00a0validation plugin serves to test passwords and improve security. It exposes a set of system variables that enable you to define password policy.<\/p>\n<p>For\u00a0<a href=\"https:\/\/dev.mysql.com\/doc\/refman\/5.7\/en\/alter-user.html\" target=\"_blank\" rel=\"noopener noreferrer\">ALTER USER<\/a>, <a href=\"https:\/\/dev.mysql.com\/doc\/refman\/5.7\/en\/create-user.html\" target=\"_blank\" rel=\"noopener noreferrer\">CREATE USER<\/a>, <a href=\"https:\/\/dev.mysql.com\/doc\/refman\/5.7\/en\/grant.html\" target=\"_blank\" rel=\"noopener noreferrer\">GRANT<\/a>, and <a href=\"https:\/\/dev.mysql.com\/doc\/refman\/5.7\/en\/set-password.html\" target=\"_blank\" rel=\"noopener noreferrer\">SET PASSWORD<\/a> statements\u00a0the plugin checks the password against the current password policy and rejects it if it is weak.<\/p>\n<p>Examples are made with MySQL CE 5.7.21 on Linux:<\/p>\n<pre class=\"lang:mysql decode:true\" title=\"SHOW VARIABLES LIKE 'version%';\">mysql&gt; SHOW VARIABLES LIKE 'version%';\n+-------------------------+------------------------------+\n| Variable_name           | Value                        |\n+-------------------------+------------------------------+\n| version                 | 5.7.21                       |\n| version_comment         | MySQL Community Server (GPL) |\n| version_compile_machine | x86_64                       |\n| version_compile_os      | Linux                        |\n+-------------------------+------------------------------+<\/pre>\n<h3>Installation<\/h3>\n<p>Plugins are located in the&#8230; plugin directory. To know where is your MySQL plugin directory you can use SHOW VARIABLES :<\/p>\n<pre class=\"lang:mysql decode:true\" title=\"SHOW VARIABLES LIKE 'plugin_dir';\">mysql&gt; \nSHOW VARIABLES LIKE 'plugin_dir';\n+---------------+--------------------------+\n| Variable_name | Value                    |\n+---------------+--------------------------+\n| plugin_dir    | \/usr\/lib64\/mysql\/plugin\/ |\n+---------------+--------------------------+\n\nsystem ls -l \/usr\/lib64\/mysql\/plugin\/ | grep validate\n-rwxr-xr-x 1 root root   29336 Dec 28 04:07 validate_password.so<\/pre>\n<p>Use the regular\u00a0<a href=\"https:\/\/dev.mysql.com\/doc\/refman\/5.7\/en\/install-plugin.html\" target=\"_blank\" rel=\"noopener noreferrer\">INSTALL PLUGIN<\/a> statement:<\/p>\n<pre class=\"lang:mysql decode:true\" title=\"Install validate_password plugin\">-- Install validate_password plugin\nmysql&gt; \nINSTALL PLUGIN validate_password SONAME 'validate_password.so';\n\n-- Check validate_password status\nSELECT PLUGIN_NAME, PLUGIN_STATUS \nFROM INFORMATION_SCHEMA.PLUGINS \nWHERE PLUGIN_NAME LIKE 'validate%';\n+-------------------+---------------+\n| PLUGIN_NAME       | PLUGIN_STATUS |\n+-------------------+---------------+\n| validate_password | ACTIVE        |\n+-------------------+---------------+<\/pre>\n<p>INSTALL PLUGIN loads the plugin, and also registers it in the mysql.plugins system table to cause the plugin to be loaded for each subsequent normal server startup.<\/p>\n<p>Alternatively you can modify the MySQL configuration file (e.g. my.cnf or my.ini) and reboot the instance.<\/p>\n<p>e.g.<\/p>\n<pre class=\"lang:mysql decode:true\" title=\"load the plugin at server startup\"># sample from my.cnf\n[mysqld]\nplugin-load-add=validate_password.so<\/pre>\n<p>When installed some system and status variables are available:<\/p>\n<pre class=\"lang:mysql decode:true\">mysql&gt; SHOW VARIABLES LIKE 'validate%';\n+--------------------------------------+--------+\n| Variable_name                        | Value  |\n+--------------------------------------+--------+\n| validate_password_check_user_name    | OFF    |\n| validate_password_dictionary_file    |        |\n| validate_password_length             | 8      |\n| validate_password_mixed_case_count   | 1      |\n| validate_password_number_count       | 1      |\n| validate_password_policy             | MEDIUM |\n| validate_password_special_char_count | 1      |\n+--------------------------------------+--------+\n\n\nSHOW STATUS LIKE 'validate%';\n+-----------------------------------------------+---------------------+\n| Variable_name                                 | Value               |\n+-----------------------------------------------+---------------------+\n| validate_password_dictionary_file_last_parsed | 2018-02-06 14:58:19 |\n| validate_password_dictionary_file_words_count | 0                   |\n+-----------------------------------------------+---------------------+<\/pre>\n<p>They are described <a href=\"https:\/\/dev.mysql.com\/doc\/refman\/5.7\/en\/validate-password-options-variables.html\" target=\"_blank\" rel=\"noopener noreferrer\">here<\/a>.<\/p>\n<h3>Playtime<\/h3>\n<p>Let&rsquo;s play a little a bit with the Password Validation Plugin.<\/p>\n<h4>Set Password Validation Plugin to the LOW level<\/h4>\n<p>When <strong><em>validate_password_policy<\/em><\/strong> is set to <strong>LOW<\/strong> (or <b>0<\/b>) it checks only the length i.e. validate_password_length &gt;= 8 (by default)<\/p>\n<pre class=\"lang:mysql decode:true\" title=\"| validate_password_policy = LOW\">mysql&gt; \nSET GLOBAL validate_password_policy = 0;\n\n\nSHOW VARIABLES LIKE 'validate_password_policy';\n+--------------------------+-------+\n| Variable_name            | Value |\n+--------------------------+-------+\n| validate_password_policy | LOW   |\n+--------------------------+-------+<\/pre>\n<p><span style=\"text-decoration: underline;\">Warning<\/span><\/p>\n<p><em>Passwords in the following examples are not secure. Do NOT use trivial passwords!<\/em><\/p>\n<p>User creation that is not satisfy the policy will failed<\/p>\n<pre class=\"lang:mysql decode:true\">mysql&gt; \n-- NOK because password length &lt; 8 \nCREATE USER u_low1 IDENTIFIED by 'p';\nERROR 1819 (HY000): Your password does not satisfy the current policy requirements\n\n\n-- OK because password length &gt;= 8\nCREATE USER u_low2 IDENTIFIED by 'p2345678';\nQuery OK, 0 rows affected (0.01 sec)\n\nCREATE USER u_low3 IDENTIFIED by 'pppppppp';\nQuery OK, 0 rows affected (0.00 sec)\n\n\n\nmysql&gt; \n-- new users created\nSELECT user FROM mysql.user WHERE user LIKE 'u%';\n+--------+\n| user   |\n+--------+\n| u_low2 |\n| u_low3 |\n+--------+<\/pre>\n<h4>Set Password Validation Plugin to the MEDIUM level<\/h4>\n<p>When <strong>validate_password_policy<\/strong> is set to <strong>MEDIUM<\/strong> (or <strong>1<\/strong>) it checks<\/p>\n<ul>\n<li>the length i.e. validate_password_length &gt;= 8 (by default)<\/li>\n<li>numeric<\/li>\n<li>lowercase\/uppercase<\/li>\n<li>special characters<\/li>\n<\/ul>\n<pre class=\"lang:mysql decode:true\" title=\"validate_password_policy = MEDIUM\">mysql&gt; \nSET GLOBAL validate_password_policy = 1;\n\n\nSHOW VARIABLES LIKE 'validate_password_policy';\n+--------------------------+--------+\n| Variable_name            | Value  |\n+--------------------------+--------+\n| validate_password_policy | MEDIUM |\n+--------------------------+--------+<\/pre>\n<pre class=\"lang:mysql decode:true\">mysql&gt;\n-- NOK because password length &lt; 8, no special character, nor numeric, nor uppercase\nCREATE USER u_medium1 IDENTIFIED by 'p';\nERROR 1819 (HY000): Your password does not satisfy the current policy requirement\n\n-- NOK because no special character, nor uppercase\nCREATE USER u_medium2 IDENTIFIED by 'p2345678';\nERROR 1819 (HY000): Your password does not satisfy the current policy requirements\n\n-- NOK because no uppercase\nCREATE USER u_medium3 IDENTIFIED by 'p_345678';\nERROR 1819 (HY000): Your password does not satisfy the current policy requirements\n\n-- NOK because no uppercase\nCREATE USER u_medium4 IDENTIFIED by 'p_p45678';\nERROR 1819 (HY000): Your password does not satisfy the current policy requirements\n\n\n-- OK because password length &gt;= 8, numeric, lowercase\/uppercase, special character\nCREATE USER u_medium5 IDENTIFIED by 'p_P45678';\nQuery OK, 0 rows affected (0.00 sec)\n\n\n\nmysql&gt;\n-- new users created\nSELECT user FROM mysql.user WHERE user LIKE 'u%';\n+-----------+\n| user      |\n+-----------+\n| u_low2    |\n| u_low3    |\n| u_medium5 |\n+-----------+<\/pre>\n<h4>Set Password Validation Plugin to the STRONG level<\/h4>\n<p>When\u00a0<strong>validate_password_policy<\/strong> is set to <strong>STRONG<\/strong> (or <strong>2<\/strong>) it checks<\/p>\n<ul>\n<li>the length i.e. validate_password_length &gt;= 8 (by default)<\/li>\n<li>numeric<\/li>\n<li>lowercase\/uppercase<\/li>\n<li>special characters<\/li>\n<li>dictionary file<\/li>\n<\/ul>\n<pre class=\"lang:mysql decode:true\" title=\"validate_password_policy = STRONG\">mysql&gt; \nSET GLOBAL validate_password_policy = 2;\n\n\nSHOW VARIABLES LIKE 'validate_password_policy';\n+--------------------------+--------+\n| Variable_name            | Value  |\n+--------------------------+--------+\n| validate_password_policy | STRONG |\n+--------------------------+--------+<\/pre>\n<p>The main difference with the medium policy is the possibility to use a dictionary file to for checking password against. Set validate_password_dictionary_file variable. By default, this variable has an empty value and dictionary checks are not performed.<\/p>\n<pre class=\"lang:mysql decode:true\">-- No dictionary file by default\nmysql&gt; \nSHOW VARIABLES LIKE 'validate_password_dictionary_file';\n+-----------------------------------+-------+\n| Variable_name                     | Value |\n+-----------------------------------+-------+\n| validate_password_dictionary_file |       |\n+-----------------------------------+-------+<\/pre>\n<h2>In order to go further<\/h2>\n<h3>MySQL Security Series<\/h3>\n<ol>\n<li><a href=\"http:\/\/dasini.net\/blog\/2018\/03\/01\/mysql-security-password-validation-plugin\/\" target=\"_blank\" rel=\"noopener noreferrer\">Password Validation Plugin<\/a><\/li>\n<li><a href=\"http:\/\/dasini.net\/blog\/2018\/03\/07\/mysql-security-password-management\/\" target=\"_blank\" rel=\"noopener noreferrer\">Password Management<\/a><\/li>\n<li><a href=\"http:\/\/dasini.net\/blog\/2018\/03\/14\/mysql-security-user-account-locking\/\" target=\"_blank\" rel=\"noopener noreferrer\">User Account Locking<\/a><\/li>\n<li><a href=\"http:\/\/dasini.net\/blog\/2018\/03\/29\/mysql-security-the-connection-control-plugins\/\" target=\"_blank\" rel=\"noopener noreferrer\">The Connection-Control Plugins<\/a><\/li>\n<li><a href=\"http:\/\/dasini.net\/blog\/2018\/04\/04\/mysql-security-mysql-enterprise-audit\/\" target=\"_blank\" rel=\"noopener noreferrer\">Enterprise Audit<\/a><\/li>\n<li><a href=\"http:\/\/dasini.net\/blog\/2018\/04\/10\/mysql-security-mysql-enterprise-transparent-data-encryption\/\" target=\"_blank\" rel=\"noopener noreferrer\">Enterprise Transparent Data Encryption (TDE)<\/a><\/li>\n<li><a href=\"http:\/\/dasini.net\/blog\/2018\/04\/16\/mysql-security-mysql-enterprise-firewall\/\" target=\"_blank\" rel=\"noopener noreferrer\">Enterprise Firewall<\/a><\/li>\n<li><a href=\"http:\/\/dasini.net\/blog\/2019\/03\/19\/mysql-security-mysql-enterprise-data-masking-and-de-identification\/\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"Enterprise Data Masking and De-Identification (opens in a new tab)\">Enterprise Data Masking and De-Identification<\/a><\/li>\n<\/ol>\n<h3>Reference Manual<\/h3>\n<ul>\n<li><a href=\"https:\/\/dev.mysql.com\/doc\/refman\/5.7\/en\/validate-password.html\" target=\"_blank\" rel=\"noopener noreferrer\">MySQL 5.7 Password Validation Plugin<\/a><\/li>\n<li><a href=\"https:\/\/dev.mysql.com\/doc\/refman\/5.7\/en\/validate-password-installation.html\" target=\"_blank\" rel=\"noopener noreferrer\">MySQL 5.7 Password Validation Plugin Installation<\/a><\/li>\n<li><a href=\"https:\/\/dev.mysql.com\/doc\/refman\/5.7\/en\/validate-password-options-variables.html\" target=\"_blank\" rel=\"noopener noreferrer\">MySQL 5.7 Password Validation Plugin Options and Variables<\/a><\/li>\n<\/ul>\n<h3>MySQL Security<\/h3>\n<ul>\n<li><a href=\"https:\/\/dev.mysql.com\/doc\/mysql-security-excerpt\/5.7\/en\/\" target=\"_blank\" rel=\"noopener noreferrer\">Security in MySQL<\/a><\/li>\n<li><a href=\"https:\/\/dev.mysql.com\/doc\/mysql-secure-deployment-guide\/5.7\/en\/\" target=\"_blank\" rel=\"noopener noreferrer\">MySQL 5.7 Secure Deployment Guide<\/a><\/li>\n<li><a href=\"https:\/\/dev.mysql.com\/doc\/refman\/5.7\/en\/security.html\" target=\"_blank\" rel=\"noopener noreferrer\">MySQL 5.7 Reference Manual &#8211; Security<\/a><\/li>\n<\/ul>\n<p>\u00a0<\/p>\n\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<p><strong><span style=\"text-decoration: underline;\">MySQL Security Serie &#8211; Password Management<\/span><\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a aria-label=\"Random Password Generation? (opens in a new tab)\" href=\"http:\/\/dasini.net\/blog\/2020\/04\/15\/mysql-security-random-password-generation\/\" target=\"_blank\" rel=\"noreferrer noopener\" class=\"aioseop-link\">Random Password Generation<\/a><\/li><li><a aria-label=\"Password Expiration Policy? (opens in a new tab)\" href=\"http:\/\/dasini.net\/blog\/2020\/04\/21\/mysql-security-password-expiration-policy\/\" target=\"_blank\" rel=\"noreferrer noopener\" class=\"aioseop-link\">Password Expiration Policy<\/a><\/li><li><a aria-label=\"Password Reuse Policy? (opens in a new tab)\" href=\"http:\/\/dasini.net\/blog\/2020\/04\/28\/mysql-security-password-reuse-policy\/\" target=\"_blank\" rel=\"noreferrer noopener\" class=\"aioseop-link\">Password Reuse Policy<\/a><\/li><li><a aria-label=\"Password Verification-Required Policy? (opens in a new tab)\" href=\"http:\/\/dasini.net\/blog\/2020\/05\/05\/mysql-security-password-verification-required-policy\/\" target=\"_blank\" rel=\"noreferrer noopener\" class=\"aioseop-link\">Password Verification-Required Policy<\/a><\/li><li><a aria-label=\"Failed-Login Tracking and Temporary Account Locking? (opens in a new tab)\" href=\"http:\/\/dasini.net\/blog\/2020\/05\/12\/mysql-security-failed-login-tracking-and-temporary-account-locking\/\" target=\"_blank\" rel=\"noreferrer noopener\" class=\"aioseop-link\">Failed-Login Tracking and Temporary Account Locking<\/a><\/li><li><a href=\"http:\/\/dasini.net\/blog\/2020\/05\/19\/mysql-security-dual-password-support\/\" target=\"_blank\" aria-label=\"Dual Password Support (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"aioseop-link\">Dual Password Support<\/a><\/li><\/ul>\n\n\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<p><strong><a rel=\"noreferrer noopener\" href=\"https:\/\/www.youtube.com\/channel\/UC12TulyJsJZHoCmby3Nm3WQ\" target=\"_blank\" class=\"aioseop-link\"><span style=\"text-decoration: underline;\">Olivier&rsquo;s MySQL Channel<\/span><\/a><\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/youtu.be\/k4K-scd4oI0\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"Establish a policy for password expiration with MySQL\">Establish a policy for password expiration with MySQL<\/a><\/li><li><a href=\"https:\/\/youtu.be\/VND0KvuX7bc\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"Create users with a random password in MySQL\">Create users with a random password in MySQL<\/a><\/li><li><a href=\"https:\/\/www.youtube.com\/watch?v=4z6-dlGT-Mc\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"Enable restrictions on reuse of previous passwords with MySQL\">Enable restrictions on reuse of previous passwords with MySQL<\/a><\/li><li><a href=\"https:\/\/www.youtube.com\/watch?v=1RwlU14TDWk\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"Require MySQL users to provide their current password to change it\">Require MySQL users to provide their current password to change it<\/a><\/li><li><a href=\"https:\/\/www.youtube.com\/watch?v=6HO_ciRbiXw\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"Temporary Account Locking in MySQL\">Temporary Account Locking in MySQL<\/a><\/li><\/ul>\n\n\n<\/div><\/div>\n\n\n\n<div style=\"height:75px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"has-vivid-red-color has-text-color\"><strong>Thanks for using MySQL!<\/strong><\/p>\n\n\n\n<div style=\"height:25px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p><a href=\"https:\/\/www.linkedin.com\/groups\/12524512\/\" target=\"_blank\" rel=\"noopener\" title=\"Olivier DASINI on Linkedin\">Follow me on Linkedin<\/a><\/p>\n\n\n\n<p>Watch my videos on my <a href=\"https:\/\/www.youtube.com\/channel\/UC12TulyJsJZHoCmby3Nm3WQ\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"Olivier's MySQL Channel\">YouTube channel<\/a> and <a href=\"https:\/\/www.youtube.com\/channel\/UC12TulyJsJZHoCmby3Nm3WQ\/?sub_confirmation=1\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"Subscribe\">subscribe<\/a>.<\/p>\n\n\n\n<p>My <a href=\"https:\/\/www.slideshare.net\/freshdaz\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"Olivier DASINI on Slideshare\">Slideshare account<\/a>.<\/p>\n\n\n\n<p>My <a href=\"https:\/\/speakerdeck.com\/freshdaz\/\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"Olivier DASINI on Speaker Deck\">Speaker Deck account<\/a>.<\/p>\n\n\n\n<div style=\"height:25px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"has-vivid-red-color has-text-color\"><strong>Thanks for using HeatWave &amp; MySQL!<\/strong><\/p>\n\n\n","protected":false},"excerpt":{"rendered":"<p>In this article, 1st of a MySQL 5.7 Security series, we will see how to enforce Strong Passwords with Password Validation Plugin when using MySQL 5.7.<\/p>\n<p>Authentication with ID and password is a very simple and common (because it\u2019s simple) way to secure the access to a resource, however the password can be the weak point of this system. In order to increase the security level, you can required that your user passwords meet certain minimal security requirements, using the MySQL Password validation plugin!<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"footnotes":""},"categories":[203,365],"tags":[369,367],"class_list":["post-2136","post","type-post","status-publish","format-standard","hentry","category-mysql-en","category-security","tag-password-validation","tag-security"],"aioseo_notices":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p9LfWW-ys","jetpack-related-posts":[{"id":2177,"url":"https:\/\/dasini.net\/blog\/2018\/03\/14\/mysql-security-user-account-locking\/","url_meta":{"origin":2136,"position":0},"title":"MySQL Security &#8211; User Account Locking","author":"Olivier DASINI","date":"14 mars 2018","format":false,"excerpt":"For security reasons some context require you to setup a user account locking policy. Thus an unauthorized user is not able (anymore) to login to the MySQL server. In this 3rd article of the\u00a0MySQL 5.7 Security series, we\u00a0will see how to [un]lock a user account.","rel":"","context":"Dans &quot;MySQL&quot;","block_context":{"text":"MySQL","link":"https:\/\/dasini.net\/blog\/category\/mysql-en\/"},"img":{"alt_text":"MySQL Security","src":"https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/MySQL_DB_Lock2.png?resize=350%2C200","width":350,"height":200},"classes":[]},{"id":3557,"url":"https:\/\/dasini.net\/blog\/2020\/04\/15\/mysql-security-random-password-generation\/","url_meta":{"origin":2136,"position":1},"title":"MySQL Security &#8211; Random Password Generation","author":"Olivier DASINI","date":"15 avril 2020","format":false,"excerpt":"MySQL has the capability of generating random passwords for user accounts, as an alternative to requiring explicit administrator-specified literal passwords.","rel":"","context":"Dans &quot;MySQL&quot;","block_context":{"text":"MySQL","link":"https:\/\/dasini.net\/blog\/category\/mysql-en\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/img.youtube.com\/vi\/VND0KvuX7bc\/0.jpg?resize=350%2C200","width":350,"height":200},"classes":[]},{"id":2156,"url":"https:\/\/dasini.net\/blog\/2018\/03\/07\/mysql-security-password-management\/","url_meta":{"origin":2136,"position":2},"title":"MySQL Security \u2013 Password Management","author":"Olivier DASINI","date":"7 mars 2018","format":false,"excerpt":"Some regulations required\u00a0that the password is renewed in a timely and appropriate manner (e.g. every 90 days). In this article, 2nd of the MySQL 5.7 Security series, we will see how to\u00a0to establish a policy for password expiration\u00a0with MySQL 5.7\u00a0Password\u00a0Management.","rel":"","context":"Dans &quot;MySQL&quot;","block_context":{"text":"MySQL","link":"https:\/\/dasini.net\/blog\/category\/mysql-en\/"},"img":{"alt_text":"MySQL Security","src":"https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/MySQL_DB_Lock2.png?resize=350%2C200","width":350,"height":200},"classes":[]},{"id":3567,"url":"https:\/\/dasini.net\/blog\/2020\/05\/19\/mysql-security-dual-password-support\/","url_meta":{"origin":2136,"position":3},"title":"MySQL Security &#8211; Dual Password Support","author":"Olivier DASINI","date":"19 mai 2020","format":false,"excerpt":"Dual-password capability makes it possible to seamlessly perform credential changes without downtime.","rel":"","context":"Dans &quot;MySQL&quot;","block_context":{"text":"MySQL","link":"https:\/\/dasini.net\/blog\/category\/mysql-en\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":2202,"url":"https:\/\/dasini.net\/blog\/2018\/03\/29\/mysql-security-the-connection-control-plugins\/","url_meta":{"origin":2136,"position":4},"title":"MySQL Security &#8211; The Connection-Control Plugins","author":"Olivier DASINI","date":"29 mars 2018","format":false,"excerpt":"An ordinary threat databases could face is an attempt to discover the password by systematically trying every possible combination (letters, numbers, symbols). This is known as a brute force attack. In this fourth episode of the\u00a0MySQL 5.7 Security series, we will see how the MySQL DBA can leverage the\u00a0Connection-Control Plugins\u2026","rel":"","context":"Dans &quot;MySQL&quot;","block_context":{"text":"MySQL","link":"https:\/\/dasini.net\/blog\/category\/mysql-en\/"},"img":{"alt_text":"MySQL Security","src":"https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/MySQL_DB_Lock2.png?resize=350%2C200","width":350,"height":200},"classes":[]},{"id":3535,"url":"https:\/\/dasini.net\/blog\/2020\/04\/28\/mysql-security-password-reuse-policy\/","url_meta":{"origin":2136,"position":5},"title":"MySQL Security &#8211; Password Reuse Policy","author":"Olivier DASINI","date":"28 avril 2020","format":false,"excerpt":"MySQL provides password-reuse capability, which allows database administrators to determine the number of unique passwords a user must use before they can use an old password again.","rel":"","context":"Dans &quot;MySQL&quot;","block_context":{"text":"MySQL","link":"https:\/\/dasini.net\/blog\/category\/mysql-en\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/img.youtube.com\/vi\/4z6-dlGT-Mc\/0.jpg?resize=350%2C200","width":350,"height":200},"classes":[]}],"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/posts\/2136","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/comments?post=2136"}],"version-history":[{"count":36,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/posts\/2136\/revisions"}],"predecessor-version":[{"id":3726,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/posts\/2136\/revisions\/3726"}],"wp:attachment":[{"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/media?parent=2136"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/categories?post=2136"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/tags?post=2136"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}