웹사이트 검색

Ubuntu 14.04 서버에서 Nginx로 phpMyAdmin을 설치하고 보호하는 방법


소개

MySQL과 같은 관계형 데이터베이스 관리 시스템은 웹 사이트 및 애플리케이션의 상당 부분에 필요합니다. 그러나 모든 사용자가 명령줄에서 데이터를 관리하는 것을 편안하게 느끼는 것은 아닙니다.

이 문제를 해결하기 위해 웹 기반 관리 인터페이스의 형태로 대안을 제공하기 위해 phpMyAdmin이라는 프로젝트가 만들어졌습니다. 이 가이드에서는 Ubuntu 14.04 서버에서 phpMyAdmin 구성을 설치하고 보호하는 방법을 보여줍니다. 성능 프로필이 좋고 다른 웹 서버보다 많은 부하를 더 잘 처리할 수 있는 Nginx 웹 서버 위에 이 설정을 구축할 것입니다.

전제 조건

시작하기 전에 해결해야 할 몇 가지 요구 사항이 있습니다.

이 시스템을 구축할 견고한 기반이 있는지 확인하려면 Ubuntu 14.04용 초기 서버 설정 가이드를 실행해야 합니다. 무엇보다도 관리 명령에 대한 sudo 액세스 권한이 있는 루트가 아닌 사용자를 설정하는 과정을 안내합니다.

이 가이드를 시작하기 위해 충족해야 하는 두 번째 전제 조건은 Ubuntu 14.04 서버에 LEMP(Linux, Nginx, MySQL 및 PHP) 스택을 설치하는 것입니다. 이것은 우리가 phpMyAdmin 인터페이스를 제공하는 데 사용할 플랫폼입니다(MySQL은 우리가 관리하고자 하는 데이터베이스 관리 소프트웨어이기도 합니다). 아직 서버에 LEMP를 설치하지 않은 경우 Ubuntu 14.04에 LEMP 설치에 대한 자습서를 따르십시오.

이 가이드를 따른 후 서버가 제대로 작동하는 상태이면 이 페이지의 나머지 부분을 계속 진행할 수 있습니다.

1단계 - phpMyAdmin 설치

LEMP 플랫폼이 이미 설치되어 있으므로 phpMyAdmin 소프트웨어 설치를 바로 시작할 수 있습니다. Ubuntu의 기본 리포지토리 내에서 사용할 수 있으므로 설치 프로세스가 간단합니다.

먼저 서버의 로컬 패키지 색인을 업데이트하여 사용 가능한 패키지에 대한 새로운 참조 세트가 있는지 확인합니다. 그런 다음 apt 패키징 도구를 사용하여 리포지토리에서 소프트웨어를 가져와 시스템에 설치할 수 있습니다.

sudo apt-get update
sudo apt-get install phpmyadmin

설치하는 동안 몇 가지 정보를 입력하라는 메시지가 표시됩니다. 소프트웨어가 자동으로 구성할 웹 서버를 묻습니다. 우리가 사용하고 있는 웹 서버인 Nginx는 사용 가능한 옵션 중 하나가 아니므로 TAB만 누르면 이 프롬프트를 무시할 수 있습니다.

다음 프롬프트는 dbconfig-common이 phpmyadmin이 사용할 데이터베이스를 구성할 것인지 묻습니다. 계속하려면 "예\를 선택하십시오.

이러한 변경을 허용하려면 MySQL 설치 중에 구성한 데이터베이스 관리 암호를 입력해야 합니다. 그런 다음 phpMyAdmin 자체 데이터를 보관할 새 데이터베이스의 암호를 선택하고 확인하라는 메시지가 표시됩니다.

이제 설치가 완료됩니다. Nginx 웹 서버가 phpMyAdmin 파일을 올바르게 찾아 제공하려면 다음을 입력하여 설치 파일에서 Nginx 문서 루트 디렉토리로의 심볼릭 링크를 생성하기만 하면 됩니다.

sudo ln -s /usr/share/phpmyadmin /usr/share/nginx/html

해결해야 할 마지막 항목은 phpMyAdmin이 의존하는 mcrypt PHP 모듈을 활성화하는 것입니다. 이것은 phpMyAdmin과 함께 설치되었으므로 이를 켜고 PHP 프로세서를 다시 시작하기만 하면 됩니다.

sudo php5enmod mcrypt
sudo service php5-fpm restart

이제 phpMyAdmin 설치가 작동합니다. 인터페이스에 액세스하려면 웹 브라우저에서 서버의 도메인 이름 또는 공용 IP 주소로 이동한 다음 /phpmyadmin을 입력합니다.

http://server_domain_or_IP/phpmyadmin

로그인하려면 유효한 MySQL 사용자의 사용자 이름/암호 쌍을 사용하십시오. root 사용자와 MySQL 관리 암호는 시작하기에 좋은 선택입니다. 그러면 관리 인터페이스에 액세스할 수 있습니다.

주변을 클릭하여 인터페이스에 익숙해지십시오. 다음 섹션에서는 새 인터페이스를 보호하기 위한 단계를 수행합니다.

2단계 — phpMyAdmin 인스턴스 보안

서버에 설치된 phpMyAdmin 인스턴스는 이 시점에서 완전히 사용할 수 있어야 합니다. 그러나 웹 인터페이스를 설치함으로써 우리는 MySQL 시스템을 외부 세계에 노출시켰습니다.

포함된 인증 화면으로도 상당히 문제가 됩니다. 액세스를 제공하는 대량의 데이터와 결합된 phpMyAdmin의 인기로 인해 이와 같은 설치는 공격자의 일반적인 대상입니다.

설치 대상이 되어 손상될 가능성을 줄이기 위해 두 가지 간단한 전략을 구현할 것입니다. 일부 자동화된 봇 무차별 암호 대입 시도를 회피하기 위해 인터페이스 위치를 /phpmyadmin에서 다른 것으로 변경할 것입니다. 또한 phpMyAdmin 로그인 화면에 도달하기 전에 통과해야 하는 추가 웹 서버 수준 인증 게이트웨이를 생성합니다.

애플리케이션의 액세스 위치 변경

Nginx 웹 서버가 phpMyAdmin 파일을 찾아 제공하기 위해 이전 단계에서 phpMyAdmin 디렉토리에서 문서 루트로의 심볼릭 링크를 만들었습니다.

phpMyAdmin 인터페이스에 액세스할 수 있는 URL을 변경하려면 심볼릭 링크의 이름을 바꾸기만 하면 됩니다. Nginx 문서 루트 디렉토리로 이동하여 수행 중인 작업에 대한 더 나은 아이디어를 얻습니다.

cd /usr/share/nginx/html
ls -l
total 8
-rw-r--r-- 1 root root 537 Mar  4 06:46 50x.html
-rw-r--r-- 1 root root 612 Mar  4 06:46 index.html
lrwxrwxrwx 1 root root  21 Aug  6 10:50 phpmyadmin -> /usr/share/phpmyadmin

보시다시피 이 디렉토리에는 phpmyadmin이라는 심볼릭 링크가 있습니다. 이 링크 이름을 원하는 대로 변경할 수 있습니다. 이렇게 하면 브라우저에서 phpMyAdmin에 액세스할 수 있는 위치가 변경되어 하드 코딩된 봇에서 액세스 포인트를 숨길 수 있습니다.

위치의 목적을 나타내지 않는 이름을 선택하십시오. 이 가이드에서는 액세스 위치의 이름을 /nothingtosee로 지정합니다. 이를 달성하기 위해 링크 이름을 변경합니다.

sudo mv phpmyadmin nothingtosee
ls -l
total 8
-rw-r--r-- 1 root root 537 Mar  4 06:46 50x.html
-rw-r--r-- 1 root root 612 Mar  4 06:46 index.html
lrwxrwxrwx 1 root root  21 Aug  6 10:50 nothingtosee -> /usr/share/phpmyadmin

이제 phpMyAdmin 설치의 이전 위치로 이동하면 404 오류가 발생합니다.

http://server_domain_or_IP/phpmyadmin

그러나 phpMyAdmin 인터페이스는 선택한 새 위치에서 사용할 수 있습니다.

http://server_domain_or_IP/nothingtosee

웹 서버 인증 게이트 설정

설치를 위해 원했던 다음 기능은 사용자가 phpMyAdmin 로그인 화면을 보기 전에 통과해야 하는 인증 프롬프트였습니다.

다행스럽게도 Nginx를 포함한 대부분의 웹 서버는 이 기능을 기본적으로 제공합니다. 세부 정보로 Nginx 구성 파일을 수정하기만 하면 됩니다.

이 작업을 수행하기 전에 인증 자격 증명을 저장할 암호 파일을 만듭니다. Nginx는 암호가 crypt() 함수를 사용하여 암호화되도록 요구합니다. 서버에 이미 설치되어 있어야 하는 OpenSSL 제품군에 이 기능이 포함되어 있습니다.

암호화된 암호를 생성하려면 다음을 입력하십시오.

openssl passwd

사용하려는 암호를 입력하고 확인하라는 메시지가 표시됩니다. 유틸리티는 다음과 같이 암호화된 버전의 암호를 표시합니다.

O5az.RSPzd.HE

생성할 인증 파일에 붙여넣어야 하므로 이 값을 복사합니다.

이제 인증 파일을 만듭니다. 이 파일 pma_pass를 호출하고 Nginx 구성 디렉토리에 배치합니다.

sudo nano /etc/nginx/pma_pass

이 파일 내에서 사용하려는 사용자 이름, 콜론(:), openssl passwd 유틸리티에서 받은 암호의 암호화된 버전을 지정하기만 하면 됩니다.

사용자 이름을 demo로 지정하지만 다른 사용자 이름을 선택해야 합니다. 이 가이드의 파일은 다음과 같습니다.

demo:O5az.RSPzd.HE

완료되면 파일을 저장하고 닫습니다.

이제 Nginx 구성 파일을 수정할 준비가 되었습니다. 시작하려면 텍스트 편집기에서 이 파일을 엽니다.

sudo nano /etc/nginx/sites-available/default

이 파일 내에서 새 위치 섹션을 추가해야 합니다. 이것은 phpMyAdmin 인터페이스에 대해 선택한 위치를 대상으로 합니다(이 가이드에서는 /nothingtosee를 선택했습니다).

server 블록 내에 있지만 다른 블록 외부에 이 섹션을 만듭니다. 예제에서 location / 블록 아래에 새 위치 블록을 배치합니다.

server {
    . . .

    location / {
        try_files $uri $uri/ =404;
    }

    location /nothingtosee {
    }

    . . .
}

이 블록 내에서 auth_basic이라는 지시문의 값을 프롬프트가 사용자에게 표시할 인증 메시지로 설정해야 합니다. 인증되지 않은 사용자에게 우리가 무엇을 보호하고 있는지 알리고 싶지 않으므로 구체적인 세부 정보를 제공하지 마십시오. 이 예에서는 "관리자 로그인\을 사용합니다.

그런 다음 auth_basic_user_file이라는 지시문을 사용하여 웹 서버에서 생성한 인증 파일을 가리켜야 합니다. Nginx는 사용자에게 인증 세부 정보를 묻는 메시지를 표시하고 입력된 값이 지정된 파일에서 찾은 값과 일치하는지 확인합니다.

완료되면 파일은 다음과 같아야 합니다.

server {
    . . .

    location / {
        try_files $uri $uri/ =404;
    }

    location /nothingtosee {
        auth_basic "Admin Login";
        auth_basic_user_file /etc/nginx/pma_pass;
    }

    . . .
}

완료되면 파일을 저장하고 닫습니다.

새 인증 게이트를 구현하려면 웹 서버를 다시 시작해야 합니다.

sudo service nginx restart

이제 웹 브라우저에서 phpMyAdmin 위치를 방문하면(이미 phpMyAdmin을 사용하고 있는 경우 캐시를 지우거나 다른 브라우저 세션을 사용해야 할 수 있음) pma_pass 파일:

http://server_domain_or_IP/nothingtosee

자격 증명을 입력하면 일반 phpMyAdmin 로그인 페이지로 이동합니다. 이 추가된 보호 계층은 추가된 보안 이점 외에도 인증 시도로부터 MySQL 로그를 깨끗하게 유지하는 데 도움이 됩니다.

결론

이제 상당히 안전한 웹 인터페이스에서 MySQL 데이터베이스를 관리할 수 있습니다. 이 UI는 MySQL 명령 프롬프트에서 사용할 수 있는 대부분의 기능을 제공합니다. 데이터베이스와 스키마를 보고, 쿼리를 실행하고, 새로운 데이터 세트와 구조를 생성할 수 있습니다.