웹사이트 검색

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


소개

많은 사용자가 MySQL과 같은 데이터베이스 관리 시스템의 기능을 필요로 하지만 일부 사용자에게는 명령줄 인터페이스가 덜 직관적이고 사용자 친화적이어서 진입 장벽이 될 수 있습니다.

phpMyAdmin은 사용자가 웹 인터페이스를 통해 MySQL과 상호 작용할 수 있도록 만들어졌습니다. 이 가이드에서는 Ubuntu 16.04 시스템에서 안전하게 데이터베이스를 관리할 수 있도록 phpMyAdmin을 설치하고 보호하는 방법에 대해 설명합니다. 성능 프로필이 좋고 다른 웹 서버보다 많은 부하를 더 잘 처리할 수 있는 Nginx 웹 서버 위에 이 설정을 구축할 것입니다.

전제 조건

이 가이드를 시작하기 전에 다음 전제 조건 단계를 완료했는지 확인하세요.

  • 우선 Ubuntu 16.04 초기 서버 설정의 1-4단계에 설명된 대로 sudo 권한이 있는 루트가 아닌 사용자를 사용하고 있다고 가정합니다.
  • 또한 Ubuntu 16.04 서버에 LEMP(Linux, Nginx, MySQL 및 PHP) 설치를 완료했다고 가정합니다. 아직 이 작업을 수행하지 않은 경우 Ubuntu 16.04에 LEMP 스택 설치에 대한 가이드를 따를 수 있습니다. MySQL 데이터베이스 관리자 암호를 기록해 두십시오.

마지막으로 phpMyAdmin과 같은 소프트웨어를 사용할 때 알아야 할 중요한 보안 고려 사항이 있습니다. MySQL 설치와 직접 통신하고 MySQL 자격 증명을 사용하여 인증을 처리하고 임의의 SQL 쿼리에 대한 결과를 실행하고 반환합니다.

이러한 이유와 자주 공격 대상이 되는 널리 배포된 PHP 응용 프로그램이기 때문에 일반 HTTP 연결을 통해 원격 시스템에서 phpMyAdmin을 실행해서는 안 됩니다. SSL/TLS 인증서로 구성된 기존 도메인이 없는 경우 Ubuntu 16.04에서 Let’s Encrypt로 Nginx 보안에 대한 이 가이드를 따를 수 있습니다.

이러한 전제 조건 단계를 완료하면 이 가이드를 시작할 준비가 된 것입니다.

1단계 - phpMyAdmin 설치

LEMP 플랫폼이 이미 설치되어 있으면 Ubuntu의 기본 리포지토리에서 사용할 수 있는 phpMyAdmin을 설치하여 시작할 수 있습니다.

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

  1. sudo apt-get update
  2. sudo apt-get install phpmyadmin

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

다음 프롬프트는 dbconfig-common이 phpMyAdmin이 사용할 데이터베이스를 구성할 것인지 묻습니다. 계속하려면 "예\를 선택하십시오. 이러한 변경을 허용하려면 MySQL 설치 중에 구성한 데이터베이스 관리자 암호를 입력해야 합니다.

이제 phpMyAdmin 애플리케이션과 해당 데이터베이스(이 단계에서 생성됨)의 비밀번호를 선택하고 확인하라는 메시지가 표시됩니다. 보안 암호를 선택 및 확인하고 기록해 둡니다.

이제 설치가 완료됩니다. Nginx 웹 서버가 phpMyAdmin 파일을 올바르게 찾아 제공하려면 설치 파일에서 Nginx 문서 루트 디렉터리로의 심볼릭 링크를 만들어야 합니다.

  1. sudo ln -s /usr/share/phpmyadmin /var/www/html

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

  1. sudo phpenmod mcrypt
  2. sudo systemctl restart php7.0-fpm

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

http://server_domain_or_IP/phpmyadmin

로그인하려면 유효한 MySQL 사용자의 자격 증명 집합을 사용하십시오. 예를 들어 root 사용자 및 MySQL 관리 암호는 시작하기에 좋은 선택입니다. 그러면 관리 인터페이스에 액세스할 수 있습니다.

주변을 클릭하여 인터페이스에 익숙해지십시오.

다음 두 섹션에서는 새로운 phpMyAdmin 웹 콘솔을 보호하기 위한 단계를 수행합니다.

2단계 - 기본 phpMyAdmin URL 변경

이 시점에서 phpMyAdmin 설치가 완전히 작동해야 합니다. 그러나 웹 인터페이스를 설치하여 MySQL 데이터베이스 서버를 외부 세계에 노출했습니다. phpMyAdmin의 인기와 액세스를 제공할 수 있는 많은 양의 데이터로 인해 이와 같은 설치는 공격의 일반적인 대상입니다.

이 섹션에서는 인터페이스의 URL을 /phpmyadmin에서 비표준으로 변경하여 일부 자동화된 봇 무차별 암호 대입 시도를 회피함으로써 설치를 "강화\하거나 잠글 것입니다.

이전 단계에서 Nginx 웹 서버가 phpMyAdmin 파일을 찾고 제공할 수 있도록 phpMyAdmin 디렉토리에서 문서 루트로의 심볼릭 링크를 만들었습니다. phpMyAdmin 인터페이스의 URL을 변경하기 위해 이 심볼릭 링크의 이름을 바꿉니다.

먼저 Nginx 문서 루트 디렉토리로 이동하여 변경 사항을 더 잘 이해해 보겠습니다.

  1. cd /var/www/html/
  2. ls -l

다음과 같은 결과가 표시됩니다.

Output
total 4 -rw-r--r-- 1 root root 612 Apr 10 16:40 index.nginx-debian.html lrwxrwxrwx 1 root root 21 Apr 10 17:06 phpmyadmin -> /usr/share/phpmyadmin

출력은 이 디렉토리에 phpmyadmin이라는 심볼릭 링크가 있음을 보여줍니다. 이 링크 이름을 원하는 대로 변경할 수 있습니다. 이렇게 하면 phpMyAdmin의 액세스 URL이 변경되어 공통 엔드포인트 이름(예: "phpmyadmin”)을 검색하도록 하드코딩된 봇으로부터 엔드포인트를 가리는 데 도움이 될 수 있습니다.

엔드포인트의 용도를 가리는 이름을 선택하십시오. 이 가이드에서는 끝점의 이름을 /nothingtosee로 지정하지만 대체 이름을 선택해야 합니다. 이를 달성하기 위해 링크 이름을 변경합니다.

  1. sudo mv phpmyadmin nothingtosee
  2. ls -l

위의 명령을 실행하면 다음과 같은 출력이 표시됩니다.

Output
total 4 -rw-r--r-- 1 root root 612 Apr 10 16:40 index.nginx-debian.html lrwxrwxrwx 1 root root 21 Apr 10 17:06 nothingtosee -> /usr/share/phpmyadmin

이제 이전 URL로 이동하면 404 오류가 발생합니다.

http://server_domain_or_IP/phpmyadmin

이제 방금 구성한 새 URL에서 phpMyAdmin 인터페이스를 사용할 수 있습니다.

http://server_domain_or_IP/nothingtosee

이제 인증 게이트웨이를 설정하여 phpMyAdmin 설치를 더욱 강화할 수 있습니다.

3단계 - Nginx 인증 게이트웨이 설정

우리가 설정할 다음 기능은 사용자가 phpMyAdmin 로그인 화면을 보기 전에 통과해야 하는 인증 프롬프트입니다. Nginx를 포함한 대부분의 웹 서버는 기본적으로 이 기능을 제공합니다. 세부 정보로 Nginx 구성 파일을 수정하기만 하면 됩니다.

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

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

  1. openssl passwd

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

Output
O5az.RSPzd.HE

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

이제 인증 파일을 만듭니다. 이 파일을 pma_pass라고 하고 Nginx 구성 디렉토리에 넣습니다.

  1. sudo nano /etc/nginx/pma_pass

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

사용자 이름을 sammy로 지정하지만 다른 사용자 이름을 선택해야 합니다. 파일은 다음과 같아야 합니다.

sammy:O5az.RSPzd.HE

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

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

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

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

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

server {
    . . .

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                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;
    }

    . . .
}

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

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

  1. sudo service nginx restart

이제 웹 브라우저에서 phpMyAdmin URL을 방문하면(페이지 새로 고침이 작동하지 않으면 캐시를 지우거나 이미 phpMyAdmin을 사용하고 있는 경우 다른 브라우저 세션을 사용해야 할 수 있음) 다음을 묻는 메시지가 표시됩니다. pma_pass 파일에 추가한 사용자 이름과 비밀번호:

http://server_domain_or_IP/nothingtosee

자격 증명을 입력하면 표준 phpMyAdmin 로그인 페이지로 이동합니다.

추가 보안 계층을 제공하는 것 외에도 이 게이트웨이는 스팸 인증 시도로부터 MySQL 로그를 깨끗하게 유지하는 데 도움이 됩니다.

결론

이 자습서를 완료하면 이제 합리적으로 안전한 웹 인터페이스에서 MySQL 데이터베이스를 관리할 수 있습니다. 이 사용자 인터페이스는 MySQL 명령줄을 통해 사용할 수 있는 대부분의 기능을 제공합니다. 데이터베이스와 스키마를 찾아보고, 쿼리를 실행하고, 새로운 데이터 세트와 구조를 생성할 수 있습니다.