hướng dẫn cài và bảo mật phpMyAdmin với Apache trên Ubuntu server 20.04
Giới thiệu
Khi phát triển một trang web, có lúc chúng ta cần sử dụng cơ sở dữ liệu như MariaDB (hoặc MySQL). Tuy nhiên, việc tương tác với hệ thống bằng dòng lệnh MariaDB yêu cầu bạn phải quen với SQL - có thể gây trở ngại lớn cho chúng ta.
phpMyAdmin được tạo ra để cho phép người dùng tương tác với MariaDB (hoặc MySQL) thông qua giao diện web. Hướng dẫn này sẽ hướng dẫn bạn cách cài đặt phpMyAdmin trên máy chủ Apache. Cũng có thể cài phpMyAdmin trên Nginx, tuy nhiên, ở đây mình đang sử dụng Nginx là Reverse Proxy và Apache làm máy chủ chính nên mình sẽ cài phpMyAdmin trên Apache.
Lưu ý: phpMyAdmin chạy trên máy chủ cơ sở dữ liệu, xử lý thông tin đăng nhập 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. Nó 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 là mục tiêu bị tấn công. Nếu bạn cài đặt phpMyAdmin mà không thực hiện bảo mật, bạn có nguy cơ bị mất hoặc đánh cắp dữ liệu của mình.
Ngoài việc hướng dẫn cài đặt, bài này sẽ trình bày một số biện pháp bạn có thể thực hiện để tăng cường bảo mật cho cài đặt phpMyAdmin của mình.
Yêu cầu
Trong bài viết này, chúng ta sẽ cài đặt phpMyAdmin trên máy chủ Ubuntu 20.04LTS đã cài đặt theo "Hướng dẫn cài đặt Ubuntu Server 20.04". Trên máy chủ đã "cài đặt Apache, PHP và MariaDB" và "cài đặt Nginx".
Tiến hành cài đặt
Bước 1: cài đặt phpMyAdmin
Cập nhập gói mới nhất
sudo apt update
sudo apt upgrade
Theo thông tin từ trang chủ của phpMyAdmin thì chúng ta nên cài thêm một số gói để kích hoạt một số chức năng cần thiết và cải thiện hiệu suất.
php-mbstring: mô-đun quản lý các chuỗi không phải ASCII và chuyển đổi các chuỗi thành các mã hóa khác nhau
php-zip: Phần mở rộng này hỗ trợ tải .zip lên.
php-gd: Bật hỗ trợ cho thư viện đồ họa GD.
php-json: Cung cấp PHP hỗ trợ tuần tự hóa JSON
php-curl: Cho phép PHP tương tác với các loại máy chủ khác nhau bằng các cổng khác nhau
Cài đặt phpMyAdmin bằng lệnh
sudo apt install phpmyadmin php-mbstring php-zip php-gd php-json php-curl
Trong quá trình cài đặt, bạn sẽ được nhắc chọn một máy chủ web (Apache hoặc Lighttpd) để cấu hình, chọn Apache (nhấn phím space để chọn). 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 các máy chủ web này khi cài đặt.
Tiếp theo, bạn sẽ được nhắc có sử dụng dbconfig-common để cấu hình cơ sở dữ liệu hay không. Chọn
phpMyAdmin sẽ tự tạo ra tài khoản phpmyadmin với mật khẩu bạn chọn. Nhập vào mật khẩu.
Khi cài đặt hoàn tất, phpMyAdmin sẽ được cài đặt đầy đủ. Tuy nhiên, để máy chủ web Apache tìm và phục vụ các tệp phpMyAdmin một cách chính xác, bạn cần tạo một liên kết tượng trưng từ các tệp cài đặt phpMyAdmin đến thư mục gốc tài liệu của Apache.
Hiện thư mục gốc Apache của mình đang cấu hình ở /var/www/html, thực hiện lệnh để tạo liên kết
sudo ln -s /usr/share/phpmyadmin /var/www/html
Giờ bạn hãy thử truy cập phpMyAdmin qua trình duyệt web https://your_server_IP/phpmyadmin
Nếu thấy trang đăng nhập thế này là được rồi đó.
Bước 2: Điều chỉnh phương thức xác thực và đặt quyền
Khi bạn cài đặt phpMyAdmin vào máy chủ của mình, nó sẽ tự động tạo ra một tài khoản có tên là phpmyadmin để thực hiện các quy trình cơ bản nhất định cho chương trình. Tài khoản này thường được dùng chuyên để nâng cấp, cập nhập phpMyAdmin, vì vậy chúng ta không nên sử dụng đến.
Vì vậy, thay vì đăng nhập với tài khoản này, bạn nên đăng nhập với tư cách là người dùng root của mình hoặc với tài khoản khác chuyên quản lý database thông qua giao diện phpMyAdmin.
Định cấu hình quyền truy cập mật khẩu cho tài khoản root của MariaDB
Như đã đề cập ở bài "Hướng dẫn cài đặt LAMP": "Trên hệ thống Ubuntu chạy MariaDB 10.3, tài khoản root của MariaDB được xác thực bằng cách sử dụng plugin unix_socket chứ không phải bằng mật khẩu. Điều này cho phép một số bảo mật và khả năng sử dụng tốt hơn, nhưng nó cũng có thể làm phức tạp mọi thứ khi bạn cần cho phép một chương trình bên ngoài (ví dụ: phpMyAdmin)."
Do đó, để đăng nhập vào phpMyAdmin với tài khoản root, bạn sẽ cần chuyển phương thức xác thực của nó từ auth_socket sang sử dụng mật khẩu. Tuy nhiên, chúng ta nên để tránh trường hợp có thể xảy ra lỗi sau này, tài khoản root cứ để phương thức xác thực bằng plugin unix_socket. Chúng ta sẽ tạo tài khoản mới với phương thức xác thực password và có đủ quyền hạn như root. Tài khoản này sẽ sử dụng riêng cho phpmyadmin thông qua trình duyệt web
sudo mariadb
Kiểm tra phương thức xác thực hiện tại
SELECT user,authentication_string,plugin,host FROM mysql.user;
Như hình trên, phương thức xác thực hiện tại của tài khoản root là plugin unix_socket. Chúng ta sẽ tạo tài khoản mới, tên là admin (tùy ý bạn) với phương thức xác thực password.
GRANT ALL ON *.* TO 'admin'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;
# xóa các đặc quyền
FLUSH PRIVILEGES;
OK. Vậy là xong, thoát khỏi MariaDB
exit
Giờ bạn có thể truy cập trình duyệt web và đăng nhập với tài khoản admin và password vừa tạo.
Bước 3: Bảo mật phiên bản phpMyAdmin
Do khá là phổ biến nên phpMyAdmin thường là mục tiêu của những kẻ tấn công và bạn nên cẩn thận hơn để ngăn chặn truy cập trái phép. Một cách để thực hiện việc này là đặt một cổng vào trước khi truy cập vào phpmyadmin bằng cách sử dụng các .htaccess chức năng xác thực và ủy quyền tích hợp của Apache. Ý nghĩa như thế này, khi người dùng truy cập vào địa chỉ https://your_server_IP/phpmyadmin thì thay vì vào thẳng trang đăng nhập của phpmyadmin, sẽ có 1 thông báo hiện ra yêu cầu nhập tài khoản và mật khẩu. Tài khoản và mật khẩu này đúng thì sẽ hiện ra trang đăng nhập, còn sai thì sẽ không hiện ra thông báo gì.
Để thực hiện việc này, trước tiên bạn phải cho phép sử dụng .htaccess trong Apache. Copy file config mẫu của phpMyAdmin với Apache
sudo cp /etc/phpmyadmin/apache.conf /etc/apache2/conf-available/phpmyadmin.conf
sửa file
sudo nano /etc/apache2/conf-available/phpmyadmin.conf
và chèn thêm dòng "AllowOverride All" vào sau "DirectoryIndex index.php", giống như dưới đây
<Directory /usr/share/phpmyadmin>
Options SymLinksIfOwnerMatch
DirectoryIndex index.php
AllowOverride All
Kích hoạt cấu hình
sudo a2enconf phpmyadmin
#kiểm tra xem có lỗi trong cấu hình mới không
sudo apache2 -t
#không có lỗi khởi động lại Apache
sudo systemctl restart apache2
Bây giờ bạn đã cho phép sử dụng .htaccess cho phpmyadmin, bạn cần tạo một tệp để thực sự triển khai một số bảo mật.
sudo nano /usr/share/phpmyadmin/.htaccess
Trong file này, chèn nội dung sau
AuthType Basic
AuthName "Restricted Files"
AuthUserFile /etc/phpmyadmin/.htpasswd
Require valid-user
Trong đó:
AuthType Basic: Chỉ định kiểu xác thực mà bạn đang triển khai. Loại này sẽ triển khai xác thực mật khẩu bằng tệp mật khẩu.
AuthName: Tạo thông báo cho hộp thoại xác thực. Nên giữ điều này chung chung để người dùng trái phép sẽ không nhận được bất kỳ thông tin nào về những gì đang được bảo vệ.
AuthUserFile: Vị trí của tệp mật khẩu sẽ được sử dụng để xác thực. File này phải nằm ngoài các thư mục đang được phục vụ.
Require valid-user: Chỉ định chỉ những người dùng đã được xác thực mới được cấp quyền truy cập vào tài nguyên. Đây là những gì thực sự ngăn người dùng trái phép xâm nhập.
Sau đó lưu vào đóng lại.
Tiếp theo, chúng ta sẽ chọn tệp mật khẩu , mình chọn lưu ở "/etc/phpmyadmin/.htpasswd", chúng ta làm như sau, trong đó username là tên bạn muốn dùng
sudo htpasswd -c /etc/phpmyadmin/.htpasswd username
Bạn sẽ được nhắc chọn và xác nhận mật khẩu cho người dùng bạn đang tạo. Sau đó, tệp được tạo bằng mật khẩu băm mà bạn đã nhập.
Khởi động lại apache
sudo systemctl restart apache2
Giờ bạn thử truy cập lại trang phpMyAdmin, nếu hiện như hình dưới đây là đã thành công rồi đó
sudo htpasswd /etc/phpmyadmin/.htpasswd additionaluser
Kết luận
Bây giờ chúng ta đã cấu hình phpMyAdmin và sẵn sàng sử dụng trên máy chủ Ubuntu 20.04 của mình. Sử dụng phpMyAdmin trên web, có thể dễ dàng tạo database, người dùng và bảng cũng như thực hiện các thao tác thông thường như xóa và sửa đổi cấu trúc và dữ liệu.
Bonus:
- Đổi xác thực tài khoản root về xác thực bằng mật khẩu. Hiện tại, tài khoản root hiện tại xác thực bằng cách sử dụng plugin auth_socket, Để cấu hình xác thực bằng mật khẩu, hãy chạy lệnh sau:
ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password;
Thêm mật khẩu cho tài khoản root, trong đó "password" là mật khẩu mà bạn chọn:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'password';
- Đổi đường dẫn thư mục phpmyadmin.
Đây cũng là một cách tránh người khác truy cập trái phép vào phpMyAdmin. Thay vì https://your_server_IP/phpmyadmin thì sẽ là https://your_server_IP/hiddenlink, trong đó hiddenlink bạn có thể tùy chỉnh.
sudo mv phpmyadmin hiddenlink