MariaDB [mysql]> show global variables like 'simple_password%';
+-----------------------------------------+-------+
| Variable_name                           | Value |
+-----------------------------------------+-------+
| simple_password_check_digits            | 1     |
| simple_password_check_letters_same_case | 1     |
| simple_password_check_minimal_length    | 8     |
| simple_password_check_other_characters  | 1     |
+-----------------------------------------+-------+
4 rows in set (0.002 sec)
MariaDB [mysql]>

사전 배경

일년에 몇번씩 받는 보안점검... 항상 문제가 되는 것이 DB 계정의 비밀번호 복잡도를 강제하고 있는지 여부

가장 낮은 수준의 요건이 비밀번호 최소자리수 8자 이상 영문 대문자 1, 소문자 1, 특수문자 1 이상, 비밀번호 변경 주기 90일 이내 정도는 항상 등장하고

추가로 최근 n회 비밀번호 사용 금지, 사용자 계정명, 전화번호 등 유추하기 쉬운 비밀번호 금지

(참고로 우리가 사용하는 MariaDB 10.4.* 에서는 최근 n회 비밀번호 금지, 사용자 계정명이 포함된 비밀번호 금지 등이 적용 할 수 있는 방법이 없다. 아마도 MariaDB 10.5 이상에서 지원 하는 듯?)

기본 적인 복잡도라도 적용이 필요 한 상황, 이미 비밀번호에 대한 제약조건이 적용되어 있거나, 플러그인이 설치 되어 있으면 다행이지만

DB 설치 후 아무 작업도 하지 않으면 계정 비밀번호에 대한 제약이 없다.(MariaDB 10.4.x 기준)

 

적용

simple_password_check 플러그인을 통해 MariaDB Password 복잡도를 강제 하는 방법

MySQL 5.7 은 기본 포함, 없으면 상위 버전에서 simple_password_check.so 파일을 복사해서 설정 가능함

(참고 : MariaDB 10.x 는 MySQL 5.7에 해당, 이후 버전은 상호 DB간 별도로 소스를 운영하면서 더이상 호환이 되지 않는 부분이 많음)

1. 플러그인 설치 여부 확인

1-1. 플러그인 디렉토리 위치 확인

MariaDB [mysql]> show global variables like 'plugin_dir%';
+---------------+--------------------------+
| Variable_name | Value                    |
+---------------+--------------------------+
| plugin_dir    | /usr/lib64/mysql/plugin/ |
+---------------+--------------------------+
1 row in set (0.002 sec)
MariaDB [mysql]>

1-2. simple_password_check.so 유무 확인

[root@mydbserver user01]# ls -al /usr/lib64/mysql/plugin/
합계 8920
drwxr-xr-x. 3 root  root    4096  4월  2  2021 .
drwxr-xr-x. 3 root  root      20  4월  2  2021 ..
-rwxr-xr-x  1 root  root   72048  2월 19  2021 auth_ed25519.so
-rwxr-xr-x  1 root  root   11136  2월 19  2021 auth_gssapi_client.so
-rwxr-xr-x  1 root  root   11672  2월 19  2021 auth_pam.so
drwx------  2 mysql root      27  4월  2  2021 auth_pam_tool_dir
-rwxr-xr-x  1 root  root   11672  2월 19  2021 auth_pam_v1.so
-rwxr-xr-x  1 root  root   11152  2월 19  2021 caching_sha2_password.so
-rwxr-xr-x  1 root  root   75688  2월 19  2021 client_ed25519.so
-rwxr-xr-x  1 root  root   11120  2월 19  2021 dialog.so
-rwxr-xr-x  1 root  root   11776  2월 19  2021 disks.so
-rwxr-xr-x  1 root  root   20208  2월 19  2021 file_key_management.so
-rwxr-xr-x  1 root  root  107344  2월 19  2021 ha_archive.so
-rwxr-xr-x  1 root  root   74504  2월 19  2021 ha_blackhole.so
-rwxr-xr-x  1 root  root  103352  2월 19  2021 ha_federated.so
-rwxr-xr-x  1 root  root  144376  2월 19  2021 ha_federatedx.so
-rwxr-xr-x  1 root  root 6585928  2월 19  2021 ha_mroonga.so
-rwxr-xr-x  1 root  root  197648  2월 19  2021 ha_sphinx.so
-rwxr-xr-x  1 root  root 1190840  2월 19  2021 ha_spider.so
-rwxr-xr-x  1 root  root  243816  2월 19  2021 handlersocket.so
-rwxr-xr-x  1 root  root   11888  2월 19  2021 locales.so
-rwxr-xr-x  1 root  root   11792  2월 19  2021 metadata_lock_info.so
-rwxr-xr-x  1 root  root    6992  2월 19  2021 mysql_clear_password.so
-rwxr-xr-x  1 root  root   12536  2월 19  2021 query_cache_info.so
-rwxr-xr-x  1 root  root   16240  2월 19  2021 query_response_time.so
-rwxr-xr-x  1 root  root   61544  2월 19  2021 server_audit.so
-rwxr-xr-x  1 root  root   11096  2월 19  2021 sha256_password.so
-rwxr-xr-x  1 root  root   11800  2월 19  2021 simple_password_check.so <--- 이놈
-rwxr-xr-x  1 root  root   11936  2월 19  2021 sql_errlog.so
-rwxr-xr-x  1 root  root   46184  2월 19  2021 wsrep_info.so
[root@mydbserver user01]#

플러그인 파일은 존재 함 ( MariaDB 10.4.x 기준 기본 패키지로 설치 되어 있고 활성화만 안되어 있을 것임)

 

1-3. simple_password_check 플러그인이 활성화 되어 있는지 확인

MariaDB [mysql]> show global variables like 'simple_password%';
Empty set (0.002 sec)

MariaDB [mysql]>
MariaDB [mysql]> show plugins;
+-------------------------------+----------+--------------------+---------+---------+
| Name                          | Status   | Type               | Library | License |
+-------------------------------+----------+--------------------+---------+---------+
| binlog                        | ACTIVE   | STORAGE ENGINE     | NULL    | GPL     |
| mysql_native_password         | ACTIVE   | AUTHENTICATION     | NULL    | GPL     |
| mysql_old_password            | ACTIVE   | AUTHENTICATION     | NULL    | GPL     |
| wsrep                         | ACTIVE   | REPLICATION        | NULL    | GPL     |
| CSV                           | ACTIVE   | STORAGE ENGINE     | NULL    | GPL     |
| MEMORY                        | ACTIVE   | STORAGE ENGINE     | NULL    | GPL     |
| Aria                          | ACTIVE   | STORAGE ENGINE     | NULL    | GPL     |
| MyISAM                        | ACTIVE   | STORAGE ENGINE     | NULL    | GPL     |
| MRG_MyISAM                    | ACTIVE   | STORAGE ENGINE     | NULL    | GPL     |
| CLIENT_STATISTICS             | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INDEX_STATISTICS              | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| TABLE_STATISTICS              | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| USER_STATISTICS               | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| SQL_SEQUENCE                  | ACTIVE   | STORAGE ENGINE     | NULL    | GPL     |
| InnoDB                        | ACTIVE   | STORAGE ENGINE     | NULL    | GPL     |
| INNODB_TRX                    | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_LOCKS                  | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_LOCK_WAITS             | 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_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_SYS_TABLES             | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_SYS_TABLESTATS         | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_SYS_INDEXES            | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_SYS_COLUMNS            | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_SYS_FIELDS             | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_SYS_FOREIGN            | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_SYS_FOREIGN_COLS       | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_SYS_TABLESPACES        | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_SYS_DATAFILES          | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_SYS_VIRTUAL            | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_MUTEXES                | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_SYS_SEMAPHORE_WAITS    | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_TABLESPACES_ENCRYPTION | ACTIVE   | INFORMATION SCHEMA | NULL    | BSD     |
| INNODB_TABLESPACES_SCRUBBING  | ACTIVE   | INFORMATION SCHEMA | NULL    | BSD     |
| PERFORMANCE_SCHEMA            | ACTIVE   | STORAGE ENGINE     | NULL    | GPL     |
| SEQUENCE                      | ACTIVE   | STORAGE ENGINE     | NULL    | GPL     |
| unix_socket                   | ACTIVE   | AUTHENTICATION     | NULL    | GPL     |
| FEEDBACK                      | DISABLED | INFORMATION SCHEMA | NULL    | GPL     |
| user_variables                | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| partition                     | ACTIVE   | STORAGE ENGINE     | NULL    | GPL     |
+-------------------------------+----------+--------------------+---------+---------+
54 rows in set (0.002 sec)

MariaDB [mysql]>

안되어 있음.

 

2. 플러그인 설치

MariaDB [mysql]> install  plugin simple_password_check soname 'simple_password_check.so';
Query OK, 0 rows affected (0.039 sec)
MariaDB [mysql]> show plugins;
+-------------------------------+----------+---------------------+--------------------------+---------+
| Name                          | Status   | Type                | Library                  | License |
+-------------------------------+----------+---------------------+--------------------------+---------+
| binlog                        | ACTIVE   | STORAGE ENGINE      | NULL                     | GPL     |
| mysql_native_password         | ACTIVE   | AUTHENTICATION      | NULL                     | GPL     |
| mysql_old_password            | ACTIVE   | AUTHENTICATION      | NULL                     | GPL     |
| wsrep                         | ACTIVE   | REPLICATION         | NULL                     | GPL     |
| CSV                           | ACTIVE   | STORAGE ENGINE      | NULL                     | GPL     |
| MEMORY                        | ACTIVE   | STORAGE ENGINE      | NULL                     | GPL     |
| Aria                          | ACTIVE   | STORAGE ENGINE      | NULL                     | GPL     |
| MyISAM                        | ACTIVE   | STORAGE ENGINE      | NULL                     | GPL     |
| MRG_MyISAM                    | ACTIVE   | STORAGE ENGINE      | NULL                     | GPL     |
| CLIENT_STATISTICS             | ACTIVE   | INFORMATION SCHEMA  | NULL                     | GPL     |
| INDEX_STATISTICS              | ACTIVE   | INFORMATION SCHEMA  | NULL                     | GPL     |
| TABLE_STATISTICS              | ACTIVE   | INFORMATION SCHEMA  | NULL                     | GPL     |
| USER_STATISTICS               | ACTIVE   | INFORMATION SCHEMA  | NULL                     | GPL     |
| SQL_SEQUENCE                  | ACTIVE   | STORAGE ENGINE      | NULL                     | GPL     |
| InnoDB                        | ACTIVE   | STORAGE ENGINE      | NULL                     | GPL     |
| INNODB_TRX                    | ACTIVE   | INFORMATION SCHEMA  | NULL                     | GPL     |
| INNODB_LOCKS                  | ACTIVE   | INFORMATION SCHEMA  | NULL                     | GPL     |
| INNODB_LOCK_WAITS             | 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_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_SYS_TABLES             | ACTIVE   | INFORMATION SCHEMA  | NULL                     | GPL     |
| INNODB_SYS_TABLESTATS         | ACTIVE   | INFORMATION SCHEMA  | NULL                     | GPL     |
| INNODB_SYS_INDEXES            | ACTIVE   | INFORMATION SCHEMA  | NULL                     | GPL     |
| INNODB_SYS_COLUMNS            | ACTIVE   | INFORMATION SCHEMA  | NULL                     | GPL     |
| INNODB_SYS_FIELDS             | ACTIVE   | INFORMATION SCHEMA  | NULL                     | GPL     |
| INNODB_SYS_FOREIGN            | ACTIVE   | INFORMATION SCHEMA  | NULL                     | GPL     |
| INNODB_SYS_FOREIGN_COLS       | ACTIVE   | INFORMATION SCHEMA  | NULL                     | GPL     |
| INNODB_SYS_TABLESPACES        | ACTIVE   | INFORMATION SCHEMA  | NULL                     | GPL     |
| INNODB_SYS_DATAFILES          | ACTIVE   | INFORMATION SCHEMA  | NULL                     | GPL     |
| INNODB_SYS_VIRTUAL            | ACTIVE   | INFORMATION SCHEMA  | NULL                     | GPL     |
| INNODB_MUTEXES                | ACTIVE   | INFORMATION SCHEMA  | NULL                     | GPL     |
| INNODB_SYS_SEMAPHORE_WAITS    | ACTIVE   | INFORMATION SCHEMA  | NULL                     | GPL     |
| INNODB_TABLESPACES_ENCRYPTION | ACTIVE   | INFORMATION SCHEMA  | NULL                     | BSD     |
| INNODB_TABLESPACES_SCRUBBING  | ACTIVE   | INFORMATION SCHEMA  | NULL                     | BSD     |
| PERFORMANCE_SCHEMA            | ACTIVE   | STORAGE ENGINE      | NULL                     | GPL     |
| SEQUENCE                      | ACTIVE   | STORAGE ENGINE      | NULL                     | GPL     |
| unix_socket                   | ACTIVE   | AUTHENTICATION      | NULL                     | GPL     |
| FEEDBACK                      | DISABLED | INFORMATION SCHEMA  | NULL                     | GPL     |
| user_variables                | ACTIVE   | INFORMATION SCHEMA  | NULL                     | GPL     |
| partition                     | ACTIVE   | STORAGE ENGINE      | NULL                     | GPL     |
| simple_password_check         | ACTIVE   | PASSWORD VALIDATION | simple_password_check.so | GPL     |
+-------------------------------+----------+---------------------+--------------------------+---------+
55 rows in set (0.002 sec)
MariaDB [mysql]>

플러그인 설치 완료

 

3. 복잡도 설정

3-1. 기본 설정 확인

MariaDB [mysql]> show global variables like 'simple_password%';
+-----------------------------------------+-------+
| Variable_name                           | Value |
+-----------------------------------------+-------+
| simple_password_check_digits            | 1     |
| simple_password_check_letters_same_case | 1     |
| simple_password_check_minimal_length    | 8     |
| simple_password_check_other_characters  | 1     |
+-----------------------------------------+-------+
4 rows in set (0.002 sec)
MariaDB [mysql]>

비밀번호 최소 8자, 숫자 1, 서로다른 영문 대소문자 1개 이상, 특수문자, 숫자 1자 이상으로 설정이 되어 있음

(다른 경우 값을 변경 하고, 재시작시 적용을 위해 my.cnf 도 수정이 필요함)

 

4. 비밀번호 유효기간 설정

참고 : https://mariadb.com/kb/en/user-password-expiry/

사용자를 생성 할 때 지정

CREATE USER 'monty'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY;

생성된 사용자에게 지정

ALTER USER 'monty'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY;

사용자별 비밀번호 유효기간 확인

MariaDB [mysql]> show create user 'monty'@'localhost';
+--------------------------------------------------------------------+
| CREATE USER for monty@localhost                                    |
+--------------------------------------------------------------------+
| CREATE USER `monty`@`localhost` IDENTIFIED BY PASSWORD '*암호삭제' |
+--------------------------------------------------------------------+
1 row in set (0.000 sec)

MariaDB [mysql]>

 

전체 사용자 암호 유효기간 확인

WITH password_expiration_info AS (
  SELECT User, Host,
  IF(
   IFNULL(JSON_EXTRACT(Priv, '$.password_lifetime'), -1) = -1,
   @@global.default_password_lifetime,
   JSON_EXTRACT(Priv, '$.password_lifetime')
  ) AS password_lifetime,
  JSON_EXTRACT(Priv, '$.password_last_changed') AS password_last_changed
  FROM mysql.global_priv
)
SELECT pei.User, pei.Host,
  pei.password_lifetime,
  FROM_UNIXTIME(pei.password_last_changed) AS password_last_changed_datetime,
  FROM_UNIXTIME(
   pei.password_last_changed +
   (pei.password_lifetime * 60 * 60 * 24)
  ) AS password_expiration_datetime
  FROM password_expiration_info pei
  WHERE pei.password_lifetime != 0
   AND pei.password_last_changed IS NOT NULL
UNION
SELECT pei.User, pei.Host,
  pei.password_lifetime,
  FROM_UNIXTIME(pei.password_last_changed) AS password_last_changed_datetime,
  0 AS password_expiration_datetime
  FROM password_expiration_info pei
  WHERE pei.password_lifetime = 0
   OR pei.password_last_changed IS NULL;

만일을 위해 시스템, 서비스운영 계정은 제외 하고 개별 사용자 계정에만 비밀번호 만료일자를 지정 하였다.

 

비밀번호 만료시 

'SQL  Error [1820] [HY000]: (conn=xxxxxxxx) You must SET PASSWORD before executing this statement'

오류 발생함

MySQL/MariaDB root 계정으로 접속해서

SET PASSWORD FOR 'User'@'Host' = PASSWORD('Password');

 

 

Good Luck!

+ Recent posts