Otentikasi Squid Proxy dengan PHP dan MySQL
1 Kebutuhan sistem operasi dan perangkat lunak
Tutorial ini diadaptasikan pada
mesin Slackware versi 12. Namun,
penggunaannya secara umum dapat diimplementasikan di distribusi Linux lainnya
dengan memyesuaikan path program ataupun file.
Program-program yang diperlukan
adalah Squid versi 2.6, Apache, PHP, MySQL, dan iptables.
2 Prinsip Kerja
Internet adalah salah satu sumber
daya terbatas. Dalam organisasi yang
besar, sebuah layanan yang disediakan tentunya harus diakses oleh orang yang
tepat. Oleh karena itu, proses otentikasi terhadap layanan internet diperlukan
untuk menjamin penggunaan sistem yang bertanggung jawab.
Squid, sebuah layanan proxy server
yang sangat populer [1], merupakan salah satu program yang dapat membagi sumber
daya internet ke workstation di intranet.
Squid, dalam permasalahan otentikasi, memiliki kemampuan untuk membatasi
hanya kepada orang yang memiliki akses saja.
Ada dua
mekanisme otentikasi yang dikenal oleh squid yaitu: basic dan digest [2]. Namun dalam tutorial ini, konfigurasi
otentikasi dengan modus basic sudah memenuhi kebutuhan secara umum.
Pada prinsipnya, cara kerja squid
proxy dalam menyaring pengguna [3] adalah sebagai berikut:
2.1 Squid
2.1.1 Proxy di set sebagai transparent proxy
Sebagai transparent proxy untuk squid versi
2.6 dilakukan dengan sangat mudah yaitu dengan menambahkan kata “transparent”
pada opsi konfigurasi http_port di file /etc/squid/squid.conf. Contohnya:
http_port 3128 transparent
Untuk versi-versi sebelumnya, transparent
proxy dilakukan dengan menambahkan beberapa baris konfigurasi sebagai berikut:
httpd_accel_host virtualhttpd_accel_port 80httpd_accel_with_proxy onhttpd_accel_uses_host_header on
Dalam hal ini, squid harus diakses oleh
semua pengguna tanpa harus ada konfigurasi lanjutan di workstation. Untuk itu, semua permintaan ke port 80 harus
di redireksi ke port squid. Ini dapat
dilakukan dengan jalan menambahkan satu baris perintah setelah squid diaktifkan
[4]:
Root# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128
2.1.2 Proxy akan mengakses sebuah halaman otentikasi yang dibuat dengan PHP
Agar squid dapat memberikan pembatasan
kepada pengguna-pengguna yang sah, maka diperlukan konfigurasi lanjutan. Setting yang dilakukan dalam modus basic ini
terdiri dari beberapa baris [2] di dalam ./etc/squid/squid.conf, yaitu:
auth_param basic program /usr/bin/php your_script_locationauth_param basic children 20auth_param basic realm Username and Passwordauth_param basic credentialsttl 1 hours
Baris-baris terpenting dalam perintah ini
adalah auth_param basic program, yang akan memanggil program PHP, auth_param
basic children, yang akan menentukan jumlah otentikasi maksimum secara
bersamaan dan auth_param basic
credentialsttl yang menentukan berapa lama seorang user dapat memiliki akses di
komputer tersebut.
2.1.3 Menambahkan Access Control List
Prinsip selanjutnya adalah mendefinisikan
jaringan yang akan diberi password atau tidak. Dalam kasus ini, Access Control
List (ACL) tersebut diberi nama jaringan_1 dan jaringan_2. jaringan_1 didefinisikan sebagai klien yang
bisa diakses kapan saja, tetapi memerlukan password (opsi src dan proxy_auth).
Tipikal jaringan_1 adalah klien pada komputer layanan publik seperti di
perpustakaan. Layanan pada jaringan_1 juga dapat mengakses fasilitas intranet
secara gratis, namun tidak pada fasilitas internet (opsi dstdomain). Koneksi pada jaringan_1 dibatasi maksimum 5
window secara bersamaan (opsi maxconn)
acl jaringan_1 src 192.168.1.0/24acl user_authentication proxy_auth REQUIREDacl max_connection maxconn 5acl intranet_domain dstdomain .arahmadi.net
Sementara jaringan_2 didefinikasi jalur yang
hanya bisa diakses pada saat jam kerja dan bersifat dedicated atau tidak
memerlukan password (opsi src). Tipikal jaringan_2 adalah komputer staf yang
bekerja tetap di kantor. Durasi jam kerja di definisikan dari Senin hingga
Sabtu pukul 07.00 hingga 18.00 (opsi time).
acl jaringan_2 src 192.168.2.0/24acl work_hours time M T W H F A 07:00-18:00Aturan-aturan ini lantas disusun secara urut menjadi:http_access allow jaringan_1 intranet_domainhttp_access allow jaringan_2 work_hourshttp_access allow user_authenticationhttp_access deny jaringan_1 max_connectionhttp_access allow !max_connectionhttp_access deny all
2.2 Persiapan database MySQL
Database di MySQL yang kita persiapkan
bernama squid, terdiri dari dua tabel, users dan log. Tabel users berisikan daftar nama pengguna
dan passwordnya, sedangkan tabel log berisi keterangan user tersebut login
beserta waktunya. Menggunakan perintah
console, cara membuat database dengan mysqladmin [5] adalah:
Root# mysqladmin –uroot –p CREATE squid
Password: [masukkan_password_database_disini]
Berikutnya adalah membuat tabel users dan
log. Kedua tabel ini dibuat menggunakan
kosole mysql [6], sebagai berikut:
Root# mysql –uroot –pPassword: [masukkan_password_database_disini]mysql> show databases;+--------------------+| mysql || squid || information_schema |+--------------------+
mysql> use squid;Database squid is usedmysql> CREATE TABLE users (username CHAR(20) NOT NULL PRIMARY KEY, password CHAR(32) NOT NULL);Query OKmysql> CREATE TABLE log (username CHAR(20) NOT NULL, accesstime DATETIME);Query OKmysql> quitbyeRoot#
2.3 PHP
2.3.1 Squid akan mengirimkan input ke PHP
Input yang dilakukan menggunakan modus
basic dalam squid akan berformat teks murni yang terdiri dari namauser [spasi]
password. Untuk itu, PHP harus bisa
membaca input ini dan memecahnya menjadi variable $username dan $password.
if (! defined(STDIN)) {define("STDIN", fopen("php://stdin", "r"));}while (!feof(STDIN)) {$line = trim(fgets(STDIN));$fields = explode(' ', $line);$username = rawurldecode($fields[0]);$password = rawurldecode($fields[1]);}
2.3.2 Halaman otentikasi akan mengecek user dan password yang tepat
Menggunakan PHP, koneksi ke database MySQL
dapat dibuat dengan mudah, selama modul php_mysql.so menyertainya. Pengecekan modul ini dapat dilakukan pada
file /etc/httpd/php.ini (Slackware versi 12):
Root# cat /etc/apache2/php.ini | grep php_mysql
Untuk Slackware versi 9.x-11.0 letak dari
file php.ini adalah di /etc/httpd/php.ini.
Bisa juga dicari dimana letak file tersebut dengan perintah whereis:
Root# whereis php.ini
Script PHP untuk terkoneksi ke MySQL adalah:
mysql_connect (“nama_server”,”nama_user”,”password”)mysql_select_db (“nama_database”)$hasil=mysql_query(“SELECT username FROM users WHERE username=’$username’ AND password=’$password’)
Sampai di sini, PHP akan mengecek ke table
users terhadap kecocokan username dan password dengan yang tersimpan di
database. Hasil dari query ke database
akan dikembalikan ke squid.
2.3.3 Halaman otentikasi akan mengembalikan nilai output ke squid
Untuk otektikasi modus basic, PHP harus
mengembalikan hasil berupa OK untuk berhasil dan ERR untuk gagal. Oleh kareina itu, di baris-baris selanjutnya,
kita tambahkan kondisional sebagai output dari PHP.
if (mysql_num_rows($hasil)==1)fwrite(STDOUT,”OK\n”);elsefwrite(STDOUT,”ERR\n”)
Demikian prinsip kerja dari otentikasi squid
menggunakan PHP dan MySQL. Lebih
jelasnya, konfigurasi ini dapat dibaca pada point ke tiga.
2.3.4 Memasukan log ke database
Selain mengeluarkan output yang dibaca oleh
squd, PHP juga akan melakukan query ke tabel log untuk membuat keterangan
siapa-siapa saja yang menggunakan internet dengan username dan password
tertentu pada waktu tertentu. DIkarenakan query-nya tidak perlu dikontrol dan
akan banyak menyita memori, maka ada baiknya perintah yang tepat adalah
menggunakan mysql_unbuffered_query sebagai berikut:
mysql_unbuffered_query("INSERT INTO log SET username='$username', accesstime='$accesstime';");
3 Contoh konfigurasi
File ini disimpan dengan nama: php_auth.php
di folder /var/www, tentu awalan dan akhiran untuk skrip php harus dicantumkan.
if (! defined(STDIN)) {define("STDIN", fopen("php://stdin", "r"));}while (!feof(STDIN)) {$line = trim(fgets(STDIN));$fields = explode(' ', $line);$username = rawurldecode($fields[0]); //1738$password = rawurldecode($fields[1]); //1738#secure $username and $password with sanity_check function
@mysql_connect("localhost","root","password_root");@mysql_select_db("squid");$result=@mysql_query("SELECT password FROM users WHEREusername='$username' AND password=md5('$password');");$accesstime=date("Y-m-d H:i:s");if (mysql_num_rows($result)<>1) {fwrite(STDOUT, "ERR\n");} else {@mysql_unbuffered_query("INSERT INTO log SETusername='$username', accesstime='$accesstime';");fwrite(STDOUT, "OK\n");}@mysql_free_result($result);}
Sebagian isi dari /etc/squid/squid.conf yang
relevan dengan topik ini adalah:
http_port 3128 transparentacl banner url_regex "/etc/squid/squid-banner.acl"acl blocked url_regex "/etc/squid/squid-block.acl"http_access deny bannerhttp_access deny blockedauth_param basic program /usr/bin/php /var/www/php_auth.phpauth_param basic children 20auth_param basic realm Username and passwordauth_param basic credentialsttl 1 hoursacl jaringan_1 src 192.168.1.0/24acl user_authentication proxy_auth REQUIREDacl max_connection maxconn 5acl intranet_domain dstdomain .arahmadi.netacl jaringan_2 src 192.168.2.0/24acl work_hours time M T W H F A 07:00-18:00http_access allow jaringan_1 intranet_domainhttp_access allow jaringan_2 work_hourshttp_access allow user_authenticationhttp_access deny jaringan_1 max_connectionhttp_access allow !max_connectionhttp_access deny allvisible_hostname sydrake.arahmadi.netcache_mgr antonrahmadi
Comments