Mặc dù nhiều người dùng cần đến chức năng của hệ quản trị cơ sở dữ liệu như MySQL nhưng có thể họ không thoải mái khi tương tác với hệ thống chỉ thông qua dòng lệnh MySQL. phpMyAdmin được tạo ra nhằm hỗ trợ người dùng tương tác với MySQL thông qua giao diện web.
Trong hướng dẫn này, chúng ta sẽ cài đặt phpMyAdmin trên Ubuntu để có thể sử dụng một cách an toàn trong việc quản lý cơ sở dữ liệu trên hệ thống Ubuntu.
Cách cài đặt và bảo mật phpMyAdmin trên Ubuntu:
- Cài đặt phpMyAdmin
- Điều chỉnh xác thực người dùng và phân quyền
- Bảo mật phiên bản phpMyAdmin của bạn
Yêu cầu trước khi bắt đầu
Để hoàn tất hướng dẫn này, bạn cần có:
- Một máy chủ Ubuntu. Máy chủ này cần có một người dùng không phải root nhưng có quyền quản trị, cùng với tường lửa được cấu hình bằng
ufw
. Để thiết lập, bạn có thể tham khảo hướng dẫn thiết lập máy chủ ban đầu cho Ubuntu. - Một môi trường LAMP (Linux, Apache, MySQL và PHP) đã được cài đặt trên máy chủ Ubuntu. Nếu bạn chưa thực hiện bước này, có thể tham khảo hướng dẫn cài đặt LAMP stack trên Ubuntu.
Ngoài ra, cần lưu ý các vấn đề bảo mật quan trọng khi sử dụng phần mềm như phpMyAdmin vì nó:
- Giao tiếp trực tiếp với cài đặt MySQL của bạn
- Xử lý xác thực bằng thông tin đăng nhập MySQL
- Thực thi và trả về kết quả của bất kỳ truy vấn SQL nào do người dùng nhập vào.
Vì những lý do trên, và cũng vì đây là một ứng dụng PHP phổ biến thường xuyên trở thành mục tiêu của các cuộc tấn công, nên bạn tuyệt đối không nên chạy phpMyAdmin trên các hệ thống từ xa qua kết nối HTTP không mã hóa.
Nếu bạn chưa có tên miền được cấu hình với chứng chỉ SSL/TLS, bạn có thể tham khảo hướng dẫn bảo mật Apache bằng Let’s Encrypt trên Ubuntu. Quá trình này yêu cầu bạn đăng ký tên miền, tạo bản ghi DNS cho máy chủ, và thiết lập Virtual Host cho Apache.
Bước 1: Cài đặt phpMyAdmin
Bạn có thể sử dụng APT để cài đặt phpMyAdmin từ kho phần mềm mặc định của Ubuntu.
Với quyền sudo của người dùng không phải root, bạn hãy cập nhật chỉ mục gói của máy chủ nếu chưa làm gần đây:
sudo apt update
Tiếp theo, bạn có thể cài đặt gói phpmyadmin
. Bên cạnh gói này, tài liệu chính thức cũng khuyến nghị bạn nên cài đặt thêm một số tiện ích mở rộng PHP trên máy chủ để kích hoạt các tính năng bổ sung và cải thiện hiệu suất.
Nếu bạn đã làm theo hướng dẫn thiết lập LAMP stack ở bước trước, một số mô-đun này có thể đã được cài đặt kèm theo gói php
. Tuy nhiên, vẫn nên cài đặt thêm các gói sau:
php-mbstring
: mô-đun hỗ trợ xử lý chuỗi không thuộc bảng mã ASCII và chuyển đổi giữa các bảng mã khác nhauphp-zip
: hỗ trợ tải các tập tin.zip
lên trong phpMyAdminphp-gd
: cung cấp hỗ trợ cho thư viện đồ họa GDphp-json
: hỗ trợ chức năng tuần tự hóa JSON trong PHPphp-curl
: cho phép PHP giao tiếp với nhiều loại máy chủ khác nhau thông qua các giao thức khác nhau
Chạy lệnh sau để cài đặt các gói cần thiết vào hệ thống. Trong quá trình cài đặt, bạn sẽ được yêu cầu đưa ra một số lựa chọn để cấu hình phpMyAdmin cho phù hợp. Chúng tôi sẽ hướng dẫn chi tiết từng lựa chọn ngay sau đây.
sudo apt install phpmyadmin php-mbstring php-zip php-gd php-json php-curl
Dưới đây là một số mục bạn cần lựa chọn trong quá trình cài đặt để cấu hình phpMyAdmin đúng cách:
- Đối với lựa chọn máy chủ, chọn
apache2
Cảnh báo: Khi hộp thoại xuất hiện, “apache2” sẽ được tô sáng nhưng chưa được chọn. Nếu bạn không nhấn phím SPACE
để đánh dấu Apache, trình cài đặt sẽ không di chuyển các tập tin cần thiết trong quá trình cài đặt. Hãy nhấn SPACE
, sau đó TAB
, rồi ENTER
để chọn Apache.
- Chọn
Yes
khi được hỏi là có muốn sử dụngdbconfig-common
để thiết lập cơ sở dữ liệu hay không. - Sau đó, cần nhập và xác nhận mật khẩu ứng dụng MySQL cho phpMyAdmin.
Lưu ý: Nếu bạn đã cài đặt MySQL theo Bước 2 trong hướng dẫn thiết lập LAMP stack ở phần yêu cầu, bạn có thể đã kích hoạt plugin Validate Password. Tính đến thời điểm hiện tại, nếu bật thành phần này sẽ gây lỗi khi bạn cố gắng đặt mật khẩu cho người dùng phpmyadmin
:
Lỗi xác thực mật khẩu của phpMyAdmin
Để khắc phục, hãy chọn tùy chọn abort để hủy quá trình cài đặt. Sau đó, mở dòng lệnh MySQL:
sudo mysql
Hoặc, nếu bạn đã bật xác thực bằng mật khẩu cho người dùng root
của MySQL, hãy chạy lệnh sau và nhập mật khẩu khi được yêu cầu:
mysql -u root -p
Tại dấu nhắc, chạy lệnh sau để vô hiệu hóa thành phần Validate Password. Lưu ý, lệnh này sẽ không gỡ cài đặt thành phần, mà chỉ ngăn không cho nó được tải khi khởi động MySQL:
UNINSTALL COMPONENT "file://component_validate_password";
Sau đó, thoát khỏi trình khách MySQL:
exit
Tiếp theo, thử cài đặt lại gói phpmyadmin
và quá trình sẽ diễn ra bình thường:
sudo apt install phpmyadmin
Sau khi cài đặt hoàn tất phpMyAdmin, bạn có thể mở lại dòng lệnh MySQL bằng sudo mysql
hoặc mysql -u root -p
, rồi chạy lệnh sau để kích hoạt lại thành phần Validate Password:
INSTALL COMPONENT "file://component_validate_password";
Quá trình cài đặt sẽ thêm tệp cấu hình Apache của phpMyAdmin vào thư mục /etc/apache2/conf-enabled/
, tại đây, Apache sẽ tự động đọc cấu hình.
Để hoàn tất cấu hình Apache và PHP cho phpMyAdmin, bước cuối cùng trong phần này là kích hoạt phần mở rộng mbstring
của PHP một cách rõ ràng. Bạn có thể thực hiện điều này bằng lệnh sau:
sudo phpenmod mbstring
Sau đó, khởi động lại Apache để áp dụng các thay đổi:
sudo systemctl restart apache2
phpMyAdmin hiện đã được cài đặt và cấu hình để hoạt động với Apache. Tuy nhiên, trước khi đăng nhập và bắt đầu tương tác với cơ sở dữ liệu MySQL, bạn cần đảm bảo cấp đủ quyền sử dụng chương trình cho người dùng MySQL.
Bước 2: Điều chỉnh xác thực người dùng và phân quyền
Khi bạn cài đặt phpMyAdmin trên máy chủ, chương trình sẽ tự động tạo một người dùng cơ sở dữ liệu có tên là phpmyadmin
, dùng để thực hiện một số quy trình chạy nền trong chương trình. Tuy nhiên, thay vì đăng nhập bằng tài khoản này cùng với mật khẩu quản trị mà bạn đã thiết lập trong quá trình cài đặt, bạn nên đăng nhập bằng tài khoản root
của MySQL hoặc một tài khoản chuyên dùng để quản lý cơ sở dữ liệu thông qua giao diện phpMyAdmin.
Cấu hình xác thực bằng mật khẩu cho tài khoản root của MySQL
Trên các hệ thống Ubuntu sử dụng MySQL 5.7 trở lên, theo cấu hình mặc định, người dùng root
của MySQL xác thực thông qua plugin auth_socket
thay vì sử dụng mật khẩu. Cách thiết lập này giúp tăng cường bảo mật và nâng cao khả năng sử dụng trong nhiều tình huống, nhưng lại gây trở ngại khi bạn muốn cho phép một ứng dụng bên ngoài, chẳng hạn như phpMyAdmin, truy cập vào tài khoản này.
Để có thể đăng nhập vào phpMyAdmin bằng tài khoản người dùng root
của MySQL, bạn cần chuyển phương thức xác thực của tài khoản này từ auth_socket
sang phương thức sử dụng mật khẩu (nếu bạn chưa thực hiện trước đó). Đầu tiên, mở dấu nhắc MySQL từ terminal:
sudo mysql
Tiếp theo, kiểm tra phương thức xác thực của từng tài khoản người dùng MySQL bằng lệnh:
SELECT user,authentication_string,plugin,host FROM mysql.user;
Kết quả ví dụ:
+------------------+------------------------------------------------------------------------+-----------------------+-----------+
| user | authentication_string | plugin | host |
+------------------+------------------------------------------------------------------------+-----------------------+-----------+
| debian-sys-maint | $A$005$I:jOry?]Sy<|qhQRj3fBRQ43i4UJxrpm.IaT6lOHkgveJjmeIjJrRe6 | caching_sha2_password | localhost |
| mysql.infoschema | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | caching_sha2_password | localhost |
| mysql.session | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | caching_sha2_password | localhost |
| mysql.sys | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | caching_sha2_password | localhost |
| phpmyadmin | $A$005$?#{Z?`gN!c2az)}V-INCWXSuVdqB9zWteH1IkZfTe/rOLgVhSzEMM9R3G6K9 | caching_sha2_password | localhost |
| root | | auth_socket | localhost |
+------------------+------------------------------------------------------------------------+-----------------------+-----------+
Ví dụ trên cho thấy người dùng root
đang sử dụng plugin auth_socket
để xác thực. Để cấu hình tài khoản root
xác thực bằng mật khẩu, bạn hãy chạy lệnh ALTER USER
sau. Sau đó thay password
bằng một mật khẩu mạnh do bạn tự chọn:
ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'password';
Lưu ý: Lệnh trên thiết lập người dùng root
sử dụng plugin caching_sha2_password
. Theo tài liệu chính thức của MySQL, đây là plugin xác thực được ưu tiên vì cung cấp cơ chế mã hóa mật khẩu an toàn hơn so với plugin cũ nhưng vẫn phổ biến là mysql_native_password
.
Tuy nhiên, một số phiên bản PHP không hoàn toàn tương thích với caching_sha2_password
. PHP đã báo cáo rằng vấn đề này được khắc phục từ phiên bản 7.4 trở đi. Nếu bạn gặp lỗi khi đăng nhập vào phpMyAdmin, có thể cấu hình người dùng root
sử dụng mysql_native_password
thay thế như sau:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
Sau đó, kiểm tra lại phương thức xác thực của các tài khoản người dùng để đảm bảo root
không còn sử dụng auth_socket
:
SELECT user,authentication_string,plugin,host FROM mysql.user;
Kết quả ví dụ:
+------------------+------------------------------------------------------------------------+-----------------------+-----------+
| user | authentication_string | plugin | host |
+------------------+------------------------------------------------------------------------+-----------------------+-----------+
| debian-sys-maint | $A$005$I:jOry?]Sy<|qhQRj3fBRQ43i4UJxrpm.IaT6lOHkgveJjmeIjJrRe6 | caching_sha2_password | localhost |
| mysql.infoschema | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | caching_sha2_password | localhost |
| mysql.session | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | caching_sha2_password | localhost |
| mysql.sys | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | caching_sha2_password | localhost |
| phpmyadmin | $A$005$?#{Z?`gN!c2az)}V-INCWXSuVdqB9zWteH1IkZfTe/rOLgVhSzEMM9R3G6K9 | caching_sha2_password | localhost |
| root | $A$005$3y…|Z?'_[} ZyVHuESVwNmjKWOH/ndETwS.Kty0IH7UfiXjOfVvyWroy4a. | caching_sha2_password | localhost |
+------------------+------------------------------------------------------------------------+-----------------------+-----------+
Kết quả này cho thấy người dùng root
hiện đang xác thực bằng mật khẩu. Giờ đây bạn có thể đăng nhập vào giao diện phpMyAdmin bằng tài khoản root
và mật khẩu vừa thiết lập.
Cấu hình xác thực bằng mật khẩu cho một người dùng MySQL chuyên biệt
Ngoài ra, để phù hợp hơn với một số quy trình làm việc, một số người dùng có thể lựa chọn kết nối phpMyAdmin thông qua một tài khoản riêng. Để tạo tài khoản này, bạn hãy mở lại dòng lệnh MySQL:
sudo mysql
Nếu bạn đã kích hoạt xác thực mật khẩu cho người dùng root
như hướng dẫn ở phần trước, hãy sử dụng lệnh sau và nhập mật khẩu khi được yêu cầu:
mysql -u root -p
Sau đó, tạo một người dùng mới và thiết lập một mật khẩu mạnh:
CREATE USER 'sammy'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'password';
Lưu ý: Tùy vào phiên bản PHP mà bạn đang sử dụng, bạn có thể chuyển phương thức xác thực của người dùng mới từ caching_sha2_password
sang mysql_native_password
:
ALTER USER 'sammy'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
Tiếp theo, cấp quyền phù hợp cho người dùng mới. Ví dụ, bạn có thể cấp quyền truy cập toàn bộ bảng trong cơ sở dữ liệu, cũng như quyền thêm, thay đổi và xóa quyền người dùng bằng lệnh sau:
GRANT ALL PRIVILEGES ON *.* TO 'sammy'@'localhost' WITH GRANT OPTION;
Sau đó, thoát khỏi dòng lệnh MySQL:
exit
Giờ đây, bạn có thể truy cập giao diện web bằng cách truy cập tên miền hoặc địa chỉ IP công khai của máy chủ, theo sau là /phpmyadmin
:
https://your_domain_or_IP/phpmyadmin
Màn hình đăng nhập phpMyAdmin
Đăng nhập vào giao diện, sử dụng tài khoản root
hoặc tài khoản mới và mật khẩu mà bạn vừa cấu hình.
Khi đăng nhập, bạn sẽ được chuyển đến giao diện người dùng của phpMyAdmin:
Giao diện người dùng phpMyAdmin
Bây giờ, khi đã có thể kết nối và làm việc với phpMyAdmin, bước tiếp theo là tăng cường bảo mật hệ thống nhằm bảo vệ khỏi các cuộc tấn công từ bên ngoài.
Bước 3: Bảo mật phpMyAdmin
Với mức độ phổ biến cao, phpMyAdmin thường trở thành mục tiêu của các cuộc tấn công, vì vậy bạn nên áp dụng thêm các biện pháp bảo vệ nhằm ngăn chặn truy cập trái phép. Một phương pháp hiệu quả là thiết lập lớp xác thực trung gian cho toàn bộ ứng dụng bằng cơ chế xác thực .htaccess
do Apache cung cấp.
Để triển khai giải pháp này, trước tiên chúng ta cần bật quyền ghi đè bằng tệp .htaccess
thông qua việc chỉnh sửa tệp cấu hình Apache dành cho phpMyAdmin.
Sử dụng trình soạn thảo văn bản để chỉnh sửa tệp phpmyadmin.conf
nằm trong thư mục cấu hình của Apache. Ở đây, chúng tôi sử dụng nano
:
sudo nano /etc/apache2/conf-available/phpmyadmin.conf
Thêm dòng AllowOverride All
vào bên trong phần <Directory /usr/share/phpmyadmin>
trong tệp cấu hình, như sau:
<Directory /usr/share/phpmyadmin>
Options SymLinksIfOwnerMatch
DirectoryIndex index.php
AllowOverride All
...
Sau khi thêm dòng này, lưu và đóng tệp. Nếu bạn sử dụng nano
, hãy nhấn CTRL + X
, sau đó Y
, rồi ENTER
để xác nhận lưu.
Để áp dụng thay đổi, khởi động lại Apache:
sudo systemctl restart apache2
Giờ bạn đã bật hỗ trợ tệp .htaccess
cho ứng dụng, bước tiếp theo là tạo tệp .htaccess
để triển khai cơ chế bảo mật.
Để thành công, tệp này phải được tạo trong thư mục ứng dụng. Bạn có thể tạo và mở tệp với quyền root bằng lệnh sau:
sudo nano /usr/share/phpmyadmin/.htaccess
Trong tệp này, nhập nội dung sau:
AuthType Basic
AuthName "Restricted Files"
AuthUserFile /etc/phpmyadmin/.htpasswd
Require valid-user
Giải thích các dòng cấu hình:
AuthType Basic
: Chỉ định kiểu xác thực sử dụng. Ở đây là xác thực bằng mật khẩu qua tệp lưu trữ.AuthName
: Tin nhắn hiển thị trong hộp thoại đăng nhập. Nên để chung chung để không tiết lộ thông tin về hệ thống.AuthUserFile
: Đường dẫn đến tệp mật khẩu sẽ được sử dụng cho quá trình xác thực và nên được đặt bên ngoài các thư mục mà Apache có thể phục vụ nội dung. Chúng ta sẽ tiến hành tạo tệp này ngay sau đây.Require valid-user
: Chỉ người dùng đã xác thực mới được truy cập tài nguyên này. Đây là dòng ngăn chặn truy cập trái phép.
Sau khi hoàn tất, lưu và đóng tệp.
Vị trí bạn chỉ định cho tệp mật khẩu là /etc/phpmyadmin/.htpasswd
. Bạn có thể tạo tệp này và thêm người dùng đầu tiên bằng tiện ích htpasswd
:
sudo htpasswd -c /etc/phpmyadmin/.htpasswd username
Bạn sẽ được yêu cầu nhập và xác nhận mật khẩu cho người dùng vừa tạo. Sau đó, tệp sẽ được tạo với mật khẩu đã mã hóa.
Nếu muốn thêm người dùng khác, hãy sử dụng lệnh htpasswd
mà không có tham số -c
, như sau:
sudo htpasswd /etc/phpmyadmin/.htpasswd additionaluser
Khởi động lại Apache để áp dụng xác thực .htaccess
:
sudo systemctl restart apache2
Giờ đây, khi truy cập thư mục con phpMyAdmin, bạn sẽ được yêu cầu nhập tên người dùng và mật khẩu mà bạn vừa cấu hình:
https://domain_name_or_IP/phpmyadmin
Màn hình xác thực apache của phpMyAdmin
Sau khi vượt qua lớp xác thực Apache, bạn sẽ được chuyển đến trang đăng nhập phpMyAdmin thông thường để nhập thông tin đăng nhập MySQL. Việc thêm một lớp xác thực không liên quan đến MySQL giúp tăng cường bảo mật cho cơ sở dữ liệu. Điều này đặc biệt cần thiết vì trước đây phpMyAdmin từng tồn tại nhiều lỗ hổng bảo mật.
Kết luận
Hiện tại bạn đã có một phiên bản phpMyAdmin được cấu hình hoàn chỉnh và đã đủ điều kiện để sử dụng trên máy chủ Ubuntu. Thông qua giao diện này, bạn có thể tạo cơ sở dữ liệu, người dùng, bảng, cũng như thực hiện các thao tác thường dùng như chỉnh sửa, xóa dữ liệu và cấu trúc.