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 virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_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_location
auth_param basic children 20
auth_param basic realm Username and Password
auth_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/24
acl user_authentication proxy_auth REQUIRED
acl max_connection maxconn 5
acl 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/24
acl work_hours time M T W H F A 07:00-18:00
Aturan-aturan ini lantas disusun secara urut menjadi:
http_access allow jaringan_1 intranet_domain
http_access allow jaringan_2 work_hours
http_access allow user_authentication
http_access deny jaringan_1 max_connection
http_access allow !max_connection
http_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 –p
Password: [masukkan_password_database_disini]
mysql>  show databases;
+--------------------+
| mysql              |
| squid              |
| information_schema |
+--------------------+
mysql> use squid;
Database squid is used
mysql>  CREATE TABLE users (username CHAR(20) NOT NULL PRIMARY KEY, password CHAR(32) NOT NULL);
Query OK
mysql>  CREATE TABLE log (username CHAR(20) NOT NULL, accesstime DATETIME);
Query OK
mysql> quit
bye

Root#

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”);
else
      fwrite(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 WHERE
username='$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 SET
username='$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 transparent

acl banner url_regex "/etc/squid/squid-banner.acl"
acl blocked url_regex "/etc/squid/squid-block.acl"

http_access deny banner
http_access deny blocked

auth_param basic program /usr/bin/php /var/www/php_auth.php
auth_param basic children 20
auth_param basic realm Username and password
auth_param basic credentialsttl 1 hours

acl jaringan_1 src 192.168.1.0/24
acl user_authentication proxy_auth REQUIRED
acl max_connection maxconn 5
acl intranet_domain dstdomain .arahmadi.net
acl jaringan_2 src 192.168.2.0/24
acl work_hours time M T W H F A 07:00-18:00
http_access allow jaringan_1 intranet_domain
http_access allow jaringan_2 work_hours
http_access allow user_authentication
http_access deny jaringan_1 max_connection
http_access allow !max_connection
http_access deny all

visible_hostname sydrake.arahmadi.net
cache_mgr antonrahmadi

Comments

Popular posts from this blog

Xeon LGA 771 di mobo LGA 775

Writing and reading float using Arduino EEPROM

LM35 Incubator with LCD 16x2 on Arduino