Hướng dẫn cài đặt và bảo mật phpMyAdmin với Nginx trên CentOS 7

1 năm trước

 

Giới thiệu

Các hệ thống quản lý cơ sở dữ liệu liên quan như là My SQL, MariaDB là một trong những phần rất quan trọng của Website và các ứng dụng của nó. Tuy nhiên không phải bất cứ người dùng nào cũng đều cảm thấy thoải mái khi phải quản lý dữ liệu của nó bằng dòng lệnh.

Chính vì thế, một dự án có tên là phpMyAdmin đã đưa ra một giải pháp mà có thể thao tác dưới dạng một giao diện quản lý dựa trên nền tảng web . Trong phần này chúng tôi sẽ hướng dẫn cho bạn cách cài đặt cũng như bảo mật cấu hình phpMyAdmin trên CentOS 7.Ta sẽ cài trên Nginx webserver vì nginx có khả năng xử lý lưu lượng dữ liệu lớn hơn rất nhiều các web server khác.

 

Yêu cầu căn bản

Thiết lập cấu hình server ban đầu CentOS 7 ( bạn có thể tham khảo cách thiết lập server ban đầu trên CentOS 7 trên vicloud.vn ) và một tài khoản người dùng sudo để quản lý lệnh.

Thứ hai là cài đặt gói  LEMP stack (Linux, Nginx, MariaDB, and PHP) trên CentOS 7 (tham khảo cách cài đặt trên vicloud.vn). Ta sẽ dùng platform này để phục vụ giao diện phpMyAdmin (MariaDB cũng là một phần mềm quản lý cơ sở dữ liệu mà chúng ta muốn ). 

Sau khi cài xong thì tiếp tục các bước tiếp theo.

 

Bước 1 - Cài phpMyAdmin

Với platform LEMP đã được cài rồi thì ta sẽ bắt đầu cài phpMyAdmin. Thế nhưng công cụ này lại không có sẵn trong kho lưu trữ của CentOS 7.

Thế nên ta cần thêm gói EPEL(Extra Packages for Enterprise Linux)  vào trong kho lưu trữ vì nó chứa gói phpMyAdmin.

Nhưng may thay là việc thêm kho lưu trữ này đã trở lên dễ dàng hơn bao giờ hết vì có một gói gọi là  epel-release sẽ cấu hình trình quản lý gói để sử dụng kho lưu trữ EPEL :

sudo yum install epel-release

Giờ sẽ truy cập kho lưu trữ  EPEL và cài phpMyAdmin thông qua lệnh yum:

sudo yum install phpmyadmin

Để Nginx có thể tìm và kết nối với 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  cho danh mục tài liệu gốc Nginx:

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

Khởi động lại bộ xử lý PHP để nạp các modun PHP mà ta đã cài đặt:

sudo systemctl restart php-fpm

Với thao tác đó thì công cụ phpMyAdmin giờ đã đi vào hoạt động. Để truy cập giao diện , ta truy cập tên miền hoặc địa chỉ IP của server kèm theo  /phpMyAdmin trên trình duyệt:

http://server_domain_or_IP/phpMyAdmin

phpMyAdmin login screen

To sign in, use a username/password pair of a valid MariaDB user. The root user and the MariaDB administrative password is a good choice to get started. You will then be able to access the administrative interface: Để đăng ký thì ta sẽ sử dụng tên người dùng và mật khẩu của người dùng MariaDB,người dùng root và mật khẩu quản trị của Maria DB sẽ là một lựa chọn khá hay để truy cập giao diện quản trị của nó.

phpMyAdmin admin interface

Click vài đường cơ bản để làm quen dần , rồi sau đó ta sẽ tiếp tục các bước tiếp theo để bảo mật hệ thống.

 

Bước 2 - Bảo mật phpMyAdmin

Thế là phpMyAdmin tính tới thời điểm này đã gần như cài đặt xong. Tuy nhiên, trong quá trình cài giao diện web chúng ta đã vô tình để lộ dữ liệu MySQL ra bên ngoài.

Thậm chí cả với màn hình xác thực cũng có thể gây ra rắc rối. Vì mật độ dữ liệu của phpMyAdmin sẽ được kết hợp với một lượng lớn dữ liệu mà nó cung cấp, thế nên việc cài đặt chẳng khác nào mở đường cho tin tặc tấn công vào hệ thống.

Ta sẽ sử dụng hai chiến lược căn bản để giảm tối đa khả năng bị tấn công và làm tổn hại hệ thống trong quá trình cài đặt. Ta sẽ thay đổi vị trí từ /phpMyAdmin thành một vị trí khác để đánh lạc hướng khả năng tấn công vét cạn tự động của tin tặc. Ta cũng sẽ tạo thêm một cổng xác thực web server cần được thông qua trước khi đăng nhập vào giao diện phpMyAdmin.

 Đổi vị trí truy cập ứng dụng

Để Nginx web server có thể tìm và phục vụ các file phpMyAdmin, ta sẽ tạo một đường link tượng trưng từ mục phpMyAdmin .

Để thay đổi URL , vị trí truy cập giao diện phpMyAdmin , chúng ta cần đổi tên của link tượng trưng đó. Chuyển tới mục tài liệu gốc của Nginx là cách tốt nhất:

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

Bạn có thể thấy link tượng trưng đó được gọi là phpMyAdmin , ta có thể đổi thành bất kỳ tên nào ta muốn, nó sẽ đổi luôn vị trí truy cập phpMyAdmin trên trình duyệt để sẽ che khuất điểm truy cập từ các chương trình mã hóa cứng.

Trong phần này ta sẽ đặt tên vị trí truy cập là /nothingtosee:

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

Nên lúc này nếu bạn truy cập với địa chỉ cũ phpMyAdmin thì sẽ báo lỗi 404 .

http://server_domain_or_IP/phpMyAdmin

phpMyAdmin 404 error

Và nó sẽ chỉ hoạt động với tên mới bạn vừa tạo:

http://server_domain_or_IP/nothingtosee

phpMyAdmin login screen

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

Mục đích là để người dùng xác thực trước khi đăng nhập truy cập vào giao diện phpMyAdmin.

May thay là hầu hết các web server đều cung cấp công cụ này một cách thuần túy bao gồm cả Nginx. Thế nên ta chỉ cần điều chỉnh file cấu hình Nginx một chút là xong.

Nhưng trước hết ta cần tạo một file mật khẩu để lưu nhãn 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 thì 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 và paste vào file xác thực mà bạn đang tạo.

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.

Để thai thác 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 bộ và cấu trúc dữ liệu mới.