Hướng dẫn này giải thích cách bảo vệ bằng mật khẩu các thư mục web (với người dùng từ cơ sở dữ liệu MySQL) bằng mod_authn_dbd trên Apache2 trên máy chủ Debian 8 (Jessie). Đây là giải pháp thay thế cho các tệp mật khẩu dạng văn bản thuần túy do mod_auth cung cấp và cho phép bạn sử dụng cú pháp SQL thông thường để tạo/sửa đổi xóa người dùng. Bạn cũng có thể cấu hình mod_authn_dbdđể xác thực với bảng người dùng MySQL hiện có. Apachemod_authn_dbd là phiên bản thay thế cho mod_auth_mysql.
Bạn có thể sử dụng hướng dẫn này cho máy chủ LAMP cơ bản nếu bạn chưa cài đặt Apache.
Bạn sẽ được yêu cầu cung cấp mật khẩu cho người dùng root MySQL:
Mật khẩu mới cho người dùng "root" MariaDB: <-- yourrootsqlpassword
Lặp lại mật khẩu cho người dùng "root" MariaDB: <-- yourrootsqlpassword
Cài đặt mô-đun DBD MySQL:
Sau đó, bật mô-đun mod_authn_dbd:
Khởi động lại Apache:
Sau khi đọc hai tệp này, chúng tôi tạo một cơ sở dữ liệu MySQL có tên là examplecomdb trong đó chúng tôi sẽ tạo bảng mysql_auth chứa thông tin người dùng và mật khẩu của chúng tôi. Ngoài ra, chúng ta tạo người dùng MySQL examplecom_admin - người dùng này sẽ được mod_auth_mysql sử dụng để kết nối với MySQL sau này:
(Thay thế examplecom_admin_password bằng mật khẩu bạn chọn.)
(Tất nhiên, bạn cũng có thể sử dụng các bảng hiện có chứa thông tin xác thực người dùng của mình và bạn cũng có thể có các trường bổ sung trong bảng, chẳng hạn như trường xác định người dùng có hoạt động hay không, ví dụ.)
Bây giờ chúng ta chèn người dùng test vào bảng mysql_auth của chúng ta với mật khẩu test; người dùng này thuộc nhóm testgroup.
Mật khẩu phải được băm, tôi sẽ sử dụng băm SHA1 ở đây, băm có thể được tạo bằng lệnh htpasswd trên shell Linux:
Kết quả như sau:
Phần đầu tiên là tên người dùng "test", được phân tách bằng dấu ":" và sau đó là mật khẩu đã băm. Chúng ta cần mật khẩu đã băm "{SHA}qUqP5cyxm6YcTAhz05Hph5gvu9M=" chỉ để chèn vào cơ sở dữ liệu người dùng của chúng ta. Truy vấn MySQL như sau:
Sau đó, chúng ta thoát khỏi shell MySQL:
Cấu hình cho mod_authn_dbd được đưa vào tệp vhost, không thể thêm vào bên trong tệp .htaccess. Do đó, chúng tôi chỉnh sửa tệp vhost và thêm cấu hình sau vào cuối tệp:
Tải lại Apache:
Nếu bạn có các trường bổ sung trong bảng MySQL của mình để xác định xem người dùng có được phép đăng nhập hay không (ví dụ: một trường có tên là active), bạn có thể thêm nó vào truy vấn người dùng SQL như sau:
Chỉ thị require valid-user khiến cho mỗi người dùng được liệt kê trong bảng mysql_auth có thể đăng nhập miễn là người đó cung cấp đúng mật khẩu. Nếu bạn chỉ muốn một số người dùng nhất định được phép đăng nhập, bạn sẽ sử dụng lệnh như
thay vào đó. Và nếu bạn chỉ muốn các thành viên của một số nhóm nhất định được phép đăng nhập, bạn sẽ sử dụng lệnh như sau:
Vậy là xong! Bây giờ hãy thử truy cập http://www.example.com/protecteddir/, bạn sẽ được yêu cầu nhập tên người dùng và mật khẩu:
1 Lưu ý sơ bộ
Tôi sử dụng vhost http://www.example.com ở đây với tệp cấu hình vhost /etc/apache2/sites-available/example.com.vhost và thư mục gốc của tài liệu /var/www/www.example.com/web. Tôi muốn bảo vệ thư mục /var/www/example.com/web/protecteddir bằng mật khẩu trong hướng dẫn này (dịch thành http://www.example.com/protecteddir/).Bạn có thể sử dụng hướng dẫn này cho máy chủ LAMP cơ bản nếu bạn chưa cài đặt Apache.
2 Cài đặt MySQL hoặc MariaDB
Tôi sẽ sử dụng MariaDB, một nhánh MySQL tại đây thay vì MySQL. Nhưng MySQL cũng hoạt động tốt nếu bạn thích. Để cài đặt MariaDB, chúng ta chạy:
Mã:
apt-get -y install mariadb-server mariadb-client
Mật khẩu mới cho người dùng "root" MariaDB: <-- yourrootsqlpassword
Lặp lại mật khẩu cho người dùng "root" MariaDB: <-- yourrootsqlpassword
Cài đặt mô-đun DBD MySQL:
Mã:
apt-get install libaprutil1-dbd-mysql
Mã:
a2enmod dbd
a2enmod authn_dbd
authn_socache
Mã:
service apache2 restart
3 Configuringmod_authn_dbd
Bạn có thể tìm tài liệu hướng dẫn về mod_authn_dbtrong tài liệu hướng dẫn của Apache tại đây http://httpd.apache.org/docs/current/mod/mod_authn_dbd.html.Sau khi đọc hai tệp này, chúng tôi tạo một cơ sở dữ liệu MySQL có tên là examplecomdb trong đó chúng tôi sẽ tạo bảng mysql_auth chứa thông tin người dùng và mật khẩu của chúng tôi. Ngoài ra, chúng ta tạo người dùng MySQL examplecom_admin - người dùng này sẽ được mod_auth_mysql sử dụng để kết nối với MySQL sau này:
Mã:
mysqladmin -u root -p create examplecomdb
Mã:
mysql -u root -p
Mã:
GRANT SELECT, INSERT, UPDATE, DELETE ON examplecomdb.* TO 'examplecom_admin'@'localhost' IDENTIFIED BY 'examplecom_admin_password';
GRANT SELECT, INSERT, UPDATE, DELETE ON examplecomdb.* TO 'examplecom_admin'@'localhost.localdomain' IDENTIFIED BY 'examplecom_admin_password';
FLUSH PRIVILEGES;
Mã:
USE examplecomdb;
Mã:
create table mysql_auth (
username varchar(255) not null,
passwdvarchar(255),
groups varchar(255),
primary key (username)
);
Bây giờ chúng ta chèn người dùng test vào bảng mysql_auth của chúng ta với mật khẩu test; người dùng này thuộc nhóm testgroup.
Mật khẩu phải được băm, tôi sẽ sử dụng băm SHA1 ở đây, băm có thể được tạo bằng lệnh htpasswd trên shell Linux:
Mã:
htpasswd -bns test test
Mã:
test:{SHA}qUqP5cyxm6YcTAhz05Hph5gvu9M=
Mã:
INSERT INTO `mysql_auth` (`username`, `passwd`, `groups`) VALUES('test', '{SHA}qUqP5cyxm6YcTAhz05Hph5gvu9M=', 'testgroup');
Mã:
quit
Mã:
nano /etc/apache2/sites-available/example.com.vhost
Mã:
[...] # Cấu hình mod_dbd
DBDriver mysql
DBDParams "dbname=examplecomdb user=examplecom_admin pass=examplecom_admin_password"
DBDMin 4
DBDKeep 8
DBDMax 20
DBDExptime 300
# Cấu hình mod_authn_core và mod_auth_basic
# cho mod_authn_dbd
AuthType Basic
AuthName "Máy chủ của tôi"
# Để lưu trữ thông tin xác thực, hãy đặt socache trước dbd tại đây
AuthBasicProvider socache dbd
# Cũng cần thiết cho bộ nhớ đệm: yêu cầu bộ nhớ đệm lưu trữ các tra cứu dbd!
AuthnCacheProvideFor dbd
AuthnCacheContext my-server
# cấu hình mod_authz_core
Yêu cầu valid-user
# mod_authn_dbd Truy vấn SQL để xác thực người dùng
AuthDBDUserPWQuery "SELECT passwd FROM mysql_auth WHERE username = %s"
Mã:
service apache2 reload
Mã:
[...]AuthDBDUserPWQuery "SELECT passwd FROM mysql_auth WHERE username = %s and active = 'yes'"[...]
Mã:
[...]require user jane joe[...]
Mã:
[...]require group testgroup[...]
4 Liên kết
- Apache: http://httpd.apache.org/
- Debian: http://www.debian.org/
- mod_authn_dbd:http://httpd.apache.org/docs/current/mod/mod_authn_dbd.html