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!
'DataBase' 카테고리의 다른 글
[MySQL/MariaDB] 보안점검 - 개인정보 암호화 저장 (1) | 2024.09.26 |
---|---|
[MariaDB] 보안점검 - 비밀번호 취약점(SHA1) 개선 (1) | 2024.09.26 |
[MariaDB] 그룹(ROLE) 기반 권한 부여 (1) | 2024.08.09 |
[MariaDB] 가상 컬럼을 이용한 인덱스 생성 (0) | 2024.07.19 |
CentOS7 mariabackup 을 이용한 복원 (MariaDB 10.4.18) (0) | 2022.12.02 |