개요

MariaDB 10.4에서 부터 변경된 인증 방식에 대해 알아본다.

테스트 환경

  • CentOS 7.9.2009
  • cmake-3.9.6
  • mariadb-10.4.17
  • mariadb-10.5.8

인증 테스트

변경된 인증 방식 확인

  • 10.4.17 환경에서 테스트한 내용을 바탕으로 작성하였으며, 10.5.8 환경에서도 아래와 같은 결과를 얻을 수 있다.


리눅스 root 계정 접속한 상태에서 MariaDB 접속 시 계정 정보 입력 없이 root 계정으로 접속이 된다.



계정 정보를 보면 password 칼럼에 invaild 라는 값이 들어가 있다.

이는 기존의 암호 기반 방식에서 unix_socket 방식으로 인증 방식이 변했기 때문에 localhost 상에서 root 접속 시 password 값이 유효하지 않다라는 의미이다. invaild는 password 칼럼에서 사용하는 hash값은 아니다.

jslim이라는 일반 계정에서 MariaDB를 실행하면 jslim 계정 권한으로 접속이 된다. 해당 계정은 mysql.user 테이블에 대한 권한이 없으므로 아래와 같은 권한 오류가 발생한다.



일반 사용자 계정인 jslim에서 sudo 명령어를 이용해 MariaDB에 접속한다면 DB 상에서도 root 권한으로 로그인된다.



혹시 127.0.0.1로 기존 방식대로 접속할 수 있을까?

127.0.0.1 에서의 접속에 대한 root 계정과 패스워드를 생성하고 권한을 부여한다.



계정 정보를 입력하여 접속을 시도해보지만 실패한다.



아래와 같이 mysql.user 테이블에서 plugin 칼럼을 확인하면 해당 계정에 대한 인증 방식이 어떤 걸로 적용되어 있는지 알 수 있다.

mysql_native_password 는 암호 기반 인증 방식을 의미하며, Password에 invalid로 설정되어 있으면 plugin에 mysql_native_password로 설정되어 있어도 unix_socket 방식으로 로그인하게 된다.


원격 접속은 어떤 인증 방식을 사용할까?

이번엔 원격지 (192.168.10.1) 에서 root 접속을 하기 위한 계정 정보를 입력한다.



원격지에서 클라이언트 프로그램을 이용하여 접속해본다.



show processlist 명령어로 확인 시 192.168.10.1에서 원격접속이 된 것을 볼 수 있다.

root@localhost 에 대해 이전 인증 방법으로 되돌리기

root 계정을 alter 명령어를 통해 아래와 같이 정보를 변경한다.

> ALTER USER root@localhost IDENTIFIED VIA mysql_native_password USING PASSWORD("asdf1234");	
> flush privileges;



재접속 시 unix_socket 방식으로 접속되지 않고, 암호 기반 방식으로 로그인 된다.


root@localhost 에 대해 unix_socket 인증 방법으로 설정하기

root@localhost에 대해 다시 unix_socktet 인증 방식을 사용하게 설정하고자 한다면 다음과 같이 진행한다.

> ALTER USER root@localhost IDENTIFIED VIA unix_socket;
> flush privileges;


Password 칼럼에 invalid는 사라졌지만 plugin에 unix_socket으로 설정되어 있어 패스워드 없이 root 접속이 가능하다.

결론

  • 기존의 암호 인증 방식에서는 MariaDB (또는 MySQL)의 root 패스워드를 알고 있다면 리눅스 일반 계정에서도 접속이 가능했다.
  • MariaDB 10.4 에서는 리눅스 root 권한이 있어야만 MariaDB의 root 접속이 가능하다.
  • 원격 접속의 경우 unix_socket 방식이 아닌 기존의 암호 인증 방식이 적용된다.
  • unix_socket 방식은 기존 인증 방식에 비해 MariaDB root 계정으로의 접속에 대해 엄격하게 통제할 수 있다.
    • 실무에서 원격으로 root 계정으로 접근이 되도록 설정하는 경우를 종종 보는데 이는 굉장히 위험한 행동이다. 자세한 사항은 다음의 글을 참고하길 바란다 ([MySQL/MariaDB] MySQL/MariaDB SSL 적용하기)
    • 원래대로라면 각 DB에 대한 권한을 계정별로 나누고, root 계정에 대해서는 통제를 하는 것이 맞다.
    • 리눅스의 root 권한이 있어야 MariaDB root 계정을 접속할 수 있다는 점은 보안성이 올라간 것처럼 보이나, 애초에 리눅스 root 권한이 있다는 것은 MariaDB root 계정을 무력화 시킬 수도 있음을 의미한다. 때문에 보통의 해킹 공격은 DBMS의 root 계정이 아닌 OS의 root 계정을 노리는 경우가 많다.

참고 자료

  • MariaDB 공식 문서
    • https://mariadb.com/kb/en/authentication-from-mariadb-104/
  • [B급 프로그래머] MariaDB에서 root 암호 인증 방식이 먹히지 않는 이유(feat. unix_socket)
    • https://jhrogue.blogspot.com/2020/02/b-mariadb-root-feat-unixsocket.html
  • MariaDB; 인증(Authentication) 문제.
    • https://www.nemonein.xyz/2019/07/2254/