MariaDB 계정 : mariadb.sys 보안 취약점 관련

보안 점검 항목 중 MariaDB mariadb.sys 계정 비밀번호 미설정 및 취약점 건과 관련한 사항들에 대한 내용입니다.

mariadb.sys 계정은 설치 직후부터 DB 엔진 차원에서 계정 잠금(ACCOUNT LOCK) 조치가 완료된 내부 시스템 전용 계정으로 보안 취약점 예외 처리를 하시면 됩니다.

  • MariaDB 10.4 버전부터 account lock, password expire 기능 지원
  • MariaDB 10.4 이전버전은 비밀번호 없을때 보안 취약점 이슈 있음
  • mariadb.sys@localhost 계정이 MariaDB 10.4 버전부터 생성됨
MariaDB 공식 문서 관련 내용
https://mariadb.com/docs/server/security/user-account-management/roles/system-users-roles-and-privileges#mariadb.sys-localhost

- 생성 시점:
> mariadb-install-db 스크립트로 데이터베이스를 초기화할 때 자동으로 생성

- 용도:
> 서버 내부 작업을 수행하는 데 사용
> 예를 들어 스케줄된 이벤트 실행 같은 MariaDB의 내부 기능을 처리할 때 필요

- 관리:
> 이 계정은 삭제할 수 없으며 보호된 계정
> DROP USER 같은 명령으로 제거할 수 없음
> 서버가 정상적으로 동작하려면 반드시 존재해야 함

보안 취약점 관련해서 아래와 같이 정리할 수 있습니다.

  • 일반적으로 이 계정은 직접 로그인할 일이 없음
  • 서버 내부에서만 사용되므로 별도의 비밀번호 관리나 권한 변경은 필요하지 않음
  • 보안 정책상 이 계정의 존재를 이해하고, 불필요하게 건드리지 않는 것이 중요

MariaDB 초기화 했을때 mariadb.sys 관련 사항은 아래와 같습니다.

MariaDB [(none)]> show create user 'mariadb.sys'@localhost;
+--------------------------------------------------------------------+
| CREATE USER for mariadb.sys@localhost                              |
+--------------------------------------------------------------------+
| CREATE USER `mariadb.sys`@`localhost` ACCOUNT LOCK PASSWORD EXPIRE |
+--------------------------------------------------------------------+
1 row in set (0.001 sec)

MariaDB [(none)]> show grants for 'mariadb.sys'@localhost;
+----------------------------------------------------------------------------+
| Grants for mariadb.sys@localhost                                           |
+----------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `mariadb.sys`@`localhost`                            |
| GRANT SELECT, DELETE ON `mysql`.`global_priv` TO `mariadb.sys`@`localhost` |
+----------------------------------------------------------------------------+
2 rows in set (0.000 sec)

MariaDB [(none)]> select routine_schema, routine_type, count(1) from information_schema.routines where definer='mariadb.sys@localhost' group by routine_schema, routine_type;
+----------------+--------------+----------+
| routine_schema | routine_type | count(1) |
+----------------+--------------+----------+
| mysql          | PROCEDURE    |        2 |
| sys            | FUNCTION     |       22 |
| sys            | PROCEDURE    |       29 |
+----------------+--------------+----------+
3 rows in set (0.012 sec)


MariaDB [(none)]> select routine_schema as DB, routine_name from information_schema.routines where definer='mariadb.sys@localhost' and routine_type='function';
+-----+----------------------------------+
| DB  | routine_name                     |
+-----+----------------------------------+
| sys | extract_schema_from_file_name    |
| sys | extract_table_from_file_name     |
| sys | format_bytes                     |
| sys | format_path                      |
| sys | format_statement                 |
| sys | format_time                      |
| sys | list_add                         |
| sys | list_drop                        |
| sys | ps_is_account_enabled            |
| sys | ps_is_consumer_enabled           |
| sys | ps_is_instrument_default_enabled |
| sys | ps_is_instrument_default_timed   |
| sys | ps_is_thread_instrumented        |
| sys | ps_thread_account                |
| sys | ps_thread_id                     |
| sys | ps_thread_stack                  |
| sys | ps_thread_trx_info               |
| sys | quote_identifier                 |
| sys | sys_get_config                   |
| sys | version_major                    |
| sys | version_minor                    |
| sys | version_patch                    |
+-----+----------------------------------+
22 rows in set (0.001 sec)


MariaDB [(none)]> select routine_schema as DB, routine_name from information_schema.routines where definer='mariadb.sys@localhost' and routine_type='procedure';
+-------+-------------------------------------+
| DB    | routine_name                        |
+-------+-------------------------------------+
| mysql | AddGeometryColumn                   |
| mysql | DropGeometryColumn                  |
| sys   | create_synonym_db                   |
| sys   | diagnostics                         |
| sys   | execute_prepared_stmt               |
| sys   | optimizer_switch_choice             |
| sys   | optimizer_switch_off                |
| sys   | optimizer_switch_on                 |
| sys   | ps_setup_disable_background_threads |
| sys   | ps_setup_disable_consumer           |
| sys   | ps_setup_disable_instrument         |
| sys   | ps_setup_disable_thread             |
| sys   | ps_setup_enable_background_threads  |
| sys   | ps_setup_enable_consumer            |
| sys   | ps_setup_enable_instrument          |
| sys   | ps_setup_enable_thread              |
| sys   | ps_setup_reload_saved               |
| sys   | ps_setup_reset_to_default           |
| sys   | ps_setup_save                       |
| sys   | ps_setup_show_disabled              |
| sys   | ps_setup_show_disabled_consumers    |
| sys   | ps_setup_show_disabled_instruments  |
| sys   | ps_setup_show_enabled               |
| sys   | ps_setup_show_enabled_consumers     |
| sys   | ps_setup_show_enabled_instruments   |
| sys   | ps_statement_avg_latency_histogram  |
| sys   | ps_trace_statement_digest           |
| sys   | ps_trace_thread                     |
| sys   | ps_truncate_all_tables              |
| sys   | statement_performance_analyzer      |
| sys   | table_exists                        |
+-------+-------------------------------------+
31 rows in set (0.003 sec)