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.
$

 

 

끝.

+ Recent posts