서버 운영/APM 서버 구축

우분투 20.04에서 phpMyAdmin 설치 02 - Apache 서버 관리자를 위한수동 설치(버전 5.1.0 기준)

씨실과 날실 2021. 3. 15. 09:00

 

LAMP 구축 방법에 대해 어러 차례 연재를 해았습니다.

그리고 웹상에서 MYSQL 또는 MariaDB의 데이터베이스를 관리할 수 있도록 해주는 phpMyAdmin을 저장소를 통해 쉽게 설치하는 방법도 연재했었습니다.

그러나 위 링크의 글처럼 저장소를 통해 설치하면 최신 버전의 패키지를 이용할 수 없습니다.

 

일반적으로 저장소에 올라가 있는 버전의 패키지들은 그 범용성이나 보안성, 사용성 등의 테스트를 어느 정도 마치고 그 안전성을 어느 정도 확인한 다음 올리는 것이 보통이고,  저장소에 올라가 있는 패키지에 문제가 있는 경우 저장소를 관리하는 팀에서 해당 패키지의 문제점이 해결된 버전의 패키지로 교체하곤 합니다.

 

그러나 패키지에 문제점이 발견되더라도 아주 치명적인 문제가 아니라면 그다지 신경쓰지 않아 패키지가 그대로 유지되는 경우가 있습니다.

실제로 위 링크의 글을 보듯 우분투 18.04의 저장소에 올라왔던 phpMyAdmin 버전 4.6.6deb5 패키지의 경우 PHP 7.2와 호환성 문제가 발생하였음에도 불구하고 오랬동안 저장소에 버전업된 패키지가 올라오지 않아 위 링크의 글에서 안내한 것처럼 사용자가 코드를 직접 수정하거나 패키지 공식 배포처에서 운본 소스를 다운받아 수동으로 설치해주어야 했습니다.  

 

이런 경우가 왕왕 있으므로 저장소를 통한 간편한 설치 방법외에 패키지를 수동으로 설치하는 방법을 알아둘 필요가 있습니다.

패키지를 설치하는 방법에는 다음과 같은 방법들이 있습니다.

패키지 설치 방법들

기본 저장소를 통한 패키지 설치

외부 저장소를 등록 후 패키지 설치

패키지 파일(.deb)을 다운받아 설치

압축된 프로그램 파일(.tar.gz, .zip 등) 다운받아 압축 해제 후 설치 또는 사용

소스(sources) 파일을 다운받아 컴파일 설치

위 상자에 나열된 방법은 위에서 아래로 내려갈수록 패키지 설치 난도가 올라갑니다.

 

이번에 사용할 phpMyAdmin 최신버전 설치 방법은 네 번째 방법입니다.

이전에도 phpMyAdmin을 수동으로 설치하는 방법에 대해 연재한 적이 있습니다만 해당 방법들은 데스크톱환경에서 서버 구축과 운영 실습을 공부하고자 하는 서버 초심자들을 위한 좀 간략한 방법을 설명했다면 이번 연재에서는 서버 관리자를 위해 터미널 작업만으로 설치 및 설정을 하는 중고급 설명을 위주로 진행하도록 하겠습니다.

 

이하의 설명은 서버 관리자(SuperUser)가 웹을 통한 설정이 아닌 터미널 작업 만으로 phpMyAdmin을 설치하는 방법을 설명하고 있습니다.

만약 이 phpMyAdmin을 설치, 사용하고자 하는 이가 서버 관리자가 아니라 웹호스팅을 받는 사용자로 특정 디렉터리에 대해서만 접근 권한을 지니는 경우에는 아래 링크를 참고하시기 바랍니다.

링크

 

 


01. 저장소 정보 최신으로 동기화 및 패키지 업그레이드

study@study-VirtualBox:~$ sudo apt update

늘 강조하지만 패키지 관련 작업을 하기 위해서는 가장 먼저 저장소 정보를 새로 고쳐 최신 정보로 동기화해주어야 합니다.

 

study@study-VirtualBox:~$ sudo apt upgrade

저장소 정보를 새로 고쳐 최신 정보로 동기화한 후 시스템 내 설치되어 있는 전체 패키지를 업그레이드해줍니다.

위 명령은 데스크톱환경을 사용하는 일반/개인 사용자를 위한 권장 명령입니다.

그러나 만약 실제로 서버를 운영하는 서버 관리자의 경우 시스템 내 전체 패키지 업그레이드 명령을 사용하는 것은 권장하지 않습니다. 잘 돌아가던 서버가 어떤 패키지가 업그레이드됨으로써 의존성이 깨지거나 버그가 발생하여 문제가 발생할 수 있기 때문입니다.

따라서 서버 관리자는 필요한 패키지를 지정하여 업그레이드하는 것을 권장합니다. 물론 패키지를 업그레이드하기 전에 백업 계획을 세워 문제가 발생할 경우 복원할 수 있도록 만반의 작업를 해야 하는 것은 당연한 일이겠지요.

 

02. phpMyAdmin 설치 전 요구 조건

phpMyAdmin의 공식 문서에서는 phpMyAdmin을 설치하기 전 몇 가지 요건을 제시하고 있습니다.

해당 내용을 요약하면 다음과 같습니다.

phpMyAdmin 설치 전 요구 조건

PHP 7.2.5 이상

(session, standard PHP Library (SPL) extension, hash, ctype, JSON 지원.

 

설치 권장 PHP 익스텐션

mbstring 익스텐션, zip 익스텐션, GD2 익스텐션, openssl 익스텐션, libxml 익스텐션, curl 익스텐션, JSON 익스텐션

설치 권장 PHP 익스텐션의 경우 필수는 아니지만 설치하면 유용한 기능을 사용할 수 있습니다.

따라서 큰 이유가 없다면 설치하시는 것을 권장합니다.

 

03. phpMyAdmin 종속성, 추천, 제안 패키지  확인

study@study-VirtualBox:~$ apt-cache show phpmyadmin | grep "Depends\|Recommends\|Suggests"

phpMyAdmin의 종속성 패키지와 추천, 제안 패키지들을 확인해봅시다.

 

study@study-VirtualBox:~$ apt-cache show phpmyadmin | grep "Depends\|Recommends\|Suggests"
Depends: php, php-cli, php-mysql, php-json, php-mbstring, php-xml, debconf (>= 0.5) | debconf-2.0, libjs-sphinxdoc (>= 1.0), sensible-utils, dbconfig-mysql | dbconfig-no-thanks | dbconfig-common (<< 2.0.0), php-phpseclib (>= 2.0), php-common, php-phpmyadmin-sql-parser (>= 4.3.2), php-phpmyadmin-sql-parser (<< 5~~), php-phpmyadmin-motranslator (>= 5.0), php-phpmyadmin-motranslator (<< 6~~), php-phpmyadmin-shapefile (>= 2.0), php-phpmyadmin-shapefile (<< 3~~), php-phpseclib (<< 3~~), php-google-recaptcha (>= 1.1), php-google-recaptcha (<< 2~~), php-psr-container (>= 1.0), php-psr-container (<< 2~~), php-twig (>= 2.9), php-twig (<< 3~~), php-twig-extensions (>= 1.5.1), php-twig-extensions (<< 1.6~~), php-symfony-expression-language, libjs-openlayers, ucf (>= 0.28)
Recommends: apache2 | lighttpd | httpd, php-curl, php-gd, php-bz2, php-zip, php-tcpdf
Suggests: default-mysql-server | virtual-mysql-server, www-browser, php-recode, php-opcache, php-gd2, php-pragmarx-google2fa, php-bacon-qr-code, php-samyoul-u2f-php-server
study@study-VirtualBox:~$ 

종속성(Depends) 패키지들은 함께 딸려 같이 자동으로 설치되는 필수 패키지들을 의미합니다.

추천(Recommands) 패키지는 필수는 아니지만 함께 설치하는 것을 권장하는 패키지입니다.

제안(Suggests) 패키지는 필수거나 같이 설치할 것을 강력히 권장하는 추천 패키지는 아니지만 설치 패키지와 관련하여 사용자의 필요에 의해 설치할 수 있는 패키지들을 의미합니다.

패키지 분류에 대한 자세한 설명은 아래 링크를 참고하시기 바랍니다.

 위 링크의 섹션(7.7.)부터 7.10. 섹션까지가 데비안 및 우분투 계열에서 사용되는 패키지 분류 방식에 대한 설명입니다.

 

04. phpMyAdmin 설치에 필요한 PHP 익스텐션 설치

mbstring 익스텐션, zip 익스텐션, GD2 익스텐션, openssl 익스텐션, libxml 익스텐션, curl 익스텐션, JSON 익스텐션

phpMyAdmin 공식문서에서는 위의 PHP 익스텐션을 설치할 것을 권장하고 있는데 phpMyAdmin의 종속성 패키지와 추천, 제안 패키지들을 확인해보면 다음과 같이 분류됩니다.

phpMyAdmin 공식 문서에서 밝힌 설치 권장 익스텐션 분류

종속성 패키지(Depends): php-json, php-mbstring, php-xml, 
추천 패키지 (Recommends) : php-curl, php-gd, php-bz2, php-zip, php-tcpdf
제안 패키지(Suggests) : php-gd2

$ sudo apt install phpmyadmin 명령을 실행하면 phpMyAdmin의 종속성 패키지는 굳이 적어주지 않아도 자동으로 설치될 것입니다.

그러나 우리는 phpMyAdmin을 저장소를 통해 자동 설치하는 것이 아니므로 필요한 모든 조건 패키지들을 일일이 지정해 설치해주어야 합니다.

 

study@study-VirtualBox:~$ sudo apt install php-mbstring php-json php-xml php-curl php-gd php-bz2 php-zip

위는 phpMyAdmin을 원활히 사용하기 위한 최소한의 PHP 익스텐션 패키지들을 설치하는 명령입니다.

 

study@study-VirtualBox:~$ sudo apt install phpmyadmin
[sudo] study의 암호: 
패키지 목록을 읽는 중입니다... 완료
의존성 트리를 만드는 중입니다       
상태 정보를 읽는 중입니다... 완료
다음 패키지가 자동으로 설치되었지만 더 이상 필요하지 않습니다:
  libllvm10
'sudo apt autoremove'를 이용하여 제거하십시오.
다음의 추가 패키지가 설치될 것입니다 :
  dbconfig-common dbconfig-mysql icc-profiles-free javascript-common
  libjs-jquery libjs-openlayers libjs-sphinxdoc libjs-underscore php-curl
  php-google-recaptcha php-phpmyadmin-motranslator php-phpmyadmin-shapefile
  php-phpmyadmin-sql-parser php-phpseclib php-psr-cache php-psr-container
  php-psr-log php-symfony-cache php-symfony-cache-contracts
  php-symfony-expression-language php-symfony-service-contracts
  php-symfony-var-exporter php-tcpdf php-twig php-twig-extensions php7.4-curl
제안하는 패키지:
  php-dbase php-libsodium php-mcrypt php-gmp
  php-symfony-service-implementation php-twig-doc php-symfony-translation
  php-recode php-gd2 php-pragmarx-google2fa php-bacon-qr-code
  php-samyoul-u2f-php-server
추천하는 패키지:
  php-mcrypt
다음 새 패키지를 설치할 것입니다:
  dbconfig-common dbconfig-mysql icc-profiles-free javascript-common
  libjs-jquery libjs-openlayers libjs-sphinxdoc libjs-underscore php-curl
  php-google-recaptcha php-phpmyadmin-motranslator php-phpmyadmin-shapefile
  php-phpmyadmin-sql-parser php-phpseclib php-psr-cache php-psr-container
  php-psr-log php-symfony-cache php-symfony-cache-contracts
  php-symfony-expression-language php-symfony-service-contracts
  php-symfony-var-exporter php-tcpdf php-twig php-twig-extensions php7.4-curl
  phpmyadmin
0개 업그레이드, 27개 새로 설치, 0개 제거 및 0개 업그레이드 안 함.
15.1 M바이트 아카이브를 받아야 합니다.
이 작업 후 68.7 M바이트의 디스크 공간을 더 사용하게 됩니다.
계속 하시겠습니까? [Y/n] 

참고로 저장소를 통해 phpMyAdmin을 설치하고자 할 때 위와 같이 각종 패키지 목록이 표시됩니다.

여기서 필요하다 싶은 패키지들을 추가로 설치해주면 됩니다.

 

05. phpMyAdmin 수동 설치 과정

05-01. phpMyAdmin 다운로드

이하의 설명은 위의 phpMyAdmin 공식문서를 참고하여 Debian/Ubuntu 시스템에 맞춰 재구성한 것입니다.

보다 자세한 내용은 phpMyAdmin 공식문서를 참고하시기 바랍니다.

 

phpMyAdmin의 공식사이트에서 최신 버전의 파일을 다운받습니다.

이 글을 작성하는 시점의 최신 버전은 5.1.0입니다.

공식 사이트의 메인 페이지(홈페이지) 우측 상단에 걸려 있는 다운로드 버튼은 ZIP 파일입니다.

물론 UnZip 패키지를 이용해 풀 수도 있지만 이 글에서는 리눅스 계열에서 전통적으로 쓰는 Tar.Gz 압축 아카이브 형식을 다운받아 풀고 사용하도록 하겠습니다.

위 링크 페이지에서 phpMyAdmin-버전-언어.tar.gz 파일을 다운받아주면 됩니다.

이 글에서는 phpMyAdmin-5.1.0-all-languages.tar.gz 파일을 기준으로 설명하도록 하겠습니다.

 

해당 파일의 전체 주소는 해당 파일 링크 위에 마우스 포인터를 올려두고 오른쪽 버튼을 눌러 나타나는 메뉴들 중에서 링크 주소 복사 버튼을 눌러줍니다. 그러면 해당 파일의 전체 주소가 클립보드에 복사됩니다.

 

study@study-VirtualBox:~$ sudo wget -P ~/다운로드 https://files.phpmyadmin.net/phpMyAdmin/5.1.0/phpMyAdmin-5.1.0-all-languages.tar.gz

위 명령을 사용하여 다운로드 디렉터리에 phpMyAdmin 배포 아카이브 파일을 다운받습니다.

 

study@study-VirtualBox:~$ sudo wget -P ~/다운로드 https://files.phpmyadmin.net/phpMyAdmin/5.1.0/phpMyAdmin-5.1.0-all-languages.tar.gz
--2021-03-11 11:24:06--  https://files.phpmyadmin.net/phpMyAdmin/5.1.0/phpMyAdmin-5.1.0-all-languages.tar.gz
files.phpmyadmin.net (files.phpmyadmin.net)을(를) 해석하는 중... 89.187.160.6, 2a02:6ea0:d300::6
접속 files.phpmyadmin.net (files.phpmyadmin.net)|89.187.160.6|:443... 접속됨.
HTTP 요청을 전송했습니다. 응답을 기다리는 중입니다... 200 OK
길이: 13687393 (13M) [application/octet-stream]
다음 위치에 저장: `/home/study/다운로드/phpMyAdmin-5.1.0-all-languages.tar.gz'

phpMyAdmin-5.1.0-al 100%[===================>]  13.05M  9.98MB/s    / 1.3s     

2021-03-11 11:24:07 (9.98 MB/s) - `/home/study/다운로드/phpMyAdmin-5.1.0-all-languages.tar.gz' 저장됨 [13687393/13687393]

study@study-VirtualBox:~$ 

위는 phpMyAdmin 다운로드 진행과정입니다.

 

study@study-VirtualBox:~$ cd ~/다운로드
study@study-VirtualBox:~/다운로드$ ls
cobweb-3725540_960_720.jpg  phpMyAdmin-5.1.0-all-languages.tar.gz
study@study-VirtualBox:~/다운로드$ 

위처럼 파일이 다운받아진 것을 확인할 수 있습니다.

 

05-02. 아카이브 파일 압축 해제

다운받은 압축 파일을 풀어보도록 합시다.

$ sudo tar -xzf <파일명> -C <압축 풀 디렉터리>

위의 기본 구문을 이용해 압축을 원하는 디렉터리에 풀어주도록 합시다.

 

study@study-VirtualBox:~/다운로드$ sudo tar -xzvf phpMyAdmin-5.1.0-all-languages.tar.gz -C /usr/share

여기서는 압축을 풀 디렉터리를 /usr/share 디렉터리로 지정했는데 이는 일반 사용자들이  공유해 사용 가능한 각종 응용 프로그램, 데이터 등을 저장하는 디렉터리입니다.

저장소를 통해 phpMyAdmin 패키지를 설치하는 경우 주된 프로그램 파일들이 이곳에 설치되기에 이곳에 압축이 풀리도록 설정했습니다.

위에서 설정한 압축 해제 디렉터리는 서버 관리자가 일반적으로 설정하는 디렉터리입니다.

서버 관리자가 아니라 웹호스팅 임차 사용자 등과 같이 특정 디렉터리만 접근 및 사용 권한을 가진 경우 웹문서 루트 디렉터리에 설치하셔도 됩니다.

 

study@study-VirtualBox:~/다운로드$ sudo tar -xzvf phpMyAdmin-5.1.0-all-languages.tar.gz -C /usr/share
phpMyAdmin-5.1.0-all-languages/
phpMyAdmin-5.1.0-all-languages/CONTRIBUTING.md
phpMyAdmin-5.1.0-all-languages/ChangeLog
phpMyAdmin-5.1.0-all-languages/LICENSE
phpMyAdmin-5.1.0-all-languages/README
phpMyAdmin-5.1.0-all-languages/RELEASE-DATE-5.1.0

- 중략 -

phpMyAdmin-5.1.0-all-languages/vendor/williamdes/mariadb-mysql-kbs/src/
phpMyAdmin-5.1.0-all-languages/vendor/williamdes/mariadb-mysql-kbs/src/KBDocumentation.php
phpMyAdmin-5.1.0-all-languages/vendor/williamdes/mariadb-mysql-kbs/src/KBEntry.php
phpMyAdmin-5.1.0-all-languages/vendor/williamdes/mariadb-mysql-kbs/src/KBException.php
phpMyAdmin-5.1.0-all-languages/vendor/williamdes/mariadb-mysql-kbs/src/Search.php
phpMyAdmin-5.1.0-all-languages/vendor/williamdes/mariadb-mysql-kbs/src/SlimData.php
phpMyAdmin-5.1.0-all-languages/yarn.lock
study@study-VirtualBox:~/다운로드$ 

위 예시는 -xzf 옵션에 -v 옵션을 추가해 실행한 경우의 모습입니다.

압축 해제 과정을 눈으로 확인할 수 있습니다.

 

study@study-VirtualBox:~/다운로드$ cd /usr/share
study@study-VirtualBox:/usr/share$ ls -F | grep -i phpmyadmin
phpMyAdmin-5.1.0-all-languages/
study@study-VirtualBox:/usr/share$

위와 같이 압축이 제대로 풀렸는지 확인합니다.

 

study@study-VirtualBox:/usr/share$ sudo mv phpMyAdmin-5.1.0-all-languages phpmyadmin
study@study-VirtualBox:/usr/share$ 

압축이 풀린 모습을 보니 디렉터리명이 대소문자, 하이픈, 숫자 등이 섞인 채 너무 길게 명명되어 있습니다. 이것을 간략하게 phpmyadmin으로 바꿔줍니다.

 

05-03. phpMyAdmin 설정 전 작업

study@study-VirtualBox:/usr/share$ cd ~
study@study-VirtualBox:~$ sudo mkdir -p /var/lib/phpmyadmin/tmp
study@study-VirtualBox:~$

phpMyAdmin이 환경을 구성하기 위해 사용할 임시 파일을 저장할 디렉터리를 생성해줍니다.

 

study@study-VirtualBox:~$ sudo chown -R www-data:www-data /var/lib/phpmyadmin

생성한 phpMyAdmin용 라이브러리 디렉터리의 소유자와 사용 그룹을 www-data로 지정해줍니다.

www-data에 대하여

www-data은 Apache와 같은 웹서버가 리눅스에서 작업시 사용하는 리눅스 사용자 프로필입니다.

 

phpMyAdmin을 사용하기 위해서는 phpMyAdmin의 디렉터리(여기서는 /usr/share/phpmyadmin) 안에 설정 파일(= 환경구성 파일) config.inc.php을 만들어 주어야 합니다.

 

phpMyAdmin은 설정 파일의 예시 파일인 config.sample.inc.php 파일을 친절하게 구비해놓고 있습니다.

따라서 이 파일을 복사해 config.inc.php 파일을 생성해주면 작업이 편해집니다.

 

study@study-VirtualBox:~$ sudo cp /usr/share/phpmyadmin/config.sample.inc.php /usr/share/phpmyadmin/config.inc.php

 

 


06. config.inc.php 파일(phpMyAdmin 기본 설정 파일) 편집

 

study@study-VirtualBox:~$ cat -n /usr/share/phpmyadmin/config.inc.php
     1	<?php
     2	/**
     3	 * phpMyAdmin sample configuration, you can use it as base for
     4	 * manual configuration. For easier setup you can use setup/
     5	 *
     6	 * All directives are explained in documentation in the doc/ folder
     7	 * or at <https://docs.phpmyadmin.net/>.
     8	 */
     9	
    10	declare(strict_types=1);
    11	
    12	/**
    13	 * This is needed for cookie based authentication to encrypt password in
    14	 * cookie. Needs to be 32 chars long.
    15	 */
    16	$cfg['blowfish_secret'] = ''; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */
    17	
    18	/**
    19	 * Servers configuration
    20	 */
    21	$i = 0;
    22	
    23	/**
    24	 * First server
    25	 */
    26	$i++;
    27	/* Authentication type */
    28	$cfg['Servers'][$i]['auth_type'] = 'cookie';
    29	/* Server parameters */
    30	$cfg['Servers'][$i]['host'] = 'localhost';
    31	$cfg['Servers'][$i]['compress'] = false;
    32	$cfg['Servers'][$i]['AllowNoPassword'] = false;
    33	
    34	/**
    35	 * phpMyAdmin configuration storage settings.
    36	 */
    37	
    38	/* User used to manipulate with storage */
    39	// $cfg['Servers'][$i]['controlhost'] = '';
    40	// $cfg['Servers'][$i]['controlport'] = '';
    41	// $cfg['Servers'][$i]['controluser'] = 'pma';
    42	// $cfg['Servers'][$i]['controlpass'] = 'pmapass';
    43	
    44	/* Storage database and tables */
    45	// $cfg['Servers'][$i]['pmadb'] = 'phpmyadmin';
    46	// $cfg['Servers'][$i]['bookmarktable'] = 'pma__bookmark';
    47	// $cfg['Servers'][$i]['relation'] = 'pma__relation';
    48	// $cfg['Servers'][$i]['table_info'] = 'pma__table_info';
    49	// $cfg['Servers'][$i]['table_coords'] = 'pma__table_coords';
    50	// $cfg['Servers'][$i]['pdf_pages'] = 'pma__pdf_pages';
    51	// $cfg['Servers'][$i]['column_info'] = 'pma__column_info';
    52	// $cfg['Servers'][$i]['history'] = 'pma__history';
    53	// $cfg['Servers'][$i]['table_uiprefs'] = 'pma__table_uiprefs';
    54	// $cfg['Servers'][$i]['tracking'] = 'pma__tracking';
    55	// $cfg['Servers'][$i]['userconfig'] = 'pma__userconfig';
    56	// $cfg['Servers'][$i]['recent'] = 'pma__recent';
    57	// $cfg['Servers'][$i]['favorite'] = 'pma__favorite';
    58	// $cfg['Servers'][$i]['users'] = 'pma__users';
    59	// $cfg['Servers'][$i]['usergroups'] = 'pma__usergroups';
    60	// $cfg['Servers'][$i]['navigationhiding'] = 'pma__navigationhiding';
    61	// $cfg['Servers'][$i]['savedsearches'] = 'pma__savedsearches';
    62	// $cfg['Servers'][$i]['central_columns'] = 'pma__central_columns';
    63	// $cfg['Servers'][$i]['designer_settings'] = 'pma__designer_settings';
    64	// $cfg['Servers'][$i]['export_templates'] = 'pma__export_templates';
    65	
    66	/**
    67	 * End of servers configuration
    68	 */
    69	
    70	/**
    71	 * Directories for saving/loading files from server
    72	 */
    73	$cfg['UploadDir'] = '';
    74	$cfg['SaveDir'] = '';
    75	
    76	/**
    77	 * Whether to display icons or text or both icons and text in table row
    78	 * action segment. Value can be either of 'icons', 'text' or 'both'.
    79	 * default = 'both'
    80	 */
    81	//$cfg['RowActionType'] = 'icons';
    82	
    83	/**
    84	 * Defines whether a user should be displayed a "show all (records)"
    85	 * button in browse mode or not.
    86	 * default = false
    87	 */
    88	//$cfg['ShowAll'] = true;
    89	
    90	/**
    91	 * Number of rows displayed when browsing a result set. If the result
    92	 * set contains more rows, "Previous" and "Next".
    93	 * Possible values: 25, 50, 100, 250, 500
    94	 * default = 25
    95	 */
    96	//$cfg['MaxRows'] = 50;
    97	
    98	/**
    99	 * Disallow editing of binary fields
   100	 * valid values are:
   101	 *   false    allow editing
   102	 *   'blob'   allow editing except for BLOB fields
   103	 *   'noblob' disallow editing except for BLOB fields
   104	 *   'all'    disallow editing
   105	 * default = 'blob'
   106	 */
   107	//$cfg['ProtectBinary'] = false;
   108	
   109	/**
   110	 * Default language to use, if not browser-defined or user-defined
   111	 * (you find all languages in the locale folder)
   112	 * uncomment the desired line:
   113	 * default = 'en'
   114	 */
   115	//$cfg['DefaultLang'] = 'en';
   116	//$cfg['DefaultLang'] = 'de';
   117	
   118	/**
   119	 * How many columns should be used for table display of a database?
   120	 * (a value larger than 1 results in some information being hidden)
   121	 * default = 1
   122	 */
   123	//$cfg['PropertiesNumColumns'] = 2;
   124	
   125	/**
   126	 * Set to true if you want DB-based query history.If false, this utilizes
   127	 * JS-routines to display query history (lost by window close)
   128	 *
   129	 * This requires configuration storage enabled, see above.
   130	 * default = false
   131	 */
   132	//$cfg['QueryHistoryDB'] = true;
   133	
   134	/**
   135	 * When using DB-based query history, how many entries should be kept?
   136	 * default = 25
   137	 */
   138	//$cfg['QueryHistoryMax'] = 100;
   139	
   140	/**
   141	 * Whether or not to query the user before sending the error report to
   142	 * the phpMyAdmin team when a JavaScript error occurs
   143	 *
   144	 * Available options
   145	 * ('ask' | 'always' | 'never')
   146	 * default = 'ask'
   147	 */
   148	//$cfg['SendErrorReports'] = 'always';
   149	
   150	/**
   151	 * You can find more configuration options in the documentation
   152	 * in the doc/ folder or at <https://docs.phpmyadmin.net/>.
   153	 */
study@study-VirtualBox:~$ 

위는 phpMyAdmin 버전 5.1.0에 포함되어 있는 config.sample.inc.php 파일을 복사해 생성한 config.inc.php 파일의 전체 내용입니다.

 


여기서는 고급 기능이 아니라 가장 일반적인 필수 설정만 설명하도록 하겠습니다.

 

study@study-VirtualBox:~$ sudo nano /usr/share/phpmyadmin/config.inc.php

여기서는 nano 편집기를 예시로 들겠습니다.

 

  GNU nano 4.8           /usr/share/phpmyadmin/config.inc.php                   
<?php
/**
 * phpMyAdmin sample configuration, you can use it as base for
 * manual configuration. For easier setup you can use setup/
 *
 * All directives are explained in documentation in the doc/ folder
 * or at <https://docs.phpmyadmin.net/>.
 */

declare(strict_types=1);

/**
 * This is needed for cookie based authentication to encrypt password in
 * cookie. Needs to be 32 chars long.
 */
$cfg['blowfish_secret'] = ''; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */

/**
 * Servers configuration
 */
                                [ 153 행 읽음 ]
^G 도움말 보기^O 기록 저장 ^W 위치 찾기 ^K 잘라내기  ^J 정렬     ^C 커서 위치
^X 나가기    ^R 파일 읽기 ^\ 바꾸기    ^U 붙여넣기  ^T 해당 철자로^_ 지정 행으로

nano 편집기로 config.inc.php 파일을 열어보았을 때의 터미널 화면입니다.

터미널에서 파일을 편집할 수 있습니다.

서버 관리자는 nano, vi(m) 등 터미널 기반 텍스트 편집기를 사용하겠지만 데스크톱환경에서 서버를 운영 중이라면 gedit 등 GUI 기반의 텍스트 편집기를 사용할 수 있습니다.

phpMyAdmin은 기본적으로 쿠키 인증 방법을 사용하므로 쿠키를 사용하여 유효한 MariaDB 사용자로 phpMyAdmin에 로그인할 수 있습니다. 이때 MariaDB 사용자 암호는 임시 쿠키에 AES 알고리즘을 사용하여 저장 및 암호화됩니다.

phpMyAdmin은 전통적으로 Blowfish 암호를 사용해왔으며 이는 지금도 여전히 구성 파일에 반영되어 있습니다.

 

$cfg['blowfish_secret'] = ''; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */

 

위 설정에서 따옴표 사이에 32자의 임의의 문자를 기입해줍니다. 이렇게 기입된 문자는 사용자가 따로 기억해야할 암호는 아니고 AES 알고리즘에 의해 내부적으로 사용됩니다.

 

위 작업을 마친 후에는 

 

/* User used to manipulate with storage */

 

위 주석 부분으로  내려옵니다. 그러면 아래와 같은 코드들을 볼 수 있습니다.

    38	/* User used to manipulate with storage */
    39	// $cfg['Servers'][$i]['controlhost'] = '';
    40	// $cfg['Servers'][$i]['controlport'] = '';
    41	// $cfg['Servers'][$i]['controluser'] = 'pma';
    42	// $cfg['Servers'][$i]['controlpass'] = 'pmapass';

이 섹션에는 phpMyAdmin 내에서 DB 관리 작업을 수행하는 pma라는 MySQL/MariaDB 데이터베이스 사용자를 정의하는 몇 가지 지시문이 포함되어 있습니다.

공식 문서에 따르면이 특별한 사용자(pma) 계정은 한 명의 사용자만 phpMyAdmin에 액세스하는 경우에는 불필요하지만 다중 사용자 시나리오에서는 권장하고 있습니다..

 

앞의 슬래시를 제거하여 controluser controlpass 지시문의 주석 처리를 제거해줍니다.

 

그런 다음  controlpass 지시문의 암호값을 다른 것으로 업데이트합니다.

이렇게하지 않으면 기본 비밀번호가 그대로 유지되고 알 수 없는 사용자가 phpMyAdmin 인터페이스를 통해 데이터베이스에 쉽게 접근할 수 있습니다.

 

바로 아래에는 다음과 같은 코드가 존재합니다.

    44	/* Storage database and tables */
    45	// $cfg['Servers'][$i]['pmadb'] = 'phpmyadmin';
    46	// $cfg['Servers'][$i]['bookmarktable'] = 'pma__bookmark';
    47	// $cfg['Servers'][$i]['relation'] = 'pma__relation';
    48	// $cfg['Servers'][$i]['table_info'] = 'pma__table_info';
    49	// $cfg['Servers'][$i]['table_coords'] = 'pma__table_coords';
    50	// $cfg['Servers'][$i]['pdf_pages'] = 'pma__pdf_pages';
    51	// $cfg['Servers'][$i]['column_info'] = 'pma__column_info';
    52	// $cfg['Servers'][$i]['history'] = 'pma__history';
    53	// $cfg['Servers'][$i]['table_uiprefs'] = 'pma__table_uiprefs';
    54	// $cfg['Servers'][$i]['tracking'] = 'pma__tracking';
    55	// $cfg['Servers'][$i]['userconfig'] = 'pma__userconfig';
    56	// $cfg['Servers'][$i]['recent'] = 'pma__recent';
    57	// $cfg['Servers'][$i]['favorite'] = 'pma__favorite';
    58	// $cfg['Servers'][$i]['users'] = 'pma__users';
    59	// $cfg['Servers'][$i]['usergroups'] = 'pma__usergroups';
    60	// $cfg['Servers'][$i]['navigationhiding'] = 'pma__navigationhiding';
    61	// $cfg['Servers'][$i]['savedsearches'] = 'pma__savedsearches';
    62	// $cfg['Servers'][$i]['central_columns'] = 'pma__central_columns';
    63	// $cfg['Servers'][$i]['designer_settings'] = 'pma__designer_settings';
    64	// $cfg['Servers'][$i]['export_templates'] = 'pma__export_templates';
    65	
    66	/**
    67	 * End of servers configuration
    68	 */

위 코드들은 phpMyAdmin 구성 저장소, 데이터베이스 및 관리 pma 데이터베이스 사용자가 사용하는 여러 테이블을 정의하는 여러 지시문이 포함되어 있습니다.

 

위 코드들의 앞에 있는 // 주석을 제거하여 활성화해줍니다.

물론 지금은 위 코드에 설정된 테이블이 DB에 존재하지 않습니다. 그러나 손쉽게 생성할 수 잇으므로 그다지 걱정하지 않아도 됩니다.

 

마지막으로 기존에는 없는 새로운 코드를 적어주어야 합니다.

/var/lib/phpmyadmin/tmp

우리는 앞서 phpMyAdmin이 환경을 구성하기 위해 사용할 임시 파일을 저장할 디렉터리로 위 디렉터리를 생성했었습니다.

위 디렉터리를 phpMyAdmin이 사용할 수 있도록 지시문을 작성해주어야 합니다.

$cfg['TempDir'] = '/var/lib/phpmyadmin/tmp';

config.inc.php 파일 맨 하단에 위 코드를 추가하고 파일을 저장해줍니다.

예시로 든 nano 편집기의 경우 CTRL + X를 눌러 빠져 나가고 Y를 눌러 저장할 것을 명령하며 그리고 ENTER키를 눌러 파일명 변경 없이 저장하고 빠져나가줍니다.

 

위에서 설명한 최소한의 설정 설명 이상의 자세한 설정 내용은 위 공식 문서 위키를 참고하시기 바랍니다.


07. phpMyAdmin용 DB Tables 생성 및 pma 계정 생성

07-01. Tables 생성

config.inc.php 파일 편집을 마친 다음에는 phpMyAdmin이 사용할 DB 테이블을 생성해주어야 합니다.

phpMyAdmin은 create_tables.sql이라는 파일이 함께 제공됩니다. SQL 파일에는 phpMyAdmin 구성 저장소 데이터베이스를 만드는 데 필요한 모든 명령과 phpMyAdmin이 올바르게 작동하는 데 필요한 테이블이 포함되어 있습니다.

 

study@study-VirtualBox:~$ sudo mariadb < /usr/share/phpmyadmin/sql/create_tables.sql
[sudo] study의 암호: 
study@study-VirtualBox:~$ 

위 명령을 실행하여 create_tables.sql 파일 내의 DB 정보를 서버 DB에 import해줍니다.

 

 

07-02. pma 계정을 생성

그 다음 pma 계정을 생성해주어야 합니다.

study@study-VirtualBox:~$ sudo mariadb

위 명령은 서버가 MariaDB를 사용한다고 가정했을 때 MariaDB 콘솔을 구동하는 명령입니다.

MariaDB 대신 MySQL을 사용한다면 $ sudo mysql을 입력해주시면 됩니다.

 

study@study-VirtualBox:~$ sudo mariadb
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 31
Server version: 10.5.9-MariaDB-1:10.5.9+maria~focal mariadb.org binary distribution

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)]> 

MariaDB 콘솔을 구동한 모습입니다.

 

MariaDB [(none)]> GRANT SELECT, INSERT, UPDATE, DELETE ON phpmyadmin.* TO 'pma'@'localhost' IDENTIFIED BY 'pmapass';
Query OK, 0 rows affected (0.038 sec)

MariaDB [(none)]> 

위와 같이 pma 계정을 생성해줍니다.

위 명령은 pma 계정을 생성하고 해당 계정에 SELECT, INSERT, UPDATE, DELETE 권한을 부여하는 명령입니다.

위 명령을 실행할 때 pmapass 부분은 pma 계정이 사용할 암호 부분으로, 아까 편집해 저장했던 config.inc.php 파일의 지시문들 중

 

$cfg['Servers'][$i]['controlpass'] = 'pmapass';

 

위 지시문에 정의했던 암호로 교체하여 적어 주시면 됩니다.

 

기본적으로 root 계정을 통해 DB를 관리할 수 있게 되어 있지만 보안을 위해 새로운 DB 관리 계정을 생성해주는 것이 좋습니다.

MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'study'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;
Query OK, 0 rows affected (0.034 sec)

MariaDB [(none)]>

위 명령은 DB 내 모든 테이블에 대한 모든 권한과 옵션을 부여받은 study라는 계정을 만듭니다.

당연한 말이지만 password 문구가 적힌 부분은 study 계정이 MariaDB에 로그인할 때 사용할 암호로, 혹여라도 있을 권한 탈취 등의 보안 사고에 대비해 강력한 암호로 교체해주어야 합니다.

 

MariaDB [(none)]> exit
Bye
study@study-VirtualBox:~$

계정 생성 작업이 완료되면 exit 명령을 실행하여 MariaDB 콘솔에서 빠져나와 줍니다.

MariaDB 콘솔에서 빠져나갈 때는 위에서 사용한 exit 뿐만 아니라, quit, \q도 사용할 수 있습니다.

 

이것으로 phpMyAdmin 설치 및 설정 작업은 완료되었습니다.

그러나 웹상에서 이 phpMyAdmin을 사용하기 위해서는 서버에 해당 접속 경로를 등록해주어야 합니다.

 


08. Apache2 서버에 phpMyAdmin 접속 경로 등록

웹브라우저에서 phpMyAdmin에 접속할 수 있도록 해주기 위해서는 Apache2 서버에 phpMyAdmin용 설정 파일을 생성하고 이를 활성해주어야 합니다.

 

study@study-VirtualBox:~$ sudo nano /etc/apache2/conf-available/phpmyadmin.conf

위 명령을 실행하여 phpmyadmin.conf 파일을 편집할 준비를 합니다.

이때 phpmyadmin.conf 앞의 붙은 경로는 Apache2 서버를 기본 저장소를 통해 설치했을 때의 기본값으로 만약 기본 저장소를 통해 Apache2 서버를 설치했다면 변경되면 안됩니다.

 

드물기는 하겠지만 만약 Apache2 서버를 컴파일, 빌드를 통해 설정값을 커스터마이징하여 설치한 경우라면 그에 맞춰 수정해주어야 합니다. 물론 위 방법을 실행하실 정도라면 이 이상의 설명은 불필요할 것입니다.

 

 

# phpMyAdmin default Apache configuration

Alias /phpmyadmin /usr/share/phpmyadmin

<Directory /usr/share/phpmyadmin>
    Options SymLinksIfOwnerMatch
    DirectoryIndex index.php

    <IfModule mod_php5.c>
        <IfModule mod_mime.c>
            AddType application/x-httpd-php .php
        </IfModule>
        <FilesMatch ".+\.php$">
            SetHandler application/x-httpd-php
        </FilesMatch>

        php_value include_path .
        php_admin_value upload_tmp_dir /var/lib/phpmyadmin/tmp
        php_admin_value open_basedir /usr/share/phpmyadmin/:/etc/phpmyadmin/:/var/lib/phpmyadmin/:/usr/share/php/php-gettext/:/usr/share/php/php-php-gettext/:/usr/share/javascript/:/usr/share/php/tcpdf/:/usr/share/doc/phpmyadmin/:/usr/share/php/phpseclib/
        php_admin_value mbstring.func_overload 0
    </IfModule>
    <IfModule mod_php.c>
        <IfModule mod_mime.c>
            AddType application/x-httpd-php .php
        </IfModule>
        <FilesMatch ".+\.php$">
            SetHandler application/x-httpd-php
        </FilesMatch>

        php_value include_path .
        php_admin_value upload_tmp_dir /var/lib/phpmyadmin/tmp
        php_admin_value open_basedir /usr/share/phpmyadmin/:/etc/phpmyadmin/:/var/lib/phpmyadmin/:/usr/share/php/php-gettext/:/usr/share/php/php-php-gettext/:/usr/share/javascript/:/usr/share/php/tcpdf/:/usr/share/doc/phpmyadmin/:/usr/share/php/phpseclib/
        php_admin_value mbstring.func_overload 0
    </IfModule>

</Directory>

# Authorize for setup
<Directory /usr/share/phpmyadmin/setup>
    <IfModule mod_authz_core.c>
        <IfModule mod_authn_file.c>
            AuthType Basic
            AuthName "phpMyAdmin Setup"
            AuthUserFile /etc/phpmyadmin/htpasswd.setup
        </IfModule>
        Require valid-user
    </IfModule>
</Directory>

# Disallow web access to directories that don't need it
<Directory /usr/share/phpmyadmin/templates>
    Require all denied
</Directory>
<Directory /usr/share/phpmyadmin/libraries>
    Require all denied
</Directory>
<Directory /usr/share/phpmyadmin/setup/lib>
    Require all denied
</Directory>

위 코드 내용은 우분투에서 기본 저장소를 통해 phpMyAdmin을 설치했을 경우 자동으로 생성되는 기본값입니다.

별다른 이유가 없다면 위 기본값을 복사해 그대로 사용하셔도 무방합니다. 아니 보안 등을 위해서라도 위 코드 값을 사용하시는 것을 적극 권장합니다.

 

phpmyadmin.conf 파일의 편집을 마치고 저장한 후에는 이 설정값을 활성화해주어야 합니다.

study@study-VirtualBox:~$ sudo a2enconf phpmyadmin.conf
Enabling conf phpmyadmin.
To activate the new configuration, you need to run:
  systemctl reload apache2
study@study-VirtualBox:~$ 

정상적으로 활성화되면 위와 같이 출력됩니다.

설정값이 활성화되기는 했지만 지금 당장은 적용되지 않았습니다. 이 활성화된 설정값을 적용하기 위해서는 Apache2 서버가 설정값들을 다시 읽어들이도록 리로드 명령을 실행해주어야 합니다.

 

study@study-VirtualBox:~$ sudo systemctl reload apache2

위 명령을 실행하여 설정값들을 재로드해줍니다.

 

http://domain/phpmyadmin

http://localhost/phpmyadmin

이제 웹브라우저에서 위 주소로 접속하면 phpMyAdmin 로그인 화면이 뜨는 것을 확인할 수 있습니다.

새로 생성한 MariaDB  관리용 계정으로 접속하면 DB 관리용 웹콘솔화면을 볼 수 있습니다.

 


사실 위 과정을 마지막으로 phpMyAdmin 설치 과정은 마무리되었습니다.

그러나 phpMyAdmin은 웹을 통해 DB를 관리하는 것이므로 보안에 굉장히 취약합니다.

보안을 위해서라면 웹을 통해 DB에 접근하는 phpMyAdmin은 사용하지 않고 HeidiSQL 등과 같은 DB 관리 클라이언트 프로그램을 사용하는 것이 좋습니다.

 

그럼에도 불구하고 phpMyAdmin을 사용해야 겠다면 접속 프로토콜을 https://로 바꿔 준다거나 인증 방식을 바꾼다거나, 로그인 시 계정과 암호 인증을 거치게 한다거나 하는 몇 가지 추가적인 보안 작업을 수행해주어야 합니다.