Linux Server

[Linux/Ubuntu]MySQL Password Policy(암호 정책) 변경 방법

톰아저씨의 오두막 2022. 1. 12. 12:46

[Linux/Ubuntu]MySQL Password Policy(암호 정책) 변경 방법

[Linux/Ubuntu] How to Change MySQL Password Policy Level

 

 

작업 환경

Server Version : Ubuntu 18.04, Ubuntu 20.04
php Version 7.2
Apache/2.4.29 (Ubuntu)
MySql Version 5.7.36

 

MySQL 패스워드 관련 정책

MySQL이 업그레이드 되면서 버전 별로 패스워드와 관련된 정책들이 점진적으로 보안이 강화되는 쪽으로 개선되었습니다. 변경된 내용을 모르고 사용하다 보면 아래와 같은 에러가 발생할 수 있습니다. 에러의 내용은 '암호가 현재 패스워드 정책 요구사항에 에 부합되지 않는다'는 의미입니다. 

 ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

 

특히, php 스크립트 작성 시 예전 버전에 쓰던 간단한 암호를 적용하여 처리할 경우 에러가 발생할 수 있는데, 이 경우 현재 설치된 MySQL의 패스워드 정책(Password Policy)에 대해서 확인할 필요가 있습니다.

 

먼저  콘솔 창에서 MySQL로 접속하기 위해  'root'계정으로 로그인 합니다.

mysql -u root -p

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
root@uncletom:~# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 16221
Server version: 5.7.36-0ubuntu0.18.04.1 (Ubuntu)
 
Copyright (c) 20002021, Oracle and/or its affiliates.
 
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>
 

 

현재의 패스워드 정책 설정을 확인하기 위하여 다음과 같이 입력합니다.

mysql> SHOW VARIABLES LIKE 'validate_password%';

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql> SHOW VARIABLES LIKE 'validate_password%';
+--------------------------------------+--------+
| Variable_name                        | Value  |
+--------------------------------------+--------+
| validate_password_check_user_name    | OFF    |
| validate_password_dictionary_file    |        |
| validate_password_length             | 8      |
| validate_password_mixed_case_count   | 1      |
| validate_password_number_count       | 1      |
| validate_password_policy             | MEDIUM |
| validate_password_special_char_count | 1      |
+--------------------------------------+--------+
7 rows in set (0.01 sec)
 
mysql>
 

 

쿼리 결과를 보면 현재의 패스워드 정책 내용은 다음과 같습니다.

 

ⓐvalidate_password_check_user_name (패스워드에 ID 사용 가능 여부)

패스워드에 사용자 ID를 사용하는 것을 허용할 것인지 묻습니다. 만약 사용자 ID가 'root'인데 패스워드를 동일하게 'root'라고 지정하고자 하는 경우 해당 값이 'OFF'로 설정되어 있으면 허용되지 않습니다.

 

ⓑvalidate_password_length (패스워드 길이)

유용한 패스워드 글자 수를 지정합니다. 현재는 8자 이상으로 설정되어 있습니다.

 

ⓒvalidate_password_mixed_case_count (대소문자 필수 사용)

대문자, 소문자를 최소 1회 이상 사용하여야 하는 것으로 설정되어 있습니다.

 

ⓓvalidate_password_number_count (숫자 필수 사용)

최소 1회 이상 숫자를 사용하여야 하는 것으로 설정되어 있습니다.

 

ⓔvalidate_password_policy (패스워드 정책 레벨)

현재 패스워드 정책 레벨이 'Medium'으로 설정되어 있습니다. 만약 현재보다 약화된 정책을 사용하고 싶다면 'Low'로 설정하면 됩니다.

 

ⓕvalidate_password_special_char_count (특수문자 필수 사용)

최소 1회 이상 특수문자를 사용하여야 하는 것으로 설정되어 있습니다.

 

MySQL 패스워드 정책 수준 변경 방법

조회 결과를 보면 현재 패스워드 수준은 'MEDIUM'으로 설정되어 있습니다. 아래 쿼리를 이용하여 패스워드 수준을 'LOW'로 변경할 수 있습니다.

SET GLOBAL validate_password_policy=LOW;

 

1
2
3
4
5
mysql> SET GLOBAL validate_password_policy=LOW;
Query OK, 0 rows affected (0.00 sec)
 
mysql>
 

 

쿼리 실행 후 패스워드 정책을 다음 쿼리로 조회해 보면 'valid_password_policy'가 'LOW'로 변경된 것을 확인할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql> SHOW VARIABLES LIKE 'validate_password%';
+--------------------------------------+-------+
| Variable_name                        | Value |
+--------------------------------------+-------+
| validate_password_check_user_name    | OFF   |
| validate_password_dictionary_file    |       |
| validate_password_length             | 8     |
| validate_password_mixed_case_count   | 1     |
| validate_password_number_count       | 1     |
| validate_password_policy             | LOW   |
| validate_password_special_char_count | 1     |
+--------------------------------------+-------+
7 rows in set (0.00 sec)
 
mysql>
 

 

패스워드 정책수준 세부항목 변경 방법

패스워드 정책 수준을 'LOW'로 변경하더라도 정책수준이 완화되긴 하지만 여전히 단순한 체계의 패스워드를 사용할 수는 없습니다. 패스워드 체계를 보다 완화하기 위해서는 세부항목을 변경하여야 합니다. 아래와 같은 쿼리를 이용하여 패스워드 정책수준 세부 항목을 변경할 수 있습니다.

 

ⓐ최소 글자 길이 규칙을 '5'로 지정

1
2
3
4
mysql> set global validate_password_length=5;
Query OK, 0 rows affected (0.00 sec)
 
mysql>

 

ⓑ대소문자 최소 1회 이상 사용 규칙 해제

1
2
3
4
mysql> set global validate_password_mixed_case_count=0;
Query OK, 0 rows affected (0.00 sec)
 
mysql>

 

ⓒ숫자 최소 1회 이상 사용규칙 해제

1
2
3
4
mysql> set global validate_password_number_count=0;
Query OK, 0 rows affected (0.00 sec)
 
mysql>

 

ⓓ특수문자 1회 이상 사용규칙 해제

1
2
3
4
mysql> set global validate_password_special_char_count=0;
Query OK, 0 rows affected (0.00 sec)
 
mysql>

 

쿼리를 이용하여 패스워드 정책을 변경한 후 변경된 패스워드 정책을 조회해 보면 아래와 같이 변경되었음을 확인할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
mysql> set global validate_password_length=5;
Query OK, 0 rows affected (0.00 sec)
 
mysql> set global validate_password_mixed_case_count=0;
Query OK, 0 rows affected (0.00 sec)
 
mysql> set global validate_password_number_count=0;
Query OK, 0 rows affected (0.00 sec)
 
mysql> set global validate_password_special_char_count=0;
Query OK, 0 rows affected (0.00 sec)
 
mysql> SHOW VARIABLES LIKE 'validate_password%';
+--------------------------------------+-------+
| Variable_name                        | Value |
+--------------------------------------+-------+
| validate_password_check_user_name    | OFF   |
| validate_password_dictionary_file    |       |
| validate_password_length             | 5     |
| validate_password_mixed_case_count   | 0     |
| validate_password_number_count       | 0     |
| validate_password_policy             | LOW   |
| validate_password_special_char_count | 0     |
+--------------------------------------+-------+
7 rows in set (0.01 sec)
 
mysql>

 

그리고 'password()' 함수를 이용해서 테스트를 해 보면 에러 없이 짧은 길이의 패스워드를 사용할 수 있음을 확인할 수 있습니다.

 

감사합니다.