웹사이트 검색

Ubuntu 20.04에서 phpMyAdmin을 설치하고 보호하는 방법


이 튜토리얼의 이전 버전은 Brennan Bearnes가 작성했습니다.

소개

많은 사용자가 MySQL과 같은 데이터베이스 관리 시스템의 기능을 필요로 하지만 MySQL 프롬프트에서만 시스템과 상호 작용하는 것이 불편할 수 있습니다.

phpMyAdmin은 사용자가 웹 인터페이스를 통해 MySQL과 상호 작용할 수 있도록 만들어졌습니다. 이 가이드에서는 Ubuntu 20.04 시스템에서 안전하게 데이터베이스를 관리할 수 있도록 phpMyAdmin을 설치하고 보호하는 방법에 대해 설명합니다.

전제 조건

이 가이드를 완료하려면 다음이 필요합니다.

  • Ubuntu 20.04 서버. 이 서버에는 관리 권한이 있는 루트가 아닌 사용자와 ufw로 구성된 방화벽이 있어야 합니다. 이를 설정하려면 Ubuntu 20.04용 초기 서버 설정 가이드를 따르세요.
  • Ubuntu 20.04 서버에 설치된 LAMP(Linux, Apache, MySQL 및 PHP) 스택. 아직 완료되지 않은 경우 Ubuntu 20.04에 LAMP 스택 설치에 대한 이 가이드를 따를 수 있습니다.

또한 다음과 같은 이유로 phpMyAdmin과 같은 소프트웨어를 사용할 때 중요한 보안 고려 사항이 있습니다.

  • MySQL 설치와 직접 통신
  • MySQL 자격 증명을 사용하여 인증 처리
  • 임의의 SQL 쿼리 실행 및 결과 반환

이러한 이유와 자주 공격 대상이 되는 널리 배포된 PHP 응용 프로그램이기 때문에 일반 HTTP 연결을 통해 원격 시스템에서 phpMyAdmin을 실행해서는 안 됩니다.

SSL/TLS 인증서로 구성된 기존 도메인이 없는 경우 Apache 가상 호스트 설정에 대한 이 가이드를 따를 수 있습니다.

1단계 - phpMyAdmin 설치

APT를 사용하여 기본 Ubuntu 리포지토리에서 phpMyAdmin을 설치할 수 있습니다.

루트가 아닌 sudo 사용자로서 서버의 패키지 색인을 업데이트합니다.

  1. sudo apt update

그런 다음 phpmyadmin 패키지를 설치할 수 있습니다. 이 패키지와 함께 공식 문서에서는 서버에 몇 가지 PHP 확장을 설치하여 특정 기능을 활성화하고 성능을 향상시킬 것을 권장합니다.

필수 LAMP 스택 자습서를 따랐다면 이러한 모듈 중 일부가 php 패키지와 함께 설치되었을 것입니다. 그러나 다음 패키지도 설치하는 것이 좋습니다.

  • php-mbstring: ASCII가 아닌 문자열을 관리하고 문자열을 다른 인코딩으로 변환하기 위한 모듈
  • php-zip: 이 확장 프로그램은 phpMyAdmin에 .zip 파일 업로드를 지원합니다.
  • php-gd: GD 그래픽 라이브러리 지원 활성화
  • php-json: JSON 직렬화를 지원하는 PHP 제공
  • php-curl: PHP가 다른 프로토콜을 사용하는 다른 종류의 서버와 상호 작용할 수 있도록 합니다.

필수 LAMP 스택 자습서에 설치된 기본 버전이 아닌 다른 버전의 PHP를 사용하는 경우 이러한 모듈 패키지의 적절한 버전을 설치해야 합니다. 예를 들어 PHP 버전 8.0을 사용하는 경우 기본 php-mbstring 대신 php8.0-mbstring 패키지를 설치해야 합니다. 코드> 패키지.

다음 명령을 실행하여 이러한 패키지를 시스템에 설치하십시오. 그러나 설치 프로세스에서 phpMyAdmin을 올바르게 구성하려면 몇 가지 선택을 해야 합니다. 다음 옵션을 곧 살펴보겠습니다.

  1. sudo apt install phpmyadmin php-mbstring php-zip php-gd php-json php-curl

다음은 설치를 올바르게 구성하기 위해 메시지가 표시될 때 선택해야 하는 옵션입니다.

  • 서버 선택을 위해 apache2를 선택합니다.

경고: 프롬프트가 나타나면 "apache2\가 강조 표시되지만 선택되지는 않습니다. Apache를 선택하기 위해 SPACE를 누르지 않으면 설치 프로그램이 필요한 파일을 이동하지 않습니다 설치하는 동안 SPACE, TAB을 누른 다음 ENTER를 눌러 Apache를 선택합니다.

  • dbconfig-common을 사용하여 데이터베이스를 설정할 것인지 묻는 메시지가 나타나면 를 선택합니다.
  • 그런 다음 phpMyAdmin에 대한 MySQL 애플리케이션 암호를 선택하고 확인하라는 메시지가 표시됩니다.

참고: 필수 LAMP 스택 자습서의 2단계에 따라 MySQL을 설치했다고 가정하면 암호 유효성 검사 플러그인을 활성화하기로 결정했을 수 있습니다. 이 글을 쓰는 시점에서 이 구성 요소를 활성화하면 phpmyadmin 사용자에 대한 암호를 설정하려고 할 때 오류가 발생합니다.

이 문제를 해결하려면 중단 옵션을 선택하여 설치 프로세스를 중지하십시오. 그런 다음 MySQL 프롬프트를 엽니다.

  1. sudo mysql

또는 루트 MySQL 사용자에 대해 암호 인증을 활성화한 경우 이 명령을 실행한 다음 프롬프트가 표시되면 암호를 입력합니다.

  1. mysql -u root -p

프롬프트에서 다음 명령을 실행하여 암호 확인 구성 요소를 비활성화합니다. 이렇게 하면 실제로 제거되지는 않지만 구성 요소가 MySQL 서버에 로드되는 것을 중지합니다.

  1. UNINSTALL COMPONENT "file://component_validate_password";

그런 다음 MySQL 클라이언트를 닫을 수 있습니다.

  1. exit

그런 다음 phpmyadmin 패키지를 다시 설치하면 예상대로 작동합니다.

  1. sudo apt install phpmyadmin

phpMyAdmin이 설치되면 sudo mysql 또는 mysql -u root -p를 사용하여 MySQL 프롬프트를 다시 한 번 열고 다음 명령을 실행하여 암호 유효성 검사를 다시 활성화할 수 있습니다. 요소:

  1. INSTALL COMPONENT "file://component_validate_password";

설치 프로세스는 phpMyAdmin Apache 구성 파일을 /etc/apache2/conf-enabled/ 디렉토리에 추가하고 여기서 자동으로 읽습니다. phpMyAdmin과 함께 작동하도록 Apache 및 PHP 구성을 완료하려면 자습서의 이 섹션에서 남은 유일한 작업은 mbstring PHP 확장을 명시적으로 활성화하는 것입니다. 이 작업은 다음을 입력하여 수행할 수 있습니다.

  1. sudo phpenmod mbstring

그런 다음 변경 사항을 인식하려면 Apache를 다시 시작하십시오.

  1. sudo systemctl restart apache2

이제 phpMyAdmin이 Apache와 함께 작동하도록 설치 및 구성되었습니다. 그러나 로그인하여 MySQL 데이터베이스와 상호 작용을 시작하기 전에 MySQL 사용자가 프로그램과 상호 작용하는 데 필요한 권한이 있는지 확인해야 합니다.

2단계 - 사용자 인증 및 권한 조정

phpMyAdmin을 서버에 설치하면 프로그램에 대한 특정 기본 프로세스를 수행하는 phpmyadmin이라는 데이터베이스 사용자가 자동으로 생성됩니다. 설치 중에 설정한 관리 암호를 사용하여 이 사용자로 로그인하는 대신 루트 MySQL 사용자 또는 phpMyAdmin 인터페이스를 통해 데이터베이스 관리 전용 사용자로 로그인하는 것이 좋습니다.

MySQL 루트 계정에 대한 암호 액세스 구성

MySQL 5.7(및 이후 버전)을 실행하는 Ubuntu 시스템에서 루트 MySQL 사용자는 기본적으로 비밀번호가 아닌 auth_socket 플러그인을 사용하여 인증하도록 설정됩니다. 이것은 많은 경우에 더 큰 보안과 유용성을 허용하지만 phpMyAdmin과 같은 외부 프로그램이 사용자에 액세스하도록 허용해야 하는 경우 상황을 복잡하게 만들 수도 있습니다.

루트 MySQL 사용자로 phpMyAdmin에 로그인하려면 인증 방법을 auth_socket에서 비밀번호를 사용하는 인증 방법으로 전환해야 합니다(아직 전환하지 않은 경우). 이렇게 하려면 터미널에서 MySQL 프롬프트를 엽니다.

  1. sudo mysql

다음으로 다음 명령을 사용하여 각 MySQL 사용자 계정이 사용하는 인증 방법을 확인합니다.

  1. SELECT user,authentication_string,plugin,host FROM mysql.user;
Output
+------------------+-------------------------------------------+-----------------------+-----------+ | user | authentication_string | plugin | host | +------------------+-------------------------------------------+-----------------------+-----------+ | root | | auth_socket | localhost | | mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | caching_sha2_password | localhost | | mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | caching_sha2_password | localhost | | debian-sys-maint | *8486437DE5F65ADC4A4B001CA591363B64746D4C | caching_sha2_password | localhost | | phpmyadmin | *5FD2B7524254B7F81B32873B1EA6D681503A5CA9 | caching_sha2_password | localhost | +------------------+-------------------------------------------+-----------------------+-----------+ 5 rows in set (0.00 sec)

이 예에서 루트 사용자가 실제로 auth_socket 플러그인을 사용하여 인증하는 것을 볼 수 있습니다. 암호로 인증하도록 루트 계정을 구성하려면 다음 ALTER USER 명령을 실행합니다. 암호를 원하는 강력한 암호로 변경해야 합니다.

  1. ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'password';

참고: 이전 ALTER USER 문은 루트 MySQL 사용자가 caching_sha2_password 플러그인으로 인증하도록 설정합니다. 공식 MySQL 문서에 따르면 caching_sha2_password는 MySQL이 선호하는 인증 플러그인으로 이전 버전보다 더 안전한 암호 암호화를 제공하지만 여전히 널리 사용되는 mysql_native_password입니다.

그러나 일부 PHP 버전은 caching_sha2_password와 안정적으로 작동하지 않습니다. PHP는 이 문제가 PHP 7.4에서 수정되었다고 보고했지만 나중에 phpMyAdmin에 로그인하려고 할 때 오류가 발생하면 대신 mysql_native_password로 인증하도록 루트를 설정할 수 있습니다.

  1. ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

그런 다음 각 사용자가 사용하는 인증 방법을 다시 확인하여 root가 더 이상 auth_socket 플러그인을 사용하여 인증하지 않는지 확인합니다.

  1. SELECT user,authentication_string,plugin,host FROM mysql.user;
Output
+------------------+-------------------------------------------+-----------------------+-----------+ | user | authentication_string | plugin | host | +------------------+-------------------------------------------+-----------------------+-----------+ | root | *DE06E242B88EFB1FE4B5083587C260BACB2A6158 | caching_sha2_password | localhost | | mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | caching_sha2_password | localhost | | mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | caching_sha2_password | localhost | | debian-sys-maint | *8486437DE5F65ADC4A4B001CA591363B64746D4C | caching_sha2_password | localhost | | phpmyadmin | *5FD2B7524254B7F81B32873B1EA6D681503A5CA9 | caching_sha2_password | localhost | +------------------+-------------------------------------------+-----------------------+-----------+ 5 rows in set (0.00 sec)

이 출력에서 루트 사용자가 암호를 사용하여 인증하는 것을 볼 수 있습니다. 이제 여기에서 설정한 비밀번호를 사용하여 루트 사용자로 phpMyAdmin 인터페이스에 로그인할 수 있습니다.

전용 MySQL 사용자를 위한 암호 액세스 구성

또는 일부는 전용 사용자로 phpMyAdmin에 연결하는 것이 워크플로우에 더 적합하다는 것을 알 수 있습니다. 이렇게 하려면 MySQL 셸을 다시 한 번 엽니다.

  1. sudo mysql

이전 섹션에서 설명한 대로 루트 사용자에 대해 암호 인증을 활성화한 경우 다음 명령을 실행하고 연결하라는 메시지가 표시되면 암호를 입력해야 합니다.

  1. mysql -u root -p

여기에서 새 사용자를 만들고 강력한 암호를 지정합니다.

  1. CREATE USER 'sammy'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'password';

참고: 설치한 PHP 버전에 따라 caching_sha2_password 대신 mysql_native_password로 인증하도록 새 사용자를 설정할 수 있습니다.

  1. ALTER USER 'sammy'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

그런 다음 새 사용자에게 적절한 권한을 부여하십시오. 예를 들어 다음 명령을 사용하여 데이터베이스 내의 모든 테이블에 대한 사용자 권한과 사용자 권한을 추가, 변경 및 제거할 수 있는 권한을 부여할 수 있습니다.

  1. GRANT ALL PRIVILEGES ON *.* TO 'sammy'@'localhost' WITH GRANT OPTION;

그런 다음 MySQL 셸을 종료합니다.

  1. exit

이제 /phpmyadmin 다음에 서버의 도메인 이름 또는 공용 IP 주소를 방문하여 웹 인터페이스에 액세스할 수 있습니다.

https://your_domain_or_IP/phpmyadmin

루트로 또는 방금 구성한 새 사용자 이름과 암호를 사용하여 인터페이스에 로그인합니다.

로그인하면 다음과 같은 사용자 인터페이스가 표시됩니다.

이제 phpMyAdmin에 연결하고 상호 작용할 수 있으므로 공격자로부터 시스템을 보호하기 위해 시스템 보안을 강화하기만 하면 됩니다.

3단계 - phpMyAdmin 인스턴스 보안

편재성 때문에 phpMyAdmin은 공격자에게 인기 있는 대상이며 무단 액세스를 방지하기 위해 각별히 주의해야 합니다. 이를 수행하는 한 가지 방법은 Apache의 내장 .htaccess 인증 및 권한 부여 기능을 사용하여 전체 애플리케이션 앞에 게이트웨이를 배치하는 것입니다.

이렇게 하려면 먼저 phpMyAdmin 설치의 Apache 구성 파일을 편집하여 .htaccess 파일 재정의 사용을 활성화해야 합니다.

선호하는 텍스트 편집기를 사용하여 Apache 구성 디렉토리에 있는 phpmyadmin.conf 파일을 편집하십시오. 여기서는 nano를 사용합니다.

  1. sudo nano /etc/apache2/conf-available/phpmyadmin.conf

다음과 같이 구성 파일의 섹션 내에 AllowOverride All 지시문을 추가합니다.

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

이 줄을 추가했으면 파일을 저장하고 닫습니다. nano를 사용하여 파일을 편집한 경우 CTRL + X, Y를 누른 다음 ENTER를 눌러 편집하십시오. .

변경 사항을 구현하려면 Apache를 다시 시작하십시오.

  1. sudo systemctl restart apache2

이제 응용 프로그램에 .htaccess 파일을 사용할 수 있도록 설정했으므로 보안을 실제로 구현하려면 하나를 만들어야 합니다.

이 작업이 성공하려면 응용 프로그램 디렉터리 내에 파일을 만들어야 합니다. 다음을 입력하여 필요한 파일을 만들고 루트 권한으로 텍스트 편집기에서 열 수 있습니다.

  1. sudo nano /usr/share/phpmyadmin/.htaccess

이 파일에 다음 정보를 입력합니다.

AuthType Basic
AuthName "Restricted Files"
AuthUserFile /etc/phpmyadmin/.htpasswd
Require valid-user

각 행의 의미는 다음과 같습니다.

  • AuthType Basic: 이 행은 구현 중인 인증 유형을 지정합니다. 이 유형은 암호 파일을 사용하여 암호 인증을 구현합니다.
  • AuthName: 인증 대화 상자에 대한 메시지를 설정합니다. 권한이 없는 사용자가 보호 대상에 대한 정보를 얻지 못하도록 이 일반 정보를 유지해야 합니다.
  • AuthUserFile: 인증에 사용될 암호 파일의 위치를 설정합니다. 이것은 제공되는 디렉터리 외부에 있어야 합니다. 곧 이 파일을 만들 것입니다.
  • 유효 사용자 필요: 인증된 사용자에게만 이 리소스에 대한 액세스 권한을 부여하도록 지정합니다. 이것은 승인되지 않은 사용자가 들어오는 것을 실제로 막는 것입니다.

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

비밀번호 파일로 선택한 위치는 /etc/phpmyadmin/.htpasswd입니다. 이제 이 파일을 만들고 htpasswd 유틸리티를 사용하여 초기 사용자에게 전달할 수 있습니다.

  1. sudo htpasswd -c /etc/phpmyadmin/.htpasswd username

만들고 있는 사용자의 암호를 선택하고 확인하라는 메시지가 표시됩니다. 그러면 입력한 해시 비밀번호로 파일이 생성됩니다.

추가 사용자를 입력하려면 다음과 같이 -c 플래그 없이 입력해야 합니다.

  1. sudo htpasswd /etc/phpmyadmin/.htpasswd additionaluser

그런 다음 Apache를 다시 시작하여 .htaccess 인증을 적용합니다.

  1. sudo systemctl restart apache2

이제 phpMyAdmin 하위 디렉터리에 액세스하면 방금 구성한 추가 계정 이름과 암호를 입력하라는 메시지가 표시됩니다.

https://domain_name_or_IP/phpmyadmin

Apache 인증을 입력하면 일반 phpMyAdmin 인증 페이지로 이동하여 MySQL 자격 증명을 입력합니다. 비 MySQL 자격 증명 세트를 추가하면 데이터베이스에 추가 보안 계층이 제공됩니다. 이는 phpMyAdmin이 과거에 보안 위협에 취약했기 때문에 바람직합니다.

결론

이제 phpMyAdmin이 구성되어 Ubuntu 20.04 서버에서 사용할 준비가 되었습니다. 이 인터페이스를 사용하여 데이터베이스, 사용자 및 테이블을 생성할 수 있을 뿐만 아니라 구조 및 데이터 삭제 및 수정과 같은 일반적인 작업을 수행할 수 있습니다.