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.
Để hoàn thành hướng dẫn này, bạn sẽ cần:
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.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ạ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ủ:
- sudo apt update
Bây giờ bạn có thể cài đặt phpMyAdmin bằng cách chạy lệnh sau:
- 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:
Để 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:
- 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:
- 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:
- UNINSTALL COMPONENT "file://component_validate_password";
Sau đó, bạn có thể đóng ứng dụng khách MySQL:
- exit
Sau đó thử cài đặt lại gói phpmyadmin
và nó sẽ hoạt động như mong đợi:
- 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:
- 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/
.
- 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
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.
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:
- 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:
- 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
:
- 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:
- 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:
Outputtotal 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
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
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.
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
:
- sudo nano /etc/phpmyadmin/conf.d/pma_secure.php
Sau đó thêm nội dung sau vào tệp mới:
<?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 AllowNoPassword
và AllowRoot
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:
- sudo apt install pwgen
Theo mặc định, pwge
n 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:
- 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!:
Đă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.
Ẩ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:
- 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:
Output9YHV.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:
- 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:
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:
- 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:
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:
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:
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:
- 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ệ:
Outputnginx: 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:
- 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
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.
Để 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.
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 allow
và deny
. 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:
- curl https://ipinfo.io/ip
Lệnh này sẽ trả về một địa chỉ IP, như thế này:
Output203.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:
- 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:
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:
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:
- sudo nginx -t
Đầu ra sau đây được mong đợi:
Outputnginx: 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:
- 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
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.
Đườ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:
- 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:
8000
8443
<$>[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 đó PORT
là 8000
cho HTTP hoặc 8443
cho HTTPS:
http://localhost:8000/hiddenlink
https://localhost:8443/hiddenlink
<$>[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:
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.
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.