root 계정 보안
일반 사용자 계정 생성에 앞서 root 계정에 대한 보안을 체크해 보겠습니다.
MariaDB 10.4 이상에서 DB를 설치 하면 OS의 super user 권한을 가질 때 비밀번호 없이 MariaDB에 접속할 수 있습니다.
$ sudo mysql -uroot
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 37
Server version: 11.4.3-MariaDB-1 Ubuntu 24.10
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Support MariaDB developers by giving a star at https://github.com/MariaDB/server
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]>
MariaDB 10.4 부터는 unix_socket 방식으로 인증 하도록 되어있기 때문에 localhost 상에서 root 접속시 OS의 root 권한이 있는 경우 DB인증이 자동으로 되는 개념인 것 같습니다.
MariaDB [(none)]> show create user root@localhost;
+----------------------------------------------------------------------------------------------------+
| CREATE USER for root@localhost |
+----------------------------------------------------------------------------------------------------+
| CREATE USER `root`@`localhost` IDENTIFIED VIA mysql_native_password USING 'invalid' OR unix_socket |
+----------------------------------------------------------------------------------------------------+
1 row in set (0.001 sec)
MariaDB [(none)]>
OS의 root 권한으로 접속 하더라도 비밀번호를 입력해야 접속하도록 변경하는게 좋습니다.
주의1: unix_socket 으로 연동 되는 경우 반드시 OS의 super user 권한을 획득해야 합니다.
unix_socket 인증 방식을 해제하고 비밀번호 방식으로 변경하게 되면 일반 사용자이더라도 마리아DB의 root@localhost 계정의 비밀번호를 알고 있고 콘솔에 접근이 된 상태면 root 권한으로 DB 접속을 할 수 있습니다. 어느 것이 보안에 더 좋을지는 판단을 하는 것이 좋겠습니다.
주의2 : unix_socket 방식에서 password 방식으로 바꾸는 경우 DB 가동 후 status 를 확인해 보면 root@localhost Access denied 로그가 보입니다. (페이지 맨 하단 더보기를 참고 하세요)
주의3 : root의 계정을 password 방식으로 전환 하는 경우 rogrotate 같은 툴을 이용해 MariaDB 로그를 일단우/용량단위로 쪼개고자 하는 경우 등에 실행 권한 문제에 봉착 할 수 있습니다.
아래 내용은 root를 password 방식으로 전환하는 내용이지만, 참고만 하시기 바라며 진행하실 경우 위의 주의 내용을 숙지 하시고 진행 하시기를 당부 드립니다. 이미 진행하셨다가 unix_socket 방식으로 복원을 하시고자 하시면 본 글의 맨마지막 부분에 더보기 내용을 참고 하시기 바랍니다.
root 계정의 인증 방식을 확인합니다.
MariaDB [(mysql)]> show create user root@localhost;
+----------------------------------------------------------------------------------------------------+
| CREATE USER for root@localhost |
+----------------------------------------------------------------------------------------------------+
| CREATE USER `root`@`localhost` IDENTIFIED VIA mysql_native_password USING 'invalid' OR unix_socket |
+----------------------------------------------------------------------------------------------------+
1 row in set (0.001 sec)
MariaDB [mysql]> select host, user, password, plugin from user where user = 'root';
+-----------+-------------+----------+-----------------------+
| Host | User | Password | plugin |
+-----------+-------------+----------+-----------------------+
| localhost | root | invalid | mysql_native_password |
+-----------+-------------+----------+-----------------------+
1 rows in set (0.005 sec)
unix_socket 방식은 인증을 OS에 위임하는 것 같습니다.
ed25519 비밀번호 방식으로 변경해 보겠습니다.
MariaDB [mysql]> alter user 'root'@'localhost' identified via ed25519 using password('비밀번호삭제');
Query OK, 0 rows affected (0.087 sec)
MariaDB [mysql]> show create user root@localhost;
+-----------------------------------------------------------------------------------------------------------+
| CREATE USER for root@localhost |
+-----------------------------------------------------------------------------------------------------------+
| CREATE USER `root`@`localhost` IDENTIFIED VIA ed25519 USING '비밀번호암호화된문자열' |
+-----------------------------------------------------------------------------------------------------------+
1 row in set (0.001 sec)
MariaDB [mysql]> select user, host, password, plugin from user where user = 'root';
+------+-----------+----------+---------+
| User | Host | Password | plugin |
+------+-----------+----------+---------+
| root | localhost | | ed25519 |
+------+-----------+----------+---------+
1 row in set (0.004 sec)
MariaDB [mysql]>
새로 변경하는 비밀번호는 이전에 설치한 password validation 플러그인 영향을 받으므로 조건을 만족해야 합니다.
조건에 만족하지 않을 경우 에러가 발생합니다.
MariaDB [(none)]> alter user root@localhost identified via ed25519 using password('비밀번호삭제');
ERROR 1396 (HY000): Operation ALTER USER failed for 'root'@'localhost'
이제 새로 root 계정으로 접근하려고 하면 비밀번호 없이는 접속이 되지 않습니다.
변경후 root 계정으로 접근 하려면 반드시 비밀번호를 입력 해야 합니다.
$ sudo mysql -uroot
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
$ sudo mysql -uroot -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 40
Server version: 11.4.3-MariaDB-1 Ubuntu 24.10
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Support MariaDB developers by giving a star at https://github.com/MariaDB/server
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]>
지정한 비밀번호를 입력하여야 비로서 root 권한으로 MariaDB에 접속 할 수 있습니다.
하지만 sudo 권한이 없는 일반 계정으로도 MariaDB root 계정에 접속이 되는 것은 숙지 하셔야 합니다.
unix_socket 방식에서 password 방식으로 변경 한 후 DB 상태를 보면 root@localhost Access denied 에러가 발생 한 것이 보입니다.
$ sudo systemctl status mariadb
● mariadb.service - MariaDB 11.4.3 database server
Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; preset: enabled)
Active: active (running) since Sun 2025-03-02 00:13:59 KST; 26min ago
Invocation: 1630202d79594cb098a59635d502b5df
Docs: man:mariadbd(8)
https://mariadb.com/kb/en/library/systemd/
Process: 2471 ExecStartPre=/usr/bin/install -m 755 -o mysql -g root -d /var/run/mysqld (code=exited, status=0/SUCCESS)
Process: 2473 ExecStartPre=/bin/sh -c systemctl unset-environment _WSREP_START_POSITION (code=exited, status=0/SUCCESS)
Process: 2476 ExecStartPre=/bin/sh -c [ ! -e /usr/bin/galera_recovery ] && VAR= || VAR=`/usr/bin/galera_recovery`; [ $? -eq 0 ] && systemctl set-environment _WSREP_START_POSITION=$VAR || exit 1 (code=exited, status=0/SUCCESS)
Process: 2595 ExecStartPost=/bin/sh -c systemctl unset-environment _WSREP_START_POSITION (code=exited, status=0/SUCCESS)
Process: 2598 ExecStartPost=/etc/mysql/debian-start (code=exited, status=0/SUCCESS)
Main PID: 2581 (mariadbd)
Status: "Taking your SQL requests now..."
Tasks: 15 (limit: 25421)
Memory: 86.3M (peak: 88.4M)
CPU: 11.890s
CGroup: /system.slice/mariadb.service
└─2581 /usr/sbin/mariadbd
Mar 02 00:13:48 raspberrypi systemd[1]: Starting mariadb.service - MariaDB 11.4.3 database server...
Mar 02 00:13:49 raspberrypi (mariadbd)[2581]: mariadb.service: Referenced but unset environment variable evaluates to an empty string: MYSQLD_OPTS, _WSREP_NEW_CLUSTER
Mar 02 00:13:59 raspberrypi systemd[1]: Started mariadb.service - MariaDB 11.4.3 database server.
Mar 02 00:14:00 raspberrypi debian-start[2612]: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
$
DB 사용에는 큰 문제가 없어 보이지만, 애초 정책이 unix_socket 방식을 기본으로 해놓은 이유가 있을 것 이고, 앞서도 언급 했지만 어떤 방식을 선택 해도 비밀번화 계정 관리를 잘 해준다면 큰 문제는 없을 것 같습니다.
가능하면 순정을 유지하는 것으로 정정하였습니다.
root 계정 password 인증 방식에서 unix_socket 방식으로 원복 하는 방법
(참고글 : https://susoterran.github.io/mysql/mariadb10.4-authentication/)
MariaDB [(none)]> alter user root@localhost identified via unix_socket;
Query OK, 0 rows affected (0.005 sec)
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.006 sec)
MariaDB [(none)]> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
MariaDB [mysql]> select host, user, plugin, password from user where user='root';
+-----------+------+-------------+----------+
| Host | User | plugin | Password |
+-----------+------+-------------+----------+
| localhost | root | unix_socket | |
+-----------+------+-------------+----------+
1 row in set (0.005 sec)
MariaDB [mysql]>
unix_socket 원복후 Super User 권한으로 비밀번호 인증 없이 로그인 되고
일반 User 권한으로는 인증이 되지 않습니다.
MariaDB status 에도 에러가 사라졌습니다.
$ sudo systemctl status mariadb
● mariadb.service - MariaDB 11.4.3 database server
Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; preset: enabled)
Active: active (running) since Sun 2025-03-02 00:41:46 KST; 8s ago
Invocation: 745ac28ee0d149e4b8685bd85de92a44
Docs: man:mariadbd(8)
https://mariadb.com/kb/en/library/systemd/
Process: 2776 ExecStartPre=/usr/bin/install -m 755 -o mysql -g root -d /var/run/mysqld (code=exited, status=0/SUCCESS)
Process: 2778 ExecStartPre=/bin/sh -c systemctl unset-environment _WSREP_START_POSITION (code=exited, status=0/SUCCESS)
Process: 2781 ExecStartPre=/bin/sh -c [ ! -e /usr/bin/galera_recovery ] && VAR= || VAR=`/usr/bin/galera_recovery`; [ $? -eq 0 ] && systemctl set-environment _WSREP_START_POSITION=$VAR || exit 1 (code=exited, status=0/SUCCESS)
Process: 2898 ExecStartPost=/bin/sh -c systemctl unset-environment _WSREP_START_POSITION (code=exited, status=0/SUCCESS)
Process: 2901 ExecStartPost=/etc/mysql/debian-start (code=exited, status=0/SUCCESS)
Main PID: 2886 (mariadbd)
Status: "Taking your SQL requests now..."
Tasks: 12 (limit: 25421)
Memory: 88M (peak: 92.4M)
CPU: 17.954s
CGroup: /system.slice/mariadb.service
└─2886 /usr/sbin/mariadbd
Mar 02 00:41:32 raspberrypi systemd[1]: Starting mariadb.service - MariaDB 11.4.3 database server...
Mar 02 00:41:33 raspberrypi (mariadbd)[2886]: mariadb.service: Referenced but unset environment variable evaluates to an empty string: MYSQLD_OPTS, _WSREP_NEW_CLUSTER
Mar 02 00:41:46 raspberrypi systemd[1]: Started mariadb.service - MariaDB 11.4.3 database server.
$
끝.
'DataBase' 카테고리의 다른 글
[MariaDB] 보안 취약점 점검 #7 감사 정책 준비 (0) | 2025.03.01 |
---|---|
[MariaDB] 보안 취약점 점검 #6 사용자 계정 생성 (0) | 2025.02.26 |
[MariaDB] 보안 취약점 점검 #4 비밀번호 정책 적용 (0) | 2025.02.25 |
[MariaDB] 보안 취약점 점검 #3 보안 시나리오 (0) | 2025.02.25 |
[MariaDB] 보안 취약점 점검 #2 보안 관련 플러그인 설치 (0) | 2025.02.25 |