Nextcloud 설치를 위한 데비안/우분투용 mariadb에서 mysql root 권한(Authentication) 이해.

부제 : Nextcloud 설치 시 발생할 수 있는 문제.

이런 복잡한 상황까지 내가 신경쓰게 될 줄은 몰랐다.
그래도, 알아낸 이상 정리는 해둬야겠지.

nextcloud 설치 중, 약간은 미묘한 문제에 부딪혔다.
dB 권한 문제인데, 문제가 된 부분은 바로 여기다.

$ cd /var/www/nextcloud/
$ sudo -u www-data php occ maintenance:install --database \
"mysql" --database-name "nextcloud" --database-user "root" --database-pass \
"password" --admin-user "admin" --admin-pass "password"

위 명령은, 사용자 ‘www-data‘ 가 php 스크립트인 occ 를 사용하여 dB 를 생성하는 작업을 담고 있다. occ 는 mysql root 로 Nextcloud 가 사용할 dB/테이블을 생성하고, 그 dB 를 관리할 관리자(admin-user)도 생성한다.
이게, “occ maintenance:install” 이 수행하는 전부다.

그런데, 여기서 문제가 몇가지 등장한다.

  • 일단 저 명령에 mysql root 의 비번을 ‘평문’으로 넣어야 한다.
  • Debian/Ubuntu 에선, mysql root 를 일반 사용자가 접근할 수가 없다. 이를 위해선 몇가지 조작을 해줘야 한다.
  • 조작을 해주게 되면, (대수로운 오류는 아니라고 생각이 되지만) systemd 관련 오류가 발생할 수도 있다. (데비안/우분투 기본저장소 판 Mariadb 10.1 을 사용할 경우)

한 오류는 또 다른 오류를 불러온다. 왼손으로 구멍을 막았더니 이번엔 다른 구멍이 터져서 오른손을, 그 다음엔…?


평문 비밀번호는 별 문제 아닐 수도 있다. history 에 남는 등의 문제가 있겠지만, 정말 고도의 보안을 요구하는 곳이 아닌 이상, 저 정도는 그냥 넘어갈 수 있다고 생각한다.
애초에 mysql root 의 비밀번호를 일개 사용자(?)에게 요구하는 자체가 잘못된 접근이라는 생각은 들지만, 그렇게 하지 않고선 Nextcloud 사용을 할 수가 없으니..

Nextcloud 설치에서 중요한 사항은 내게 시스템 root 권한이 있는지, 또는 mysql root 로 접근이 가능한지 아닌지가 아니다. ‘Nextcloud 사용을 위한 DB 가 있느냐 없느냐?.’ 이게 주요 안건이다.
따라서 시스템 관리자가 아니더라도, nextcloud 설치는 할 수 있다.

어쨌든 위 얘기는 그냥 지나가는 얘기고, 보다 짜증나는 상황은 두번째부터 등장한다.

Nextcloud 의 문서는 ‘데비안 계열’을 대상으로 쓰여진게 아니기 때문에, 그냥 저렇게만 기술을 해놨다.
문제는 데비안/우분투에선 저 명령이 먹히지 않는다는데 있다.

$ sudo -u www-data php occ maintenance:install --database "mysql" --database-name "nextcloud" --database-user "root" --database-pass "" --admin-user "iamadmin" --admin-pass "xyza"
Error while trying to create admin user: Failed to connect to the database: An exception occured in driver: SQLSTATE[HY000] [1698] Access denied for user 'root'@'localhost'

데비안의 mysql/mariadb 는, mysql root 의 Password 를 따로 설정해놓지 않았다. 그냥 Enter 를 누르면 접근이 된다.
그러나, 누구에게나 이런 권리가 주어지지는 않는다. 오직 시스템 관리자(즉, sudo 가능자)로만 접근이 된다.

다음 두 명령의 결과를 보면, 첫번째는 로그인 불가, 두번째는 성공이 됨을 알 수 있다.

$ mysql -u root -p
Enter password: <뭐라 넣어도 안된다.>
ERROR 1698 (28000): Access denied for user 'root'@'localhost'

$ sudo mysql -u root
[sudo] password for user_a: <sudo password(사용자 PW) 를 넣는다.>
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 172
Server version: 10.1.40-MariaDB-0ubuntu0.18.04.1 Ubuntu 18.04

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> 

다시 말해서, 시스템 root(Server Administrator) 와, mysql root(DBA) 를 동일인으로 가정하고 있는 듯 하다. 이에 관해, 데비안 버그 리포트에서 다음과 같은 내용을 찾았다.

“Currently the MariaDB version in Debian unstable uses passwordless root login (via unix_socket) in all situations. We have planned to change it so, that passwordless root login is used only in fresh installs, and that upgrades from old installs should continue to keep using any root password that was, and not clean it away. This is not yet implemented though.”

https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=800009

사실, root 와 DBA 가 동일인은 아니다. 그저, mysql 의 root 와 시스템의 root 가 동일할 뿐. 그야말로 시스템 root 는 무소불위이기 때문에, 맘만 먹으면 뭔 짓이든 할 수가 있다. 따라서, MariaDB 쪽에서도 sudo mysql 을 사용하게끔 하는 모양이다.
(DBA, 즉 mysql 에서 전권을 행사할 수 있는 관리자는 쉽게 만들 수 있다. 이 사용자의 생성은 물론 시스템 root 가 해야하지만, 추후 비밀번호를 시스템 root 가 알지 못하게 바꿀 수는 있다. 그렇다고 시스템 root 로부터 독립된 개체가 되지는 않지만.)

이런 상황으로 인해, www-data 로는 mysql 에 root 로 접근할 수가 없고, 따라서 nextcloud 용 DB 를 만들 수가 없다.

이 상황을 해결하기 위해, (사실 이 글엔 불필요하지만) 간단히 해법을 적어보기로 한다.
두가지를 생각해 볼 수 있는데, 하나는 chown 을 나중에 하는 법. 또 하나는 수동으로 DB를 만드는 법.
어떤 방법이 더 좋을 지에 대해선 전혀 아는 바가 없다.

첫번째: chown 을 나중에 하는 방법 :
sudo, 즉 www-data 가 아닌, ‘root’ 권한으로 먼저 php occ 명령을 실행한 뒤, /var/www/nextcloud 의 소유권을 www-data 로 전환한다. (소유권 전환이 되지 않으면, 웹브라우저로 Nextcloud 로 접근했을 때 오류가 발생한다.)

$ sudo php occ maintenance:install --database "mysql" --database-name "nextcloud"  --database-user "root" --database-pass "" --admin-user "iamadmin" --admin-pass "xyza"

# 작업 완료 후, chown 을 수행한다.
$ sudo chown -R www-data: /var/www/nextcloud

–database-pass 는 “” 로 비워놓아야 한다. 그게 데비안의 방침(?)이다.

두번째: chown 을 먼저하려면?
Nextcloud 가 사용할 DB 를 미리 만들어놔야 한다.
nextcloud 포럼을 참고했는데, 어떤 문제가 있을 지는 모르겠다.

$ sudo mysql -u root

MariaDB [(none)]> CREATE USER 'iamadmin'@'localhost' IDENTIFIED BY 'xyza';
MariaDB [(none)]> CREATE DATABASE IF NOT EXISTS nextcloud;
MariaDB [(none)]> GRANT ALL PRIVILEGES ON nextcloud.* TO 'iamadmin'@'localhost' IDENTIFIED BY 'xyza';

그리고 나서 chown 후, sudo -u www-data php …. 로 실행하면 된다.

문제가 있을 가능성은 있다. occ 로 Nextcloud DB 를 생성하면, 다음처럼 두 개의 user id 가 생성된다. (위 명령은 localhost 용 id 만 생성했다.)

MariaDB [(none)]> select Host, User, Password from mysql.user;
+-----------+-------------+-------------------------------------------+
| Host      | User        | Password                                  |
+-----------+-------------+-------------------------------------------+
| localhost | oc_iamadmin | *0506F58B9C9EAEBC5A5D96FEC8452FBC18A8C5B4 |
| %         | oc_iamadmin | *0506F58B9C9EAEBC5A5D96FEC8452FBC18A8C5B4 |
+-----------+-------------+-------------------------------------------+

그러나, 수동으로 만들 때는 % 에 대해서는 생각하지 않았기에, 어떤 문제가 있을 수도 있다. (그를 위해서는, create user ‘iamadmin’@’%’ … 를 해야 한다.)
% 는 외부접근을 의미하는데, 실제 사용에서는 아마도 이 관리자까지 만들어줘야 하지 않을까하는 생각이 든다.

마지막 방법:
DBA 생성 후(?) 에 occ 를 하는 방법도 있다.

StackExchange 에 나온 방법대로, 먼저 DBA 를 생성한다.

$ sudo mysql
CREATE USER 'dbadmin'@'localhost' IDENTIFIED BY 'some_pass';
GRANT ALL PRIVILEGES ON *.* TO 'dbadmin'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;

원문은 phpmyadmin 을 위한 계정을 만들었으나, ID 는 맘대로 하면 된다.
그리고, 저렇게 만든 ID/PW 를 활용하여 occ 를 실행한다.

$ sudo -u www-data php occ maintenance:install --database \
"mysql" --database-name "nextcloud"  --database-user "dbadmin" --database-pass \
"some_pass" --admin-user "admin" --admin-pass "password"

이렇게 세가지로 설치 방법을 생각해볼 수 있겠다.


다시 돌아와서,

시스템 root 와 mysql root 를 동일 시 하는 데비안의 정책(?) 때문에 위와 같은 다소 복잡한 문제가 불거졌다.
이 부분에 대해서 조금 뒤져보다가, 이런 글을 찾을 수 있었다.

“The new MariaDB 10.0 do no longer require users to set a root password. This is a security feature. You don’t need root passwords (or debian-maint-user passwords) simply to run and maintain your database anymore. If you have root on the system you will get in as root to the database (or using sudo).
For use cases where you need to access the database as some user from somewhere, just create a user and grant it the required permissions, and then use that user in your apps and other places. There is no need to have a general MySQL/MariaDB root user.”

by Otto Kekäläinen

LaunchPad 에 쓰여진 대로만 보면, Otto 님은 MariaDB 재단에 적을 둔 사람이다. 전문가의 견해니, 헛소리는 아닐 터.
그렇다면 이걸 따르는 게 맞다고 생각한다. 따라서 Nextcloud 를 설치하면서, 당당하게 mysql root 를 요구하는 행위는 결코 정당화 될 수 없다. (뭔 범죄라도 저질렀냐..) 방 하나를 얻으면서, 다른 모든 방 열쇠를 달라고하는 셈이니, 잘하는 짓(?)은 결코 아니다.
그저 사용자 설치 편의를 위한 방법일텐데, 그걸 파다가 여기까지 와버렸군.


다소 이상한 방향으로 전개가 된 이 글은, 여기까지가 끝이다. 원래 쓰려고 했던 목적이 뭐였는지, 글을 쓰다가 새로운 사실들을 자꾸 알게 되는 바람에, 다소 애매하게 글이 진행되었다.
아래 내용은 그냥 덤. 무시해도 된다.

중요한 사항은 이거다.

  • 시스템 root 와 mysql root 는 ‘같다’고 보는 게 맞다. (굳이 분리할 필요가 없다.)
  • DBA 가 필요하다면, mysql root 가 아닌, 새로운 DBA 를 새로 생성하라.

원래 여기 있던 내용은 분리하여 새 글을 작성했다.

MariaDB; 인증(Authentication) 문제.

5 Comments
  1. Avatar
    • 아무도안

안녕하세요. 글 남겨주셔서 고맙습니다.