갈루아의 반서재

우분투 18.04 Nginx 기반으로 작동하는 phpMyAdmin 을 구성해보자. phpMyAdmin 은 오픈 소소 소프트웨어로 GUI 를 통한 MySQL 데이터베이스를 관리하는데 도움을 준다. 


Install phpMyAdmin


패키지 업데이트와 phpMyAdmin 설치를 동시에 진행하자. 아래를 보면 2개의 명령문이 && 로 결합되었음을 알 수 있다. 앞 부분은 최신 버전으로 패키지를 업데이트하는 부분이고, 뒷 부분은 phpMyAdmin 을 설치하는 부분이다. y 와 엔터를 눌러서 계속 진행한다. 

1
~$ sudo apt update && sudo apt install phpmyadmin
cs


물론 아래 화면은 사용자 환경에 따라 상이할 수 있다. Yes 를 선택하고 엔터를 눌러서 데이터베이스를 설치하고 구성한다. 

MySQL 어플리케이션 암호는 phpMyAdmin 가 내부적으로 MySQL 과 통신하기 위해 사용하는 것으로, 비워두고 엔터를 치면 자동으로 생성된다.

해당 암호가 현재 보안 수준에 미달하는 경우에는 아래와 같은 창이 뜨기도 한다. 

다음으로 웹서버를 고르는 화면이 뜬다. 보는바와 같이 Nginx 를 위한 옵션은 없음을 알 수 있다. TAB 을 누르고 엔터를 눌러 웹서버를 선택하지 않고 넘어간다. 

phpMyAdmin 설치가 끝났다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
~$ sudo apt install phpmyadmin
Reading package lists... Done
Building dependency tree
Reading state information... Done
Suggested packages:
  www-browser
The following NEW packages will be installed:
  phpmyadmin
0 upgraded, 1 newly installed, 0 to remove and 61 not upgraded.
Need to get 0 B/3861 kB of archives.
After this operation, 25.0 MB of additional disk space will be used.
Preconfiguring packages ...
Determining localhost credentials from /etc/mysql/debian.cnf: succeeded.
Selecting previously unselected package phpmyadmin.
(Reading database ... 113184 files and directories currently installed.)
Preparing to unpack .../phpmyadmin_4%3a4.6.6-5_all.deb ...
Unpacking phpmyadmin (4:4.6.6-5) ...
Setting up phpmyadmin (4:4.6.6-5) ...
Determining localhost credentials from /etc/mysql/debian.cnf: succeeded.
dbconfig-common: writing config to /etc/dbconfig-common/phpmyadmin.conf
 
Creating config file /etc/dbconfig-common/phpmyadmin.conf with new version
 
Creating config file /etc/phpmyadmin/config-db.php with new version
checking privileges on database phpmyadmin for phpmyadmin@localhost: user creation needed.
granting access to database phpmyadmin for phpmyadmin@localhost: success.
verifying access for phpmyadmin@localhost: success.
creating database phpmyadmin: success.
verifying database phpmyadmin exists: success.
populating database via sql...  done.
dbconfig-common: flushing administrative password
Processing triggers for man-db (2.8.3-2) ...
Processing triggers for hicolor-icon-theme (0.17-2) ...
cs



2. Create Symbolic Link


Ngnix 가 phpMyAdmin 을 제대로 서비스하기 위해서는, phpMyAdmin 디렉토리 /usr/share/phpmyadmin 으로부터 Nginx 도큐먼트 루트 디렉토리로 심볼릭 링크를 생성해야 한다. 

우분투 18.04 에서 Nginx 도큐먼트 루트 디렉토리의 기본 위치는 /var/www/html 이지만 설치 환경에 따라 상이할 수는 있다. 

루트 디렉토리를 확인했으면 심볼릭 링크를 다음과 같이 걸어보자.  루트 디렉토리가 /var/www/html 라고 가정하면 다음과 같이 하면 된다. 

1
~$ sudo ln -/usr/share/phpmyadmin /var/www/html/phpmyadmin
cs

 

3. Test phpMyAdmin


다음과 같은 형식으로 이제 phpMyAdmin 웹 인터페이스에 접근할 수 있을 것이다. 

http://yourdomain/phpmyadmin/ 

http://111.222.33.44/phpmyadmin/ 

로그인을 해보자. 만약 다음과 같이 에러 메시지가 나오면 물론 암호가 틀려도 아래와 같은 메시지가 나옴에 주의하자. 

 mysqli_real_connect(): (HY000/1045): Access denied for user 'root'@'localhost' (using password: YES)

암호가 틀린 경우가 아니라면 phpMyAdmin 을 위한 슈퍼유저 계정을 생성해야 한다. 다음 링크를 참고해서 진행하자. 


5. Obscure phpMyAdmin URL


봇을 비롯해 해커들은 지속적으로 phpMyAdmin 로그인 페이지를 가지고 있는 웹서버를 스캔하고 있다. 따라서 URL을 변경할 필요가 있다. 그럼 여기서 example.com/phpmyadmin 을 example.com/pma_hidden 으로 변경해보자. 

앞서 2단계에서 우리는 도큐먼트 루트 /var/www/html/phpmyadmin 에 대한 심볼릭 링크를 생성했다. 지금 필요한 것은 위의 심볼릭 링크의 이름을 변경해주는 것이다. 앞서 언급한 pma_hidden 으로 말이다. 다음과 같다. 

1
2
~$ sudo mv /var/www/html/phpmyadmin /var/www/html/pma_hidden
 
cs


이제 http://yourdomain/pma_hidden/ 으로 phpMyAdmin 에 접근할 수 있다.


6. Secure phpMyAdmin


보안을 강화하기 위해 Nginx 에 인증 절차를 도입하자. 먼저 강력한 패스워드를 생성한 뒤 보관하자. 다음 링크를 이용하면 좋다. 

PassGen.co - generate a strong password

다음으로 Nginx 와 Apache 에 모두 작동하는 .htpasswd 파일을 생성해주는 apache2-utils 를 설치한다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
~$ sudo apt install apache2-utils
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
  libapr1 libaprutil1
The following NEW packages will be installed:
  apache2-utils libapr1 libaprutil1
0 upgraded, 3 newly installed, 0 to remove and 61 not upgraded.
Need to get 259 kB of archives.
After this operation, 863 kB of additional disk space will be used.
Do you want to continue? [Y/n] y
Get:1 http://asia-east1.gce.archive.ubuntu.com/ubuntu bionic/main amd64 libapr1 amd64 1.6.3-2 [90.9 kB]
Get:2 http://asia-east1.gce.archive.ubuntu.com/ubuntu bionic/main amd64 libaprutil1 amd64 1.6.1-2 [84.4 kB]
Get:3 http://asia-east1.gce.archive.ubuntu.com/ubuntu bionic-updates/main amd64 apache2-utils amd64 2.4.29-1ubuntu4.4 [83.5 kB]
Fetched 259 kB in 0s (10.0 MB/s)
Selecting previously unselected package libapr1:amd64.
(Reading database ... 114869 files and directories currently installed.)
Preparing to unpack .../libapr1_1.6.3-2_amd64.deb ...
Unpacking libapr1:amd64 (1.6.3-2) ...
Selecting previously unselected package libaprutil1:amd64.
Preparing to unpack .../libaprutil1_1.6.1-2_amd64.deb ...
Unpacking libaprutil1:amd64 (1.6.1-2) ...
Selecting previously unselected package apache2-utils.
Preparing to unpack .../apache2-utils_2.4.29-1ubuntu4.4_amd64.deb ...
Unpacking apache2-utils (2.4.29-1ubuntu4.4) ...
Setting up libapr1:amd64 (1.6.3-2) ...
Processing triggers for libc-bin (2.27-3ubuntu1) ...
Setting up libaprutil1:amd64 (1.6.1-2) ...
Processing triggers for man-db (2.8.3-2) ...
Setting up apache2-utils (2.4.29-1ubuntu4.4) ...
Processing triggers for libc-bin (2.27-3ubuntu1) ...
cs


설치가 완료되면 .htpasswd 파일을 생성할 수 있다. 아래 username 은 원하는 것으로 변경해도 좋다. 

1
2
3
4
5
6
 
~$ sudo htpasswd -/etc/nginx/.htpasswd username
New password:
Re-type new password:
Adding password for user username
 
cs


이제 사용자 이름과 암호가 포함된 .htpasswd 파일이 생성되었을 것이다. 확인해보자. 

1
2
3
4
 
~$ cat /etc/nginx/.htpasswd
username:$adhkdijsidjd878dhkdjkdhksddgYn.
 
cs


이제 Nginx 에 2개의 지시문을 넣도록 하자. 환경설정 파일의 위치는 환경에 따라 상이할 수 있다. 일반적으로는 /etc/nginx/sites-available/default 에 위치해 있다. 만약 다수의 도메인 환경으로 구성했다면, 설정 파일은 /etc/nginx/sites-available/example.com 에 있을 수도 있다. 여기서는 /etc/nginx/sites-available/example.com 에 해당 파일이 있다고 가정하자. 파일을 열어 편집하자. 

1
~$ sudo nano /etc/nginx/sites-available/example.com
cs


location 블록으로 이동하여 새로운 블록에 아래 내용을 붙여넣자. 위에서 수정한 경로이름인 pma_hidden 으로 말이다. 

1
2
3
4
5
6
 
       location /pma_hidden {
               auth_basic "Restricted Access";
               auth_basic_user_file /etc/nginx/.htpasswd;
        }
 
cs


파일을 저장하고 나온다 (CTRL + X  입력하고 Y 누른 뒤 엔터).

Nginx 환경설정 파일이 문제없는지 검증한다.

1
2
3
4
5
 
~$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
 
cs


문제가 없으면 Nginx 서비스를 재시작한다. 

1
2
3
 
~$ sudo service nginx reload
 
cs


이제 http://yourdomain/pma_hidden/  페이지를 로딩하면, 다음 인증창을 만날 수 있다.



[원문출처] https://devanswers.co/installing-phpmyadmin-nginx-ubuntu-18-04/