Mục lục

Không có mục lục
Tham gia kênh Telegram của CloudFly để nhận thêm ưu đãi và không bỏ lỡ bất kỳ khuyến mãi nào từ CloudFly

Cách cài đặt và bảo mật phpMyAdmin với Nginx trên máy chủ Ubuntu 20.04

Ngày đăng: 28 tháng 2 năm 2023

Ubuntu

Giới thiệu

Khi phát triển một trang web hoặc ứng dụng web, nhiều người dùng cần chức năng của một hệ thống cơ sở dữ liệu như MySQL. Tuy nhiên, việc tương tác với hệ thống chỉ từ ứng dụng khách dòng lệnh MySQL yêu cầu phải làm quen với Structured Query Language (Ngôn ngữ truy vấn có cấu trúc) — thường được gọi là SQL — ngôn ngữ này có thể gây trở ngại lớn cho một số người dùng.

phpMyAdmin được tạo để cho phép người dùng tương tác với MySQL thông qua giao diện web trực quan, chạy cùng với môi trường phát triển PHP. Hướng dẫn này sẽ hướng dẫn bạn cách cài đặt phpMyAdmin trên máy chủ Nginx.

Lưu ý: phpMyAdmin chạy trên máy chủ cơ sở dữ liệu, xử lý thông tin đăng nhập cơ sở dữ liệu và cho phép người dùng thực thi các câu lệnh SQL trên cơ sở dữ liệu. Kết hợp với thực tế rằng đó là một ứng dụng PHP được triển khai rộng rãi, điều này có nghĩa là phpMyAdmin thường xuyên trở thành mục tiêu tấn công. Nếu bạn cài đặt và thiết lập cấu hình phpMyAdmin mà không thực hiện các bước thích hợp để bảo vệ nó khỏi các tác nhân độc hại, thì bạn có nguy cơ bị mất hoặc đánh cắp dữ liệu.

Ngoài việc cài đặt ứng dụng, hướng dẫn này sẽ giới thiệu một số biện pháp bạn có thể thực hiện để tăng cường bảo mật cho bản cài đặt phpMyAdmin của mình. Nó cũng sẽ giải thích chi tiết từng biện pháp để bạn có thể đưa ra quyết định sáng suốt và bảo vệ hệ thống của mình.

Điều kiện tiên quyết

Để hoàn thành hướng dẫn này, bạn sẽ cần:

  • Một máy chủ chạy Ubuntu 20.04. Máy chủ này phải có non-root user với quyền quản trị và tường lửa được thiết lập cấu hình bằng ufw. Để thiết lập điều này, hãy làm theo hướng dẫn thiết lập máy chủ ban đầu của chúng tôi cho Ubuntu 20.04.
  • LEMP stack (Linux, Nginx, MySQL và PHP) được cài đặt trên máy chủ Ubuntu 20.04 của bạn. Để cài đặt và thiết lập cấu hình các thành phần này, hãy làm theo hướng dẫn của chúng tôi về Cách cài đặt Linux, Nginx, MySQL, PHP (LEMP stack) trên Ubuntu 20.04.

Ngoài ra, vì phpMyAdmin xử lý xác thực bằng thông tin đăng nhập MySQL, chúng tôi thực sự khuyên bạn nên cài đặt chứng chỉ SSL/TLS để kích hoạt lưu lượng được mã hóa giữa máy chủ và máy khách. Nếu bạn không có miền hiện có được thiết lập cấu hình với chứng chỉ hợp lệ, hãy làm theo hướng dẫn này về cách bảo mật Nginx bằng Let's Encrypt trên Ubuntu 20.04 để thiết lập điều này.

Cảnh báo: Nếu bạn chưa cài đặt chứng chỉ SSL/TLS trên máy chủ và bạn vẫn muốn tiếp tục, vui lòng xem xét việc thực thi quyền truy cập qua SSH Tunnels như được giải thích trong Bước 5 của hướng dẫn này.

Khi bạn đã có những điều kiện tiên quyết này, bạn có thể bắt đầu làm theo Bước 1 của hướng dẫn này.

Bước 1 — Cài đặt phpMyAdmin

Bạn có thể cài đặt phpMyAdmin bằng cách sử dụng APT để tải xuống gói phpmyadmin từ kho lưu trữ mặc định của Ubuntu.

Bắt đầu bằng cách cập nhật chỉ mục gói của máy chủ:

  1. sudo apt update

Bây giờ bạn có thể cài đặt phpMyAdmin bằng cách chạy lệnh sau:

  1. sudo apt install phpmyadmin

Trong quá trình cài đặt, bạn sẽ được nhắc chọn máy chủ web (Apache hoặc Lighttpd) để thiết lập cấu hình. phpMyAdmin có thể tự động thực hiện một số thay đổi cấu hình để đảm bảo rằng nó hoạt động chính xác với một trong hai máy chủ web này khi cài đặt. Tuy nhiên, vì bạn đang sử dụng Nginx làm máy chủ web, nên bạn không nên chọn một trong hai tùy chọn này. Thay vào đó, nhấn TAB để đánh dấu <Ok> rồi nhấn ENTER để tiếp tục quá trình cài đặt.

Tiếp theo, bạn sẽ được nhắc có nên sử dụng dbconfig-common để thiết lập cấu hình cơ sở dữ liệu ứng dụng hay không. Chọn <Yes>. Thao tác này sẽ thiết lập cơ sở dữ liệu nội bộ và người dùng quản trị cho phpMyAdmin. Bạn sẽ được yêu cầu xác định mật khẩu mới cho phpmyadmin MySQL user,, nhưng vì đây không phải là mật khẩu bạn cần nhớ nên bạn có thể để trống và để phpMyAdmin tạo mật khẩu ngẫu nhiên.

Lưu ý: Giả sử bạn đã cài đặt MySQL bằng cách làm theo Bước 2 của hướng dẫn LEMP stack, bạn có thể đã quyết định bật Validate Password plugin. Khi viết bài này, việc kích hoạt thành phần này sẽ gây ra lỗi khi quá trình cài đặt phpMyAdmin cố gắng đặt mật khẩu cho phpmyadmin user:

description image

Để giải quyết vấn đề này, hãy chọn tùy chọn abort (hủy bỏ) để dừng quá trình cài đặt. Sau đó, mở lời nhắc MySQL của bạn:

  1. sudo mysql

Hoặc, nếu bạn đã bật xác thực mật khẩu cho root MySQL user, hãy chạy lệnh này rồi nhập mật khẩu của bạn khi được nhắc:

  1. mysql -u root -p

Từ dấu nhắc MySQL, hãy chạy lệnh sau để tắt thành phần Xác thực mật khẩu. Lưu ý rằng thao tác này sẽ không thực sự gỡ cài đặt nó mà chỉ ngăn thành phần được tải trên máy chủ MySQL của bạn:

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

Sau đó, bạn có thể đóng ứng dụng khách MySQL:

  1. exit

Sau đó thử cài đặt lại gói phpmyadmin và nó sẽ hoạt động như mong đợi:

  1. sudo apt install phpmyadmin

Sau khi cài đặt phpMyAdmin, bạn có thể mở lại lời nhắc MySQL bằng sudo mysql hoặc mysql -u root -p rồi chạy lệnh sau để bật lại thành phần Xác thực mật khẩu:

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

Khi lệnh apt install hoàn tất, phpMyAdmin sẽ được cài đặt đầy đủ. Tuy nhiên, để máy chủ web Nginx tìm và phục vụ chính xác các tệp phpMyAdmin, bạn sẽ cần tạo một liên kết tượng trưng từ các tệp cài đặt đến thư mục gốc tài liệu của Nginx. Nếu bạn đã làm theo hướng dẫn LEMP stack tiên quyết, gốc tài liệu cài đặt Nginx của bạn là /var/www/your_domain/.

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

Cài đặt phpMyAdmin của bạn hiện đã hoạt động. Để truy cập giao diện, hãy truy cập tên miền hoặc địa chỉ IP công cộng của máy chủ, sau đó là /phpmyadmin trong trình duyệt web của bạn:

https://server_domain_or_IP/phpmyadmin

description image

Như đã đề cập trước đây, phpMyAdmin xử lý xác thực bằng thông tin đăng nhập MySQL. Điều này có nghĩa là để đăng nhập vào phpMyAdmin, bạn sử dụng cùng tên người dùng và mật khẩu mà bạn thường sử dụng để kết nối với cơ sở dữ liệu bằng dòng lệnh hoặc bằng API. Nếu bạn cần trợ giúp tạo người dùng MySQL, hãy xem hướng dẫn này về Cách quản lý cơ sở dữ liệu SQL.

Lưu ý: Việc đăng nhập vào phpMyAdmin với tư cách là root MySQL user không được khuyến khích vì nó thể hiện rủi ro bảo mật đáng kể. Hướng dẫn này sẽ phác thảo cách vô hiệu hóa thông tin đăng nhập với tư cách là root MySQL user trong Bước 3 của hướng dẫn này.

Cài đặt phpMyAdmin của bạn hoàn toàn hoạt động vào thời điểm này. Tuy nhiên, bằng cách cài đặt giao diện web, bạn đã đưa máy chủ cơ sở dữ liệu MySQL của mình ra thế giới bên ngoài. Do tính phổ biến của phpMyAdmin và khả năng nó cung cấp quyền truy cập vào một lượng lớn dữ liệu nhạy cảm, các cài đặt như thế này là mục tiêu phổ biến cho các cuộc tấn công. Trong các phần tiếp theo của hướng dẫn này, chúng tôi sẽ giới thiệu một vài phương pháp khác nhau để bạn có thể cài đặt phpMyAdmin an toàn hơn.

Bước 2 — Thay đổi vị trí mặc định của phpMyAdmin

Một cách để bảo vệ cài đặt phpMyAdmin của bạn là làm cho nó khó tìm hơn. Các bot sẽ quét các đường dẫn phổ biến, như /phpmyadmin, /pma, /admin, /mysql và các tên tương tự khác. Việc thay đổi URL của giao diện từ /phpmyadmin thành một thứ gì đó không chuẩn sẽ khiến các tập lệnh tự động khó tìm thấy bản cài đặt phpMyAdmin của bạn hơn và thực hiện các cuộc tấn công vũ phu.

Ở bước trước, bạn đã tạo một liên kết tượng trưng trong thư mục gốc của tài liệu web Nginx trỏ đến /usr/share/phpmyadmin, nơi đặt các tệp ứng dụng phpMyAdmin thực tế. Bạn có thể đổi tên liên kết tượng trưng này để thay đổi URL giao diện của phpMyAdmin.

Để thực hiện việc này, hãy điều hướng đến thư mục gốc của tài liệu Nginx:

  1. cd /var/www/your_domain/

Sau đó chạy lệnh ls sau để liệt kê các tệp trong thư mục gốc của tài liệu để hiểu rõ hơn về thay đổi mà bạn sẽ thực hiện. Lệnh này bao gồm tùy chọn -l, cho biết lệnh sử dụng định dạng “danh sách dài”. Điều này sẽ hướng dẫn ls trả về nhiều thông tin hơn so với cách khác:

  1. ls -l

Đầu ra của bạn sẽ chứa một dòng như sau:

Output
. . . lrwxrwxrwx 1 root root 22 Jan 15 21:09 phpmyadmin -> /usr/share/phpmyadmin/ . . .

Dòng này chỉ ra rằng bạn có một liên kết tượng trưng có tên phpmyadmin trong thư mục này. Bạn có thể thay đổi tên liên kết này thành bất kỳ tên nào bạn thích và làm như vậy sẽ thay đổi URL nơi bạn có thể truy cập phpMyAdmin. Điều này sẽ giúp che khuất điểm cuối khỏi các bot thực hiện tìm kiếm tự động các tên điểm cuối phổ biến.

Chọn một tên ẩn mục đích của điểm cuối. Hướng dẫn này sẽ đặt tên cho điểm cuối /hiddenlink và sử dụng tên này trong các ví dụ xuyên suốt, nhưng bạn nên chọn một tên thay thế.

Đổi tên liên kết tượng trưng bằng lệnh mv:

  1. sudo mv phpmyadmin hiddenlink

Sau khi chạy lệnh này, hãy chạy lại lệnh ls -l để xác nhận rằng liên kết tượng trưng đã được đổi tên chính xác:

  1. ls -l

Lần này, đầu ra sẽ chỉ ra rằng danh sách cho liên kết tượng trưng đã được cập nhật với tên mới:

Output
total 8 . . . lrwxrwxrwx 1 root root 22 Jan 15 21:09 hiddenlink -> /usr/share/phpmyadmin/ . . .

Bây giờ khi bạn truy cập URL mà trước đây bạn đã sử dụng để truy cập phpMyAdmin, bạn sẽ gặp lỗi 404:

https://server_domain_or_IP/phpmyadmin

description image

Thay vào đó, bạn có thể truy cập giao diện phpMyAdmin của mình tại URL mới mà bạn vừa thiết lập cấu hình:

https://server_domain_or_IP/hiddenlink

description image

Bằng cách che khuất vị trí thực của phpMyAdmin trên máy chủ, bạn đang bảo vệ giao diện của nó khỏi các lần quét tự động và các nỗ lực dùng vũ lực thủ công.

Bước 3 — Vô hiệu hóa đăng nhập gốc

Trên MySQL, cũng như trong các hệ thống Linux thông thường, tài khoản root là một tài khoản quản trị đặc biệt với quyền truy cập không hạn chế vào hệ thống. Ngoài việc là một tài khoản đặc quyền, đó còn là một tên đăng nhập đã biết, khiến nó trở thành mục tiêu rõ ràng cho các cuộc tấn công vũ phu. Để giảm thiểu những rủi ro này, bước này sẽ phác thảo cách thiết lập cấu hình phpMyAdmin để từ chối mọi nỗ lực đăng nhập đến từ root MySQL user. Bằng cách này, ngay cả khi bạn cung cấp thông tin đăng nhập hợp lệ cho người dùng gốc, bạn vẫn sẽ nhận được lỗi Access denied! và sẽ không được phép đăng nhập.

Vì bạn đã chọn dbconfig-common để thiết lập cấu hình và lưu trữ cài đặt phpMyAdmin, nên cấu hình mặc định của ứng dụng hiện được lưu trữ trong cơ sở dữ liệu MySQL của bạn. Bạn sẽ cần tạo một tệp config.inc.php mới trong thư mục cấu hình của phpMyAdmin để xác định cài đặt tùy chỉnh của mình. Mặc dù các tập lệnh PHP của phpMyAdmin được đặt bên trong thư mục /usr/share/phpmyadmin, các tệp cấu hình của ứng dụng được đặt trong /etc/phpmyadmin.

Tạo một tệp cài đặt tùy chỉnh mới bên trong thư mục /etc/phpmyadmin/conf.d và đặt tên là pma_secure.php:

  1. sudo nano /etc/phpmyadmin/conf.d/pma_secure.php

Sau đó thêm nội dung sau vào tệp mới:

/etc/phpmyadmin/conf.d/pma_secure.php
<?php

# PhpMyAdmin Settings
# This should be set to a random string of at least 32 chars
$cfg['blowfish_secret'] = 'CHANGE_THIS_TO_A_STRING_OF_32_RANDOM_CHARACTERS';

$i=0;
$i++;

$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['AllowNoPassword'] = false;
$cfg['Servers'][$i]['AllowRoot'] = false;

?>

Bằng cách bao gồm các lệnh AllowNoPasswordAllowRoot và đặt cả hai thành false, tệp cấu hình này sẽ lần lượt vô hiệu hóa thông tin đăng nhập không cần mật khẩu và thông tin đăng nhập của root MySQL user.

Lưu ý rằng cài đặt auth_type thiết lập cấu hình phpMyAdmin để sử dụng phương thức xác thực cookie. phpMyAdmin sử dụng phương thức xác thực cookie theo mặc định, cho phép bạn đăng nhập vào phpMyAdmin với tư cách là bất kỳ người dùng MySQL hợp lệ nào với sự trợ giúp của cookie. Với phương pháp này, mật khẩu MySQL user được lưu trữ và mã hóa bằng thuật toán Advanced Encryption Standard (Tiêu chuẩn mã hóa nâng cao - AES) trong một cookie tạm thời.

Trước đây, phpMyAdmin thay vì sử dụng thuật toán Blowfish cho mục đích này. Tuy nhiên, nó vẫn tìm kiếm một lệnh có tên blowfish_secret, trỏ đến cụm mật khẩu được thuật toán AES sử dụng nội bộ. Đây không phải là cụm mật khẩu mà bạn cần nhớ, vì vậy bất kỳ chuỗi nào chứa 32 ký tự ngẫu nhiên sẽ hoạt động ở đây.

Cập nhật dòng có nội dung 'CHANGE_THIS_TO_A_STRING_OF_32_RANDOM_CHARACTERS' thành chuỗi ngẫu nhiên chứa ít nhất 32 ký tự.

Lưu ý: Nếu cụm mật khẩu bạn nhập ở đây ngắn hơn 32 ký tự, điều đó sẽ dẫn đến việc các cookie được mã hóa kém an toàn hơn. Tuy nhiên, việc nhập một chuỗi dài hơn 32 ký tự sẽ không gây hại gì.

Để tạo một chuỗi ký tự thực sự ngẫu nhiên, bạn có thể cài đặt và sử dụng chương trình pwgen với APT:

  1. sudo apt install pwgen

Theo mặc định, pwgen tạo mật khẩu dễ phát âm, mặc dù kém an toàn hơn. Tuy nhiên, bằng cách bao gồm cờ -s, như trong lệnh sau, bạn có thể tạo một mật khẩu hoàn toàn ngẫu nhiên, khó nhớ. Lưu ý hai đối số cuối cùng của lệnh này: 32, cho biết thời lượng chuỗi mật khẩu pwgen sẽ tạo; và 1 cho biết pwgen sẽ tạo ra bao nhiêu chuỗi:

  1. pwgen -s 32 1

Sao chép đầu ra kết quả của lệnh này và thêm nó vào tệp pma_secure.php, thay thế 'CHANGE_THIS_TO_A_STRING_OF_32_RANDOM_CHARACTERS'.

Lưu và đóng tệp khi bạn chỉnh sửa xong. Nếu bạn đã sử dụng nano, hãy làm như vậy bằng cách nhấn CTRL + X, Y để xác nhận các thay đổi, rồi ENTER để quay lại dấu nhắc bash.

Các thay đổi sẽ được áp dụng tự động. Nếu bạn tải lại trang đăng nhập ngay bây giờ và cố gắng đăng nhập với quyền root, bạn sẽ nhận được thông báo lỗi Access denied!:

description image

Đăng nhập bởi root MySQL user hiện bị cấm khi cài đặt phpMyAdmin của bạn. Biện pháp bảo mật này sẽ chặn các tập lệnh brute-force cố gắng đoán mật khẩu của root database user trên máy chủ của bạn. Hơn nữa, nó sẽ thực thi việc sử dụng các tài khoản MySQL ít đặc quyền hơn để truy cập giao diện web của phpMyAdmin, bản thân nó là một biện pháp bảo mật quan trọng.

Bước 4 — Tạo Cổng xác thực

Ẩn cài đặt phpMyAdmin của bạn ở một vị trí bất thường có thể tránh được một số bot tự động quét mạng, nhưng nó vô dụng trước các cuộc tấn công có chủ đích. Để bảo vệ tốt hơn một ứng dụng web có quyền truy cập bị hạn chế, thông thường sẽ hiệu quả hơn nếu ngăn chặn những kẻ tấn công trước khi chúng có thể tiếp cận ứng dụng. Bằng cách này, họ sẽ không thể sử dụng các khai thác chung và tấn công vũ phu để đoán thông tin đăng nhập truy cập.

Trong trường hợp cụ thể của phpMyAdmin, điều quan trọng hơn là phải khóa giao diện đăng nhập. Bằng cách giữ cho nó mở ra với thế giới, bạn đang cung cấp một nền tảng mạnh mẽ để những kẻ tấn công đoán thông tin đăng nhập cơ sở dữ liệu của bạn.

Bước này phác thảo cách thêm một lớp xác thực bổ sung vào cài đặt phpMyAdmin của bạn để tăng tính bảo mật cho cơ sở dữ liệu MySQL của bạn. Hầu hết các máy chủ web, bao gồm cả Nginx, đều cung cấp khả năng này nguyên bản. Bằng cách hoàn thành bước này, bất kỳ ai cố gắng truy cập vào màn hình đăng nhập cài đặt phpMyAdmin của bạn trước tiên sẽ được yêu cầu chuyển qua lời nhắc xác thực HTTP bằng cách nhập tên người dùng và mật khẩu hợp lệ.

Để thiết lập điều này, trước tiên bạn cần tạo một tệp mật khẩu để lưu trữ thông tin đăng nhập xác thực. Nginx yêu cầu mật khẩu phải được mã hóa bằng hàm crypt(). Bộ OpenSSL, được cài đặt mặc định trên máy chủ Ubuntu của bạn, bao gồm chức năng này.

Để tạo mật khẩu được mã hóa, hãy nhập:

  1. openssl passwd

Bạn sẽ được nhắc nhập và xác nhận mật khẩu mà bạn muốn sử dụng. Sau đó, tiện ích sẽ hiển thị một phiên bản mã hóa của mật khẩu trông giống như sau:

Output
9YHV.p60.Cg6I

Sao chép giá trị này, vì bạn sẽ cần đưa nó vào tệp xác thực mà bạn sắp tạo.

Bây giờ, hãy tạo một tệp xác thực. Với mục đích của hướng dẫn này, chúng ta sẽ gọi tệp này là pma_pass và đặt nó vào thư mục cấu hình Nginx:

  1. sudo nano /etc/nginx/pma_pass

Trong tệp này, hãy chỉ định tên người dùng bạn muốn sử dụng, theo sau là dấu hai chấm (:) và sau đó là phiên bản mã hóa của mật khẩu mà bạn nhận được từ tiện ích openssl passwd.

Trong ví dụ này, người dùng được đặt tên là sammy, nhưng bạn có thể chọn bất kỳ tên người dùng nào bạn muốn. Đây không cần phải là tên của hồ sơ người dùng hiện có trên máy chủ Ubuntu của bạn hoặc của người dùng MySQL.

Sau khi thêm tên người dùng đã chọn và mật khẩu được mã hóa mà bạn đã sao chép trước đó, tệp sẽ trông như thế này:

/etc/nginx/pma_pass
sammy:9YHV.p60.Cg6I

Lưu và đóng tệp khi hoàn tất.

Tiếp theo, bạn sẽ cần sửa đổi tệp cấu hình Nginx. Một lần nữa, hướng dẫn này tuân theo các quy ước được thiết lập trong hướng dẫn LEMP tiên quyết, vì vậy tệp cấu hình được sử dụng trong các ví dụ sau là /etc/nginx/sites-available/your_domain. Đảm bảo rằng bạn sử dụng tệp cấu hình Nginx có liên quan cho vị trí web nơi cài đặt phpMyAdmin của bạn hiện được lưu trữ.

Mở tệp cấu hình Nginx của bạn trong trình soạn thảo văn bản ưa thích của bạn để bắt đầu:

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

Xác định vị trí khối server và phần location / bên trong khối đó. Bạn cần tạo một phần location mới bên dưới khối location / này để khớp với đường dẫn hiện tại của phpMyAdmin trên máy chủ.

Nhớ lại rằng trong Bước 2 của hướng dẫn này, bạn đã thay đổi tên của vị trí của phpMyAdmin bằng cách đổi tên liên kết tượng trưng (hiddenlink trong ví dụ của chúng tôi). Tại đây, bạn cần nhập tên bạn đã sử dụng cho liên kết tượng trưng này. Bạn không cần bao gồm đường dẫn tệp đầy đủ, chỉ cần tên của liên kết tượng trưng liên quan đến thư mục gốc của tài liệu Nginx:

/etc/nginx/sites-available/your_domain
server {
        . . .

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

        location ^~ /hiddenlink {

        }

        . . .
}

Trong khối này, hãy thiết lập hai lệnh: auth_basic, xác định thông báo sẽ được hiển thị trên lời nhắc xác thực và auth_basic_user_file, trỏ đến tệp xác thực bạn vừa tạo. Thêm cả hai chỉ thị này vào phần location mới:

/etc/nginx/sites-available/your_domain
server {
        . . .
        location / {
                try_files $uri $uri/ =404;
        }

        location ^~ /hiddenlink {
                auth_basic "Admin Login";
                auth_basic_user_file /etc/nginx/pma_pass;
        }
        . . .
}

Cuối cùng, lưu ý rằng khối này có bộ chọn ^~ trước định nghĩa vị trí mới. Điều này là để đảm bảo Nginx sẽ không bỏ qua các quy tắc truy cập của bạn khi nó phù hợp với quy tắc cho các tệp PHP, thường được định nghĩa là một biểu thức chính quy để bắt tất cả các tệp .php. Trong các tệp cấu hình Nginx, các định nghĩa biểu thức chính quy có mức độ ưu tiên cao hơn các định nghĩa vị trí tiêu chuẩn. Điều này có nghĩa là nếu chúng ta không sử dụng bộ chọn ^~ ở đầu vị trí, user vẫn có thể bỏ qua lời nhắc xác thực bằng cách điều hướng đến http://server_domain_or_ip/hiddenlink/index.php trong trình duyệt của họ.

Bộ chọn ^~ ở đầu định nghĩa vị trí yêu cầu Nginx bỏ qua các kết quả khớp khác khi nó tìm thấy kết quả khớp cho vị trí này. Điều này có nghĩa là mọi thư mục con hoặc tệp trong /hiddenlink/ sẽ phù hợp với quy tắc này. Tuy nhiên, vì định nghĩa để phân tích các tệp PHP sẽ bị bỏ qua do việc sử dụng bộ chọn ^~, nên chúng ta sẽ cần bao gồm một khối vị trí PHP mới bên trong định nghĩa /hiddenlink. Điều này sẽ đảm bảo các tệp PHP bên trong vị trí này được phân tích cú pháp chính xác; nếu không chúng sẽ được gửi tới trình duyệt dưới dạng nội dung tải xuống.

Thêm các dòng được đánh dấu sau vào khối location bạn vừa thêm:

/etc/nginx/sites-available/your_domain
server {
        . . .

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

        location ^~ /hiddenlink/ {
                auth_basic "Admin Login";
                auth_basic_user_file /etc/nginx/pma_pass;

                location ~ \.php$ {
                        include snippets/fastcgi-php.conf;
                        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
                }
        }
    . . .
}

Hãy nhớ thay thế hiddenlink bằng đường dẫn thực nơi có thể tìm thấy phpMyAdmin. Bạn cũng nên kiểm tra kỹ vị trí của tệp ổ cắm PHP-FPM, tệp này sẽ khác nhau tùy thuộc vào phiên bản PHP bạn hiện đã cài đặt. Trong ví dụ này, chúng tôi sử dụng php7.4-fpm.sock hợp lệ cho PHP 7.4, phiên bản được cài đặt trên Ubuntu 20.04 thông qua kho lưu trữ APT mặc định.

Lưu và đóng tệp khi bạn hoàn tất. Để kiểm tra xem tệp cấu hình có hợp lệ hay không, hãy chạy lệnh sau:

  1. sudo nginx -t

Đầu ra sau đây chỉ ra rằng cú pháp của tệp cấu hình là hợp lệ:

Output
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful

Để kích hoạt cổng xác thực mới, hãy tải lại Nginx:

  1. sudo systemctl reload nginx

Bây giờ khi bạn truy cập URL phpMyAdmin trong trình duyệt web của mình, bạn sẽ được nhắc nhập tên người dùng và mật khẩu mà bạn đã thêm vào tệp pma_pass:

https://server_domain_or_IP/hiddenlink

description image Khi bạn nhập thông tin đăng nhập của mình, bạn sẽ được đưa đến trang đăng nhập phpMyAdmin tiêu chuẩn.

<$>[note] Lưu ý: Dấu nhắc xác thực có thể không xuất hiện nếu gần đây bạn đã truy cập phpMyAdmin. Để buộc lời nhắc xuất hiện, bạn có thể phải làm mới trang, xóa bộ nhớ cache hoặc mở một phiên trình duyệt khác. <$>

Ngoài việc cung cấp thêm một lớp bảo mật, cổng này sẽ giúp giữ cho nhật ký MySQL của bạn sạch khỏi các nỗ lực xác thực spam.

Bước 5 — Thiết lập quyền truy cập qua đường hầm được mã hóa

Để tăng cường bảo mật, chỉ có thể khóa cài đặt phpMyAdmin của bạn đối với các máy chủ được ủy quyền. Bạn có thể giới hạn quyền truy cập vào phpMyAdmin bằng cách chỉ định các máy chủ được ủy quyền riêng lẻ trong tệp cấu hình Nginx của bạn. Bằng cách này, mọi yêu cầu đến từ một địa chỉ IP không có trong danh sách sẽ bị từ chối.

Mặc dù chỉ riêng tính năng này có thể là đủ trong một số trường hợp sử dụng, nhưng nó không phải lúc nào cũng là giải pháp lâu dài tốt nhất, chủ yếu là do hầu hết mọi người không truy cập Internet từ các địa chỉ IP tĩnh. Ngay khi bạn nhận được địa chỉ IP mới từ nhà cung cấp internet, bạn sẽ không thể truy cập giao diện phpMyAdmin cho đến khi bạn cập nhật tệp cấu hình Nginx bằng địa chỉ IP mới của mình.

Để có giải pháp lâu dài mạnh mẽ hơn, bạn có thể sử dụng kiểm soát truy cập dựa trên IP để tạo thiết lập trong đó người dùng sẽ chỉ có quyền truy cập vào giao diện phpMyAdmin của bạn nếu họ đang truy cập từ địa chỉ IP được ủy quyền hoặc máy chủ cục bộ thông qua đường hầm SSH. Chúng tôi sẽ giới thiệu cách thiết lập cả hai điều khiển truy cập này trong các phần bên dưới.

Kết hợp kiểm soát truy cập dựa trên IP với đường hầm SSH giúp tăng cường bảo mật đáng kể vì nó chặn hoàn toàn quyền truy cập đến từ internet công cộng (ngoại trừ IP được ủy quyền), ngoài việc cung cấp một kênh an toàn giữa người dùng và máy chủ thông qua việc sử dụng các đường hầm được mã hóa.

Thiết lập kiểm soát truy cập dựa trên IP trên Nginx

Trên Nginx, kiểm soát truy cập dựa trên IP có thể được xác định trong khối location tương ứng của một trang web nhất định, bằng cách sử dụng các lệnh allowdeny. Ví dụ: nếu bạn chỉ muốn cho phép các yêu cầu đến từ một máy chủ nhất định, bạn sẽ bao gồm hai dòng sau, theo thứ tự này, bên trong khối location có liên quan cho trang web mà bạn muốn bảo vệ:

allow hostname_or_IP;
deny all;

Bạn có thể cho phép bao nhiêu máy chủ tùy thích và bạn chỉ cần bao gồm một dòng allow cho mỗi máy chủ/IP được ủy quyền bên trong khối location tương ứng cho trang web mà bạn đang bảo vệ. Các lệnh sẽ được đánh giá theo thứ tự giống như chúng được liệt kê cho đến khi tìm thấy kết quả phù hợp hoặc yêu cầu cuối cùng bị từ chối do chỉ thị deny all.

Trong bước này, bạn sẽ thiết lập cấu hình Nginx để chỉ cho phép các yêu cầu đến từ máy chủ cục bộ hoặc địa chỉ IP hiện tại của bạn. Trước tiên, bạn cần biết địa chỉ IP công cộng hiện tại mà máy cục bộ của bạn đang sử dụng để kết nối với internet. Có nhiều cách khác nhau để có được thông tin này; để đơn giản, hướng dẫn này sẽ sử dụng dịch vụ do ipinfo.io cung cấp. Bạn có thể mở URL https://ipinfo.io/ip trong trình duyệt của mình hoặc chạy lệnh sau từ máy cục bộ của mình:

  1. curl https://ipinfo.io/ip

Lệnh này sẽ trả về một địa chỉ IP, như thế này:

Output
203.0.113.0

Giá trị được trả về bởi lệnh này là địa chỉ IP công cộng hiện tại của máy cục bộ của bạn. Bạn sẽ thiết lập cấu hình khối location của phpMyAdmin để chỉ cho phép các yêu cầu đến từ IP đó hoặc cục bộ từ chính máy chủ.

Để thực hiện việc này, một lần nữa hãy mở tệp cấu hình Nginx của trang web bằng trình soạn thảo văn bản ưa thích của bạn:

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

Vì bạn đã có quy tắc truy cập trong cấu hình hiện tại của mình, nên bạn cần kết hợp quy tắc đó với kiểm soát truy cập dựa trên IP bằng cách sử dụng lệnh satisfy all. Bằng cách này, bạn có thể giữ lời nhắc xác thực HTTP hiện tại để tăng cường bảo mật.

Thêm các dòng được đánh dấu sau vào khối location cấu hình phpMyAdmin của bạn:

/etc/nginx/sites-available/your_domain
server {
        . . .

        location ^~ /hiddenlink/ {
                satisfy all; #requires both conditions
        
                allow 203.0.113.0; #allow your IP
                allow 127.0.0.1; #allow localhost via SSH tunnels
                deny all; #deny all other sources

                auth_basic "Admin Login";
                auth_basic_user_file /etc/nginx/pma_pass;

                location ~ \.php$ {
                        include snippets/fastcgi-php.conf;
                        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
                }
        }

        . . .
}

Đây là giao diện của tệp sau khi thêm các chỉ thị mới này. Hãy nhớ thay thế hiddenlink bằng đường dẫn thực nơi có thể tìm thấy phpMyAdmin và địa chỉ IP được đánh dấu bằng địa chỉ IP công cộng hiện tại của máy cục bộ của bạn:

/etc/nginx/sites-available/your_domain
server {
        . . .

        location ^~ /hiddenlink/ {
                satisfy all; #requires both conditions
        
                allow 203.0.113.0; #allow your IP
                allow 127.0.0.1; #allow localhost via SSH tunnels
                deny all; #deny all other sources

                auth_basic "Admin Login";
                auth_basic_user_file /etc/nginx/pma_pass;

                location ~ \.php$ {
                        include snippets/fastcgi-php.conf;
                        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
                }
        }

        . . .
}

Lưu và đóng tệp khi bạn hoàn tất. Để kiểm tra xem tệp cấu hình có hợp lệ hay không, bạn có thể chạy:

  1. sudo nginx -t

Đầu ra sau đây được mong đợi:

Output
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful

Bây giờ hãy tải lại máy chủ web để các thay đổi có hiệu lực:

  1. sudo systemctl reload nginx

Vì địa chỉ IP của bạn được liệt kê rõ ràng là máy chủ được ủy quyền nên quyền truy cập của bạn sẽ không bị quấy rầy. Tuy nhiên, bất kỳ ai khác đang cố truy cập vào bản cài đặt phpMyAdmin của bạn sẽ gặp lỗi 403 Forbidden:

https://server_domain_or_IP/hiddenlink

description image

Phần phụ tiếp theo của hướng dẫn này sẽ cung cấp chi tiết về cách sử dụng đường hầm SSH để truy cập máy chủ web thông qua các yêu cầu cục bộ. Bằng cách này, bạn vẫn có thể truy cập vào giao diện của phpMyAdmin ngay cả khi địa chỉ IP của bạn thay đổi.

Truy cập phpMyAdmin thông qua đường hầm được mã hóa

Đường hầm SSH hoạt động như một cách chuyển hướng lưu lượng mạng thông qua các kênh được mã hóa. Bằng cách chạy lệnh ssh tương tự như lệnh bạn sẽ sử dụng để đăng nhập vào máy chủ, bạn có thể tạo một “đường hầm” an toàn giữa máy cục bộ của mình và máy chủ đó. Sau khi thiết lập một đường hầm, tất cả lưu lượng truy cập vào một cổng cục bộ nhất định có thể được chuyển hướng qua đường hầm được mã hóa, sử dụng máy chủ từ xa làm proxy trước khi tiếp cận với internet. Điều này tương tự như những gì xảy ra khi bạn sử dụng mạng riêng ảo (VPN), nhưng đường hầm SSH thường yêu cầu ít cấu hình hơn để thiết lập.

Bạn có thể sử dụng đường hầm SSH để ủy quyền các yêu cầu của mình tới máy chủ web từ xa đang chạy phpMyAdmin. Bằng cách tạo một đường hầm giữa máy cục bộ của bạn và máy chủ nơi cài đặt phpMyAdmin, bạn có thể chuyển hướng các yêu cầu cục bộ đến máy chủ web từ xa. Quan trọng hơn, lưu lượng truy cập sẽ được mã hóa và các yêu cầu sẽ đến Nginx như thể chúng đến từ máy chủ cục bộ. Bằng cách này, bất kể bạn đang kết nối từ địa chỉ IP nào, bạn sẽ có thể truy cập giao diện của phpMyAdmin một cách an toàn.

Vì lưu lượng giữa máy cục bộ của bạn và máy chủ web từ xa sẽ được mã hóa nên đây là giải pháp thay thế an toàn cho những trường hợp bạn không thể cài đặt chứng chỉ SSL/TLS trên máy chủ web đang chạy phpMyAdmin.

Từ máy cục bộ của bạn, hãy chạy lệnh này bất cứ khi nào bạn cần truy cập vào phpMyAdmin:

  1. ssh user@server_domain_or_IP -L 8000:localhost:80 -L 8443:localhost:443 -N

Hãy kiểm tra từng phần của lệnh:

  • user*: hồ sơ người dùng Ubuntu để kết nối với máy chủ nơi phpMyAdmin đang chạy
  • server_domain_or_IP: Máy chủ SSH nơi phpMyAdmin đang chạy
  • -L 8000:localhost:80 chuyển hướng lưu lượng HTTP trên cổng 8000
  • -L 8443:localhost:443 chuyển hướng lưu lượng HTTPS trên cổng 8443
  • -N: ngăn chặn việc thực hiện các lệnh từ xa

<$>[note] Lưu ý: Lệnh này sẽ chặn thiết bị đầu cuối cho đến khi bạn ngắt nó bằng cách nhấn CTRL+C, trong trường hợp đó, lệnh này sẽ kết thúc kết nối SSH và dừng chuyển hướng gói. Nếu bạn muốn chạy lệnh này ở chế độ nền, bạn có thể bao gồm tùy chọn SSH -f. <$>

Bây giờ, hãy truy cập trình duyệt của bạn và thay thế server_domain_or_IP bằng localhost:PORT, trong đó PORT8000 cho HTTP hoặc 8443 cho HTTPS:

http://localhost:8000/hiddenlink
https://localhost:8443/hiddenlink

description image

<$>[note] Lưu ý: Nếu đang truy cập phpMyAdmin qua HTTPS, bạn có thể nhận được thông báo cảnh báo đặt câu hỏi về tính bảo mật của chứng chỉ SSL. Điều này xảy ra vì tên miền bạn đang sử dụng (localhost) không khớp với địa chỉ đã đăng ký trong chứng chỉ (tức là miền mà phpMyAdmin đang thực sự được phục vụ). Hãy yên tâm rằng nó là an toàn để tiếp tục.

Ngoài ra, hãy lưu ý rằng bạn có thể cần làm mới phiên trình duyệt của mình hoặc kiểm tra kỹ URL nếu bạn đã thiết lập bất kỳ chuyển hướng nào trong tệp cấu hình Nginx của mình. <$>

Tất cả các yêu cầu trên localhost:8000 (HTTP) và localhost:8443 (HTTPS) hiện đang được chuyển hướng qua một đường hầm an toàn tới ứng dụng phpMyAdmin từ xa của bạn. Bạn không chỉ tăng cường bảo mật bằng cách vô hiệu hóa quyền truy cập công khai vào phpMyAdmin của mình, mà bạn còn bảo vệ tất cả lưu lượng giữa máy tính cục bộ của mình và máy chủ từ xa bằng cách sử dụng đường hầm được mã hóa để gửi và nhận dữ liệu.

Nếu bạn muốn thực thi việc sử dụng đường hầm SSH cho bất kỳ ai muốn truy cập vào giao diện phpMyAdmin của bạn (bao gồm cả bạn), bạn có thể làm điều đó bằng cách xóa mọi IP được ủy quyền khác khỏi tệp cấu hình Nginx, để lại 127.0.0.1 làm máy chủ lưu trữ duy nhất được phép truy cập vào vị trí đó. Vì không ai có thể thực hiện các yêu cầu trực tiếp tới phpMyAdmin, nên việc xóa xác thực HTTP để đơn giản hóa thiết lập của bạn là an toàn. Đây là cách tệp cấu hình của bạn trông như thế nào trong một tình huống như vậy:

/etc/nginx/sites-available/your_domain
server {
        . . .
       
        location ^~ /hiddenlink/ {      
                allow 127.0.0.1; #allow localhost via SSH tunnels
                deny all; #deny all other sources

                location ~ \.php$ {
                        include snippets/fastcgi-php.conf;
                        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
                }
        }

        . . .
}

Khi bạn tải lại cấu hình của Nginx với sudo systemctl reload nginx, cài đặt phpMyAdmin của bạn sẽ bị khóa và người dùng sẽ được yêu cầu sử dụng đường hầm SSH để truy cập giao diện của phpMyAdmin thông qua các yêu cầu được chuyển hướng.

Kết luận

Bằng cách làm theo hướng dẫn này, bạn đã cài đặt phpMyAdmin trên Ubuntu 20.04 chạy Nginx làm máy chủ web. Bạn cũng đã tìm hiểu về một số phương pháp nâng cao để bảo mật cài đặt phpMyAdmin trên Ubuntu, chẳng hạn như vô hiệu hóa đăng nhập gốc, tạo lớp xác thực bổ sung và sử dụng đường hầm SSH để truy cập cài đặt phpMyAdmin chỉ thông qua các yêu cầu cục bộ.

Sau khi hoàn thành hướng dẫn này, bạn có thể quản lý cơ sở dữ liệu MySQL của mình từ một giao diện web tương đối an toàn. Giao diện người dùng này hiển thị hầu hết các chức năng có sẵn thông qua dòng lệnh MySQL. Bạn có thể duyệt qua cơ sở dữ liệu và lược đồ, thực hiện các truy vấn cũng như tạo các tập dữ liệu và cấu trúc mới.

Nếu bạn muốn tìm hiểu thêm về cách làm việc với MySQL, chúng tôi khuyên bạn nên xem phần giới thiệu về truy vấn trong MySQL này. Để hiểu sâu hơn về SQL ngoài các truy vấn đơn thuần, bạn cũng có thể quan tâm đến loạt bài hướng dẫn Cách sử dụng SQL của chúng tôi.

Tham gia kênh Telegram của CloudFly để nhận thêm ưu đãi và không bỏ lỡ bất kỳ khuyến mãi nào từ CloudFly
Chia sẻ

0 câu trả lời