Panduan ini menjelaskan cara melindungi direktori web dengan kata sandi (dengan pengguna dari database MySQL) dengan mod_authn_dbd di Apache2 pada server Debian 8 (Jessie). Ini adalah alternatif untuk file kata sandi teks biasa yang disediakan oleh mod_auth dan memungkinkan Anda untuk menggunakan sintaks SQL normal untuk membuat/memodifikasi pengguna yang dihapus. Anda juga dapat mengonfigurasi mod_authn_dbd untuk mengautentikasi terhadap tabel pengguna MySQL yang ada. Apache mod_authn_dbd adalah pengganti mod_auth_mysql.
1 Catatan Awal
Saya menggunakan vhost http://www.example.com di sini dengan file konfigurasi vhost /etc/Apache2/sites-available/example.com.vhost dan root dokumen /var/www/www.example.com/web. Saya ingin melindungi direktori /var/www/example.com/web/protecteddir dengan kata sandi dalam tutorial ini (diterjemahkan ke http://www.example.com/protecteddir/).
Anda dapat menggunakan tutorial ini untuk server LAMP dasar jika Anda belum menginstal Apache.
2 Menginstal MySQL atau MariaDB
Saya akan menggunakan MariaDB, garpu MySQL di sini, bukan MySQL. Tetapi MySQL juga berfungsi jika Anda menginginkannya. Untuk menginstal MariaDB, kami menjalankan:
apt-get -y install mariadb-server mariadb-client
Anda akan diminta untuk memberikan kata sandi untuk pengguna root MySQL:
Kata sandi baru untuk pengguna "root" MariaDB:<-- yourrootsqlpassword
Ulangi kata sandi untuk pengguna "root" MariaDB:<-- yourrootsqlpassword
Instal modul DBD MySQL:
apt-get install libaprutil1-dbd-mysql
Setelah itu, aktifkan modul mod_authn_dbd :
a2enmod dbd
a2enmod authn_dbd
authn_socache
Mulai ulang Apache:
service apache2 restart
3 Mengonfigurasi mod_authn_dbd
Anda dapat menemukan dokumentasi untuk mod_authn_dbd dalam dokumentasi Apache di sini http://httpd.apache.org/docs/current/mod/mod_authn_dbd.html.
Setelah membaca kedua file ini, kami membuat database MySQL bernama examplecomdb di mana kami akan membuat tabel mysql_auth yang akan berisi pengguna dan kata sandi kami. Selain itu kita buat user MySQL examplecom_admin - user ini akan digunakan oleh mod_auth_mysql untuk koneksi ke MySQL nanti:
mysqladmin -u root -p create examplecomdb
mysql -u root -p
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;
(Ganti examplecom_admin_password dengan kata sandi pilihan Anda.)
USE examplecomdb;
create table mysql_auth (
username varchar(255) not null,
passwd varchar(255),
groups varchar(255),
primary key (username)
);
(Tentu saja, Anda juga dapat menggunakan tabel yang ada yang menyimpan kredensial pengguna Anda, dan Anda juga dapat memiliki bidang tambahan dalam tabel, seperti bidang yang menentukan apakah pengguna aktif atau tidak, misalnya.)
Sekarang kami memasukkan tes pengguna ke tabel mysql_auth kami dengan tes kata sandi; pengguna ini milik grup uji grup.
Kata sandi harus di-hash, saya akan menggunakan hash SHA1 di sini, hash dapat dibuat dengan perintah htpasswd pada shell Linux:
htpasswd -bns test test
Hasilnya begini:
test:{SHA}qUqP5cyxm6YcTAhz05Hph5gvu9M=
Bagian pertama adalah nama pengguna "test", dipisahkan oleh ":" dan kemudian muncul kata sandi hash. Kami membutuhkan kata sandi hash "{SHA}qUqP5cyxm6YcTAhz05Hph5gvu9M=" hanya untuk memasukkannya ke dalam basis data pengguna kami. Permintaan MySQL adalah ini:
INSERT INTO `mysql_auth` (`username`, `passwd`, `groups`) VALUES('test', '{SHA}qUqP5cyxm6YcTAhz05Hph5gvu9M=', 'testgroup');
Kemudian kita meninggalkan shell MySQL:
quit
Konfigurasi mod_authn_dbd untuk dimasukkan ke dalam file vhost, tidak boleh ditambahkan di dalam file .htaccess. Oleh karena itu kami mengedit file vhost dan menambahkan konfigurasi berikut di akhir file:
nano /etc/apache2/sites-available/example.com.vhost
[...] # mod_dbd configuration
DBDriver mysql
DBDParams "dbname=examplecomdb user=examplecom_admin pass=examplecom_admin_password"
DBDMin 4
DBDKeep 8
DBDMax 20
DBDExptime 300
<Directory "/var/www/example.com/web/protecteddir">
# mod_authn_core and mod_auth_basic configuration
# for mod_authn_dbd
AuthType Basic
AuthName "My Server"
# To cache credentials, put socache ahead of dbd here
AuthBasicProvider socache dbd
# Also required for caching: tell the cache to cache dbd lookups!
AuthnCacheProvideFor dbd
AuthnCacheContext my-server
# mod_authz_core configuration
Require valid-user
# mod_authn_dbd SQL query to authenticate a user
AuthDBDUserPWQuery "SELECT passwd FROM mysql_auth WHERE username = %s"
</Directory>
Muat ulang Apache:
service apache2 reload
Jika Anda memiliki bidang tambahan di tabel MySQL Anda yang menentukan apakah pengguna diizinkan untuk masuk atau tidak (misalnya bidang yang disebut aktif), Anda dapat menambahkannya ke kueri pengguna SQL seperti ini:
[...] AuthDBDUserPWQuery "SELECT passwd FROM mysql_auth WHERE username = %s and active = 'yes'" [...]
Direktif membutuhkan pengguna yang valid membuat setiap pengguna yang terdaftar di tabel mysql_auth dapat masuk selama dia memberikan kata sandi yang benar. Jika Anda hanya ingin pengguna tertentu diizinkan untuk masuk, Anda akan menggunakan sesuatu seperti
[...] require user jane joe [...]
sebagai gantinya. Dan jika Anda hanya ingin anggota grup tertentu diizinkan untuk masuk, Anda akan menggunakan sesuatu seperti ini:
[...] require group testgroup [...]
Itu dia! Sekarang coba akses http://www.example.com/protecteddir/, dan Anda akan dimintai nama pengguna dan kata sandi:
4 Tautan
- Apache:http://httpd.apache.org/
- Debian:http://www.debian.org/
- mod_authn_dbd: http://httpd.Apache.org/docs/current/mod/mod_authn_dbd.html