본문 바로가기
Linux/TIP

[CentOS] phpMyAdmin 최신버전 설치와 설정 [최종]

by aegypius 2022. 8. 3.
728x90
반응형

 

대략 2년 전에 phpmyadmin에 대한 글을 두 번이나 정리했었다. 이번에 새로운 VPS에 서버를 구축하면서 다시한 번 정리해야 할 필요성을 느꼈다. 크게 두 가지 이유 때문인데, 첫 째는 root로 로그인 할 수 없는 문제이며, 둘 째는 이로인해 쉽게 없앨 수 있는 "The phpMyAdmin configuration storage is not completely configured" 오류메시지에 대한 해결 방법이다.

오늘날짜(2022.08.03)기준으로 phpmyadmin의 최신버전은 5.3.0이지만 stable 버전인 5.2를 설치할 것이며, 서버환경은 CentOS 7 / MariaDB 10.4 / Apache 2.4.6 이다.

CentOS에서 phpmyadmin을 yum으로 설치하게 되면 /usr/share/ 하위에 설치되는 것으로 기억한다. 이전의 방법과 동일하게 해당 디렉토리에 phpmyadmin의 압축파일을 다운받아서 압축을 풀었다.

[root@2ndServer share]# pwd
/usr/share
[root@pc15662598 share]# wget https://www.phpmyadmin.net/downloads/phpMyAdmin-latest-all-languages.tar.gz
--2022-08-03 12:06:15--  https://www.phpmyadmin.net/downloads/phpMyAdmin-latest-all-languages.tar.gz
Resolving www.phpmyadmin.net (www.phpmyadmin.net)... 89.187.160.57, 89.187.160.27, 89.187.160.25, ...
Connecting to www.phpmyadmin.net (www.phpmyadmin.net)|89.187.160.57|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://files.phpmyadmin.net/phpMyAdmin/5.2.0/phpMyAdmin-5.2.0-all-languages.tar.gz [following]
--2022-08-03 12:06:17--  https://files.phpmyadmin.net/phpMyAdmin/5.2.0/phpMyAdmin-5.2.0-all-languages.tar.gz
Resolving files.phpmyadmin.net (files.phpmyadmin.net)... 89.187.160.24, 89.187.160.27, 89.187.160.30, ...
Connecting to files.phpmyadmin.net (files.phpmyadmin.net)|89.187.160.24|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 12474799 (12M) [application/octet-stream]
Saving to: ‘phpMyAdmin-latest-all-languages.tar.gz’

100%[===================================================================>] 12,474,799  30.5MB/s   in 0.4s

2022-08-03 12:06:18 (30.5 MB/s) - ‘phpMyAdmin-latest-all-languages.tar.gz’ saved [12474799/12474799]

[root@pc15662598 share]# ls
aclocal              fonts                        ImageMagick6                            pki
adobe                games                        info                                    plymouth
alsa                 gcc-4.8.2                    kde4                                    polkit-1
anaconda             gcc-4.8.5                    kdump                                   redhat-release
appdata              GConf                        libdrm                                  selinux
applications         gdb                          libthai                                 setools-3.3
augeas               GeoIP                        licenses                                sounds
authconfig           gettext                      locale                                  systemd
awk                  gettext-0.19.8               lua                                     systemtap
backgrounds          ghostscript                  magic                                   tabset
bash-completion      glib-2.0                     man                                     terminfo
centos-logos         glvnd                        microcode_ctl                           themes
centos-release       gnome                        mime                                    thumbnailers
cracklib             gnome-background-properties  mime-info                               tuned
dbus-1               gnupg                        misc                                    wallpapers
desktop-directories  graphviz                     mysql                                   X11
dict                 groff                        omf                                     xml
doc                  grub                         os-prober                               xsessions
egl                  gtk-2.0                      p11-kit                                 yum-cli
empty                httpd                        perl5                                   yum-plugins
file                 hwdata                       php                                     zoneinfo
firewalld            i18n                         phpMyAdmin-latest-all-languages.tar.gz  zsh
firstboot            icons                        pixmaps
fontconfig           idl                          pkgconfig
[root@2ndServer share]#

압축을 풀면 phpMyAdmin-5.2.0-all-languages 라는 디렉토리가 생성되는데 이전과 마찬가지로 phpMyAdmin으로 이름을 변경했다. phpMyAdmin 디렉토리에 있는 config.sample.inc.php를 config.inc.php로 이름을 변경하거나 복사 해 두자. 파일의 내용은 잠시 후에 편집하기로 하고 우선은 phpmyadmin을 위한 웹서버의 설정을 먼저 하자.

apache의 가상호스트 기본 디렉토리인 /etc/httpd/conf.d에 phpmyadmin.conf라는 파일을 하나 만들고 아래와 같은 내용으로 저장해두자.

Alias /phpmyadmin /usr/share/phpMyAdmin
Alias /내가원하는이름 /usr/share/phpMyAdmin

<Directory /usr/share/phpMyAdmin/>
   AddDefaultCharset UTF-8
   AllowOverride All

   <IfModule mod_authz_core.c>
     # Apache 2.4
     <RequireAny>
      Require all granted
     </RequireAny>
   </IfModule>

<IfModule !mod_authz_core.c>
     # Apache 2.2
     Order Deny,Allow
     Deny from All
     Allow from 127.0.0.1
     Allow from ::1
   </IfModule>
</Directory>

<Directory /usr/share/phpMyAdmin/setup/>
   <IfModule mod_authz_core.c>
     # Apache 2.4
     <RequireAny>
       Require all granted
     </RequireAny>
   </IfModule>

   <IfModule !mod_authz_core.c>
     # Apache 2.2
     Order Deny,Allow
     Deny from All
     Allow from 127.0.0.1
     Allow from ::1
   </IfModule>

</Directory>

위의 예와 같이 파일 선두의 Alias는 두 개 이상 정의해도 문제가 없다.

phpmyadmin의 접속 주소가 "mydomain.tld/내가원하는이름"으로 설정된다. (실제 한글사용이 가능하며, puny code로 변환하지 않은 한글을 사용할 수 있다.) 적당한 이름을 선택하면 되겠다. 그 옆의 경로(/usr/share/phpMyAdmin)는 이후 몇 차례 등장하는 <Directory> 지시어에서도 사용되는데, 이는 실제로 phpmyadmin이 설치되어 있는 경로를 지정해야 한다.

이제 웹서버를 재시작 한 후에 phpmyadmin에 접속해 보자. 위의 예에서와 같이 설정했다면, 서버에서 운영중인 웹사이트의 주소뒤에 /phpmyadmin이나 /내가원하는이름을 입력하여 아래와 같이 phpmyadmin 로그인페이지를 볼 수 있을 것이다. 아직 운영중인 사이트가 없다면 웹사이트의 주소(URL)는 IP주소로 대체할 수 있다.

만약 root 계정으로 로그인을 시도한다면 다음과 같은 오류메시지가 발생한다.

message 1 (오류)
mysqli::real_connect(): (HY000/1698): Access denied for user 'root'@'localhost'

(특별한 설정을 하지 않았다면) MariaDB 10.4 이후버전부터 phpmyadmin의 root 접속이 안될 것이다. 이제 MariaDB의 일반 계정으로 로그인해보자. phpmyadmin 화면 하단에 아래와 같은 오류메시지가 3개 정도 보일것이다. (가장 마지막의 번역작업을 도와달라는 것은 무시~하자)

message 2 (경고)
phpMyAdmin 설정 스토리지가 완전히 설정되지 않아, 일부 확장 기능들이 비활성화 된 상태입니다. 원인을 확인하려면 여기를 클릭하세요. 대신 데이터베이스 작업 탭을 사용하여 설정할 수도 있습니다.

The phpMyAdmin configuration storage is not completely configured, some extended features have been deactivated. Find out why.
Or alternately go to 'Operations' tab of any database to set it up there. 


 

message 3 (오류)
The configuration file now needs a secret passphrase (blowfish_secret).

 

message 4 (오류)
The $cfg['TempDir'] (/usr/share/phpMyAdmin/tmp/) is not accessible. phpMyAdmin is not able to cache templates and will be slow because of this.

전체 오류메시지 화면저장

가장 아래의 오류 메시지부터 하나씩 처리해보자

$cfg['TempDir'] (/usr/share/phpMyAdmin/tmp/)에 액세스할 수 없다는 메시지는 해당 위치에 tmp라는 디렉토리를 생성하여 없앨 수 있다. 그리고 새로만든 tmp 디렉토리의 소유권을 웹서버(apache)에서 넘겨주어야 한다. 물론 소유권은 그냥 둔채로 퍼미션을 777로 설정해도 오류메시지는 사라지지만 이는 그리 좋은 방법이 아니다.

tmp디렉토리를 생성하고 소유권을 apache에게 주었다면, 웹서버를 재시동하여 해당 오류메시지가 사라졌는지 확인해보자. (페이지 새로 고침으로 바뀐설정을 적용할 수 없다.)

이제 설정 파일은 암호화 문자열(blowfish_secret)을 필요로 합니다. The configuration file now needs a secret passphrase (blowfish_secret). 위에서 복사해둔 config.inc.php를 편집모드로 열어서 대략 16번째 줄을 살펴보자.

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

위의 작은 인용부호 사이에 32바이트의 문자열을 넣어주면된다. 영문대소문자, 공백, 특수문자 등으로 32byte를 채우자. 지난번 포스팅에서도 언급했지만 blowfish secret을 생성해주는 많은 사이트들이 있다. 랜덤한 32바이트 코드의 나열인데 굳이 그런 사이트의 도움을......(받는 것도 나쁘지 않지만..생각나는대로 손이 가는대로 적는것도 나름 괜찮다~ -_-;)

이제 마지막 하나 남았다.

phpMyAdmin 설정 스토리지가 완전히 설정되지 않아, 일부 확장 기능들이 비활성화 된 상태입니다. 원인을 확인하려면 여기를 클릭하세요. 대신 데이터베이스 작업 탭을 사용하여 설정할 수도 있습니다. The phpMyAdmin configuration storage is not completely configured, some extended features have been deactivated. Find out why.
Or alternately go to 'Operations' tab of any database to set it up there.
 메시지의 링크 '여기'를 클릭하면 자동으로 설정이 완료되기도 하는데, 이것은 db의 모든 권한을 갖고 있는 root로 로그인했을 경우에 해당된다. 

phpmyadmin이 설치된 디렉토리(/usr/share/phpMyAdmin)의 하위에 sql이라는 디렉토리가 있다. 여기에 저장되어 있는 create_tables.sql을 이용해서 phpmyadmin을 위한 db를 생성하자. 이래와 같다.

[root@2ndServer sql]# pwd
/usr/share/phpMyAdmin/sql
[root@2ndServer sql]# ll
total 28
-rw-r--r-- 1 root root 10949 2022-05-11 13:39 create_tables.sql
-rw-r--r-- 1 root root  1665 2022-05-11 13:39 upgrade_column_info_4_3_0+.sql
-rw-r--r-- 1 root root   671 2022-05-11 13:39 upgrade_tables_4_7_0+.sql
-rw-r--r-- 1 root root  5691 2022-05-11 13:39 upgrade_tables_mysql_4_1_2+.sql
[root@pc15662598 sql]# mysql -uroot < create_tables.sql
Enter password:
[root@2ndServer sql]#

 

위의 명령으로 phpmyadmin이라는 이름의 db가 생성되었다.(직접 확인해보자) 이제 새로운 db 계정을 생성하고, 해당 계정에게 지금 만든 db(phpmyadmin)의 권한을 부여할 것이다. 새로 만들 db의 계정은 pma로 할 것이다.

MariaDB [(none)]> create user pma@localhost;
Query OK, 0 rows affected (0.006 sec)

MariaDB [(none)]> set password for pma@localhost=password('pmapassword');
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> grant select, insert, update, delete on phpmyadmin.* to pma@localhost;
Query OK, 0 rows affected (0.003 sec)

MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.003 sec)

MariaDB [(none)]>

위에서는 pma@localhost 계정의 비밀번호를 pmapassword로 했는데...적당한(?) 것으로 교체하자. 그리고 config.inc.php를 열어서 아래와 같이 수정하자. 대략 34~66번째 줄의 내용이다.

/**
 * phpMyAdmin configuration storage settings.
 */

/* User used to manipulate with storage */
$cfg['Servers'][$i]['controlhost'] = 'localhost';
// $cfg['Servers'][$i]['controlport'] = '';
$cfg['Servers'][$i]['controluser'] = 'pma';
$cfg['Servers'][$i]['controlpass'] = 'pmapassword';

/* Storage database and tables */
$cfg['Servers'][$i]['pmadb'] = 'phpmyadmin';
$cfg['Servers'][$i]['bookmarktable'] = 'pma__bookmark';
$cfg['Servers'][$i]['relation'] = 'pma__relation';
$cfg['Servers'][$i]['table_info'] = 'pma__table_info';
$cfg['Servers'][$i]['table_coords'] = 'pma__table_coords';
$cfg['Servers'][$i]['pdf_pages'] = 'pma__pdf_pages';
$cfg['Servers'][$i]['column_info'] = 'pma__column_info';
$cfg['Servers'][$i]['history'] = 'pma__history';
$cfg['Servers'][$i]['table_uiprefs'] = 'pma__table_uiprefs';
$cfg['Servers'][$i]['tracking'] = 'pma__tracking';
$cfg['Servers'][$i]['userconfig'] = 'pma__userconfig';
$cfg['Servers'][$i]['recent'] = 'pma__recent';
$cfg['Servers'][$i]['favorite'] = 'pma__favorite';
$cfg['Servers'][$i]['users'] = 'pma__users';
$cfg['Servers'][$i]['usergroups'] = 'pma__usergroups';
$cfg['Servers'][$i]['navigationhiding'] = 'pma__navigationhiding';
$cfg['Servers'][$i]['savedsearches'] = 'pma__savedsearches';
$cfg['Servers'][$i]['central_columns'] = 'pma__central_columns';
$cfg['Servers'][$i]['designer_settings'] = 'pma__designer_settings';
$cfg['Servers'][$i]['export_templates'] = 'pma__export_templates';

별다른 수정없이 주석을 해제한게 전부이다. controlhost는 localhost인데 사실 이 줄의 주석은 풀지 않아도 무방하다. 두 번째 줄의 주석은 풀지 않았는데 db가 사용하는 포트 3306를 위한 것 이다. (이것을 사용할 계획이라면, 방화벽에서 해당 포트는 열어뒀는지, MariaDB의 설정(my.cnf)에서 원격접속을 위한 설정은 해뒀는지 살펴봐야 할 것이다.)  controluser는 새로 만든 계정인 pma로 설정했고, 그 아래의 controlpass는 계정의 비밀번호이다. 이후의 'Storage database and tables'의 모든 주석을 해제했다.

이제 phpmyadmin에 접속하여 pma계정으로 로그인해 보자. 그리고 기타 다른 계정으로 로그인해보자. 더이상 phpMyAdmin의 설정 스토리지가 완벽하게 설정되지 않았다는 메시지는 보이지 않을 것이다. (혹시 계속 보인다면 쿠키를 삭제하거나, 웹브라우저를 완전히 종료한 후에 다시 실행하여 접속해보자)

그리고....
root 계정으로 로그인하는 방법을 검색해봤더니 크게 두 가지가 나왔다. 하나는 root를 대체할 새로운 계정을 생성하여 root와 마찬가지로 db의 모든 권한을 부여하는 것이고, 다른 하나는 설정을 수정하여 강제로 root계정의 로그인을 허용하는 방법이었다. 대신 어느정도 보안의 희생을 감수해야 한다. 생각해보니 딱히 필요한 작업은 아니었다. 

또하나...
MariaDB 10.4 부터 적용된 새로운 인증방식으로는 phpMyAdmin에 root 계정으로 login이 하는것이 불가능하다. 물론 MariaDB의 로그인 방법을 이전의 normal한 방식으로 바꾼다면 가능하다. 아래의 글을 참고하자.

2020.06.04 - [Linux/APM] - [CentOS7] MariaDB 10.4 설치, 비밀번호 변경, 포트변경, 원격접속
 

[CentOS7] MariaDB 10.4 설치, 비밀번호 변경, 포트변경, 원격접속

[MariaDB 10.4] 설치, 비밀번호 변경, 포트변경, 원격접속 대략 3개월 이상 방치하고 있는 서버가 한 대 있다. 몇 가지 테스트 해 볼 것들이 생겨서 bind와 httpd, php, mariadb를 다시 설치하고 테스트

aegypius.tistory.com


위에서 처럼 MariaDB의 로그인 방식을 고전방식(? -u -p 옵션사용, 계정/비번 입력)으로 바꾸면 phpmyadmin에서 root 계정으로 로그인 가능해진다. 선택은 사용자의 몫이겠지만....root 계정으로의 로그인이 필요하다면 이와 같이 변경하는 방법이 가장 안전(?)한 듯........하다.

그리고........웹브라우저를 통해서 phpmyadmin에 로그인 할 때, 계정의 비밀번호에 특수문자(~!@#$%^ 등)가 포함되어 있다면 Firefox Browser에서는 로그인이 안된다. 테스트했던 Firefox 브라우저는 103.0.1(64비트) 버전으로 오늘기준으로 최신버전이다.

728x90
반응형

댓글