Cài đặt và bảo mật phpMyAdmin với Nginx trên Server CentOS 7

4 năm trước
 

Cài đặt và bảo mật phpMyAdmin với Nginx trên Server CentOS 7

 

Hệ quản trị cơ sở dữ liệu quan hệ như MySQL và MariaDB cần thiết cho một phần đáng kể của các trang web và các ứng dụng. Tuy nhiên, không phải tất cả người dùng cảm thấy thoải mái quản lý dữ liệu của họ qua giao diện dòng lệnh.

Để giải quyết vấn đề này, một project được gọi là phpMyAdmin đã được tạo ra để cung cấp một sự lựa chọn thay thế bằng một giao diện quản lý dựa trên giao diện web. Trong hướng dẫn này, ta sẽ làm rõ cách cài đặt và cấu hình phpMyAdmin trên một máy chủ CentOS 7 trên một Nginx web server.

 

Yêu cầu

 

Bạn sẽ cần một server chạy CentOS 7 với:

 

Bước 1 - Cài phpMyAdmin

 

Với LEMP đã được cài đặt, ta sẽ bắt đầu cài phpMyAdmin. Thế nhưng công cụ này lại không có sẵn trong repository của CentOS 7.

Vì vậy ta cần thêm gói EPEL(Extra Packages for Enterprise Linux)  vào repository, vì nó chứa gói cài đặt của phpMyAdmin với gói  epel-release có sẵn trong repository của Centos 7.

Cài nó với lệnh sau:

sudo yum install epel-release

Sau đó cài phpMyAdmin qua lệnh yum:

sudo yum install phpmyadmin

Để Nginx có thể tìm và phục vụ file phpMyAdmin một cách chuẩn xác thì chúng ta sẽ tạo một link tượng trưng từ file cài đặt của nó đến cho thư mục gốc của Nginx:

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

Sau đó khởi động lại bộ xử lí PHP:

sudo systemctl restart php-fpm

Đến đây phpMyAdmin đã được cài đặt xong. Ta sẽ truy cập giao diện của nó trong trình duyệt web với địa chỉ sau:

http://server_domain_or_IP/phpMyAdmin

phpMyAdmin login screen

Để đăng kí, dùng một cặp username/password hợp lệ của một MariaDB user. Bạn nên sử dụng root user cùng mật khẩu của nó để đăng nhập vào trang quản trị.

phpMyAdmin admin interface

 

 

Bước 2 — Bảo mật bản cài đặt của phpMyAdmin

 

phpMyAdmin đã được cài đặt thành công trên server và đã sẵn sàng để sử dụng. Tuy nhiên, vì nó sử dụng một giao diện web qua một địa chỉ cụ thể nên có thể bị truy cập trái phép từ bên ngoài và rất dễ bị tấn công.

Ở bước này ta sẽ thêm một vài tầng bảo mật cơ bản cho nó đế sử dụng một cách an toàn.

Đổi địa chỉ truy cập

Để Nginx web server có thể tìm và phục vụ các file phpMyAdmin, ta đã tạo một đường link kết nối với phpMyAdmin. Đầu tiên ta cần thay đổi đường dẫn này.

Truy cập vào thư mục gốc của Nginx rồi thay đổi đường dẫn với các lệnh sau:

cd /usr/share/nginx/html
ls -l
-rw-r--r-- 1 root root 537 Aug 5 08:15 50x.html
-rw-r--r-- 1 root root 612 Aug 5 08:15 index.html
lrwxrwxrwx 1 root root 21 Aug 6 17:29 phpMyAdmin -> /usr/share/phpMyAdmin

Ở đây ta sẽ đổi thành /nothingtosee như sau:

sudo mv phpMyAdmin nothingtoseels -l
total 8
-rw-r--r-- 1 root root 537 Aug 5 08:15 50x.html
-rw-r--r-- 1 root root 612 Aug 5 08:15 index.html
lrwxrwxrwx 1 root root 21 Aug 6 17:29 nothingtosee -> /usr/share/phpMyAdmin

Giờ nếu truy cập địa chỉ sau, bạn sẽ gặp lỗi 404 như sau:

http://server_domain_or_IP/phpMyAdmin

phpMyAdmin 404 error

Giao diện phpMyAdmin sẽ được truy cập thông qua địa chỉ bạn đã edit:

http://server_domain_or_IP/nothingtosee

phpMyAdmin login screen

Thiết lập cổng Xác thực cho Web Server

Tiếp theo ta sẽ đặt một cổng xác thực cho các user trước khi đăng nhập vào giao diện quản trị.

Một điều may mắn là hầu hết các web server, bao gồm cả Nginx đều hỗ trợ tính năng này. Ta sẽ chỉnh sửa file cấu hình của Nginx để kích hoạt nó.

Nhưng trước hết ta cần tạo một file mật khẩu để lưu thông tin về quyền xác thực. Nginx sẽ yêu cầu mật khẩu được mã hóa sử dụng hàm crypt() .Ta sẽ sử dụng OpenSSL vì nó chứa chức năng này.

Để tạo một mật khẩu mã hóa, nhập lệnh:

openssl passwd

Bạn sẽ nhập mật khẩu , sau đó hệ thống sẽ hiển thị dạng mã hóa của nó:

O5az.RSPzd.HE

Copy giá trị này.

Giờ thì tạo file xác thực gọi là pma_pass và đặt vào mục cấu hình Nginx:

sudo nano /etc/nginx/pma_pass

Trong file này bạn sẽ xác định tên người dùng bạn muốn sử dụng sau đó là dấu (:) sau đó là mật khẩu đã được mã hóa mà bạn nhận được từ  openssl passwd .

Ta sẽ sử dụng tên người dùng là demo, nhưng bạn có thể chọn tên phức tạp hơn nếu muốn:

demo:O5az.RSPzd.HE

Lưu và đóng file khi hoàn thành.

Giờ sẽ điều chỉnh file cấu hình Nginx :

sudo nano /etc/nginx/conf.d/default.conf

Trong file này ta sẽ thêm vị trí mới cho giao diện phpMyAdmin ( ta sẽ lựa chọn /nothingtosee ).

Tạo mục này trong khối server , và vị trí ở bên dưới khối location / :

server {
. . .
location / {
try_files $uri $uri/ =404;
}location /nothingtosee {} . . .
}

Trong khối này ta sẽ thiết lập giá trị cho auth_basic để một thông báo xác thực sẽ hiển thị cho người dùng.  Và ta không nhất thiết phải thông báo cho những người dùng không xác thực mà đang được bảo vệ nên không cần phải cài đặt quá là chi tiết, ta chỉ cần sử dụng tên"Admin login". 

Sau đó dùng mục auth_basic_user_file để trỏ webserver tới file xác thực mà chúng ta đã tạo. Nginx sẽ xác nhận người dùng và kiểm tra giá trị đầu vào có hợp lệ không.

Kết quả như sau:

server {
. . .
location / {
try_files $uri $uri/ =404;
}location /nothingtosee {auth_basic "Admin Login";auth_basic_user_file /etc/nginx/pma_pass; }. . .
}

Lưu và đóng file khi hoàn thành.

Để kích hoạt cổng xác thực mới , ta cần khởi tạo lại web server :

sudo systemctl restart nginx

Giờ thì truy cập vị trí phpMyAdmin trên trình duyệt (nếu dang sử dụng phpMyAdmin rồi thì bạn cần dọn sạch bộ nhớ đệm và mở trên trình duyệt khác),sau đó xác nhận tên người dùng và mật khẩu mà bạn đã tạo trong file pma_pass :

http://server_domain_or_IP/nothingtosee

Nginx authentication page

Khi nhập nhãn quyền xong rồi thì bạn sẽ được điều hướng tới một giao diện đăng nhập phpMyAdmin. Một lớp bảo vệ bên ngoài sẽ bảo vệ MySQL để tăng tính bảo mật.

Kết luận

Giờ bạn có thể quản lý hệ cơ sở dữ liệu MySQL từ mộ giao diện web đã được bảo mật. Công cụ UI này sẽ mô phỏng hầu hết các chức năng hiện có từ nguồn lệnh của MySQL , nơi mà bạn có thể xem hệ cơ sở dữ liệu và giản đồ, thực hiện các truy vấn và tạo các cấu trúc dữ liệu mới.