Berita tentang banyaknya Web milik pemerintah yang dihack oleh sekelompok Hacker tentu sudah tak asing lagi. Seperti Situs KPU, Situs Polri dan terakhir Situs milik Presiden SBY.
Ini biasanya terjadi karena sang Peretas tersebut berhasil menemukan celah dari keamanan Web tersebut. Apache merupakan salah satu distribusi web server yang populer dengan dukungan feature yang sangat banyak. Perhitungan statistik yang ada saat ini menunjukkan bahwa Apache menjadi web server yang paling banyak digunakan dalam dunia internet, yaitu mencapai nilai 60 % dari seluruh web server yang ada.
Keberhasilan Apache mencapai kepopuleran saat ini selain dikarenakan memiliki banyak feature yang sering tidak dijumpai pada web server yang lain, juga dikarenakan Apache merupakan aplikasi gratis yang berjalan dalam berbagai sistem operasi. Jadi pada kesempatan ini penulis mau memberikan tips tips cara bagaimana mengamankan Web Server dengan berdasarkan platform Apache.
Sebelum kita melangkah agaknya perlu ada batasan batasan yang harus dipahami lebih dahulu tentang prinsip-prinsip keamanan Web Server.
Prinsip Pertama: tidak ada sistem yang 100% aman. Sebaik-baiknya usaha kita mencapai keamanan tertinggi, akan ada celah atau peluang untuk ditembus. Dan kadang-kadang celah itu dari diri kita sendiri (pernah nonton film The Firewall?). Jadi keamanan absolut tidak ada; yang ada melainkan adalah sistem yang cukup aman dan sistem yang kurang aman. Tujuan sistem keamanan adalah mengetahui bagaimana membuat sistem yang cukup aman dan menghindari lubang-lubang yang membuat sistem kita tidak aman.
Prinsip Kedua: jangan percayai siapa atau apa pun. Pada umumnya situs situs publik mestinya selalu di akses oleh banyak user asing. Asumsi bahwa user asing itu semua baik baik aja adalah terlalu naif. Situs-situs di Internet, besar kecil selalu diisengi orang setiap hari. Hanya mengandalkan pengecekan masukan oleh Javascript juga kesalahan fatal. Javascript dapat di bypass kapan saja.
Prinsip Ketiga: kenali sistem Anda lebih dari orang lain. Bagaimana Anda bisa menjaga rumah kita sendiri seandainya anda sendiri tidak tahu berapa pintu dan jendela di rumah anda atau kunci mana yang digunakan. Dalam keamanan Web Server ada 4 pintu masuk yang harus kita kuasai, input via HTML, Perintah ke shell atau kernel, perintah SQL ke server database, dan kode skrip Web Aplikasi (PHP, ASP) ke interpreter untuk di eval atau di exec.
Prinsip keempat: hanya mengandalkan penyamaran bukanlah keamanan yang baik. Kata orang London bilang ’security by obscurity is not good security’. Jangan taruh kunci rumah di pot kembang atau bawah keset. Akan banyak orang yang akan melihat rumah anda. Bagaimana bisa yakin kalau gak ada orang yang ngintip atau orang yang tahu. Berpikir “orang tidak akan kepikir sampai ke sini” adalah pikiran yang salah, karena Anda toh tidak tahu apa yang ada di pikiran orang lain.
Langkah-langkah yang akan penulis jelaskan disini adalah sifatnya dasar, tapi biasanya jarang diperhatikan. Tapi kalau dijalankan sejak awal jelas cukup efektif untuk mengamankan pada lapisan Web Server, adapun pada lapisan Web Aplikasi akan di bahas selanjutnya.
Untuk diketahui bahwa OS yang digunakan penulis adalah Ubuntu 11.10, Web Server adalah Apache 2 dan PHP adalah PHP versi 5.
Langkah-langkah untuk mengamankan Konfigurasi Web Server secara garis besar adalah :
- Mengatur Layanan web server agar low previllages
- Pengaturan akses terhadap web server
- Meminimalkan layanan publik pada mesin yang menjalankan web server
- Menyediakan filesystem khusus untuk layanan web server
1. Layanan web server dengan low previllages
Maksudnya adalah membatasi cara user mengakses Web Server dengan pengaturan akses yang tepat. Pengaturan akses Web Server biasanya dapat dilakukan pula dengan membuat aturanaturan pada file .htaccess pada direktori yang bersangkutan baik untuk mengatur akses terhadap file maupun akses terhadap direktori dimana file ini berada.
Direktory di mana file html berada (kita sebut Web Root) pada apache2 biasanya di arahkan ke folder /var/www/ ini. Konfigurasi ini disetting di file /etc/apache2/sites-avaiable/default.
Ada tiga langkah yang harus dilakukan pertama tutup akses ke file .htaccess, file ini berisi konfigurasi akses direktori dan file dimana file .htaccess berada, dalam beberapa situasi ini gak bagus buat pengamanan akses ke Web Server, set “AllowOverride None” di root direktori pada file /etc/apache2/sites-avaiable/default
[Directory /]
Option FollowSymlinks
AllowOverride None
[/Directory]
Langkah kedua adalah tutup akses browse ke Web Root, defaultnya memang user dapat melihat semua file dan sub directory di bawahnya. Misalnya jika user membuka http://{alamat ip}/images/ dan jika di folder images itu tidak ada file index.html atau index.php, maka yang terlihat adalah tampilan folder direktori yang berisi list file yang ada di folder images tersebut, sehingga user bisa membuka file tersebut satu persatu. Untuk menutup set value direktif Option menjadi “None” atau “-Indexes” pada directory /var/www/
[Directory /var/www/]
Option -Indexes
AllowOverride None
Order allow,deny
Allow from all
[/Directory /var/www/]
Langkah ketiga, seperti Machiaveli pernah bilang singkirkan yang tidak perlu, maka singkirkan juga option yang gak perlu yaitu:
Option FollowSymLink, Option Includes, Option MultiViews dan Option SymLinksIfOwnerMatch.
[Directory /]
Option -FollowSymlinks -Includes -MultiViews -SymLinksIfOwnerMatch
AllowOverride None
[/Directory ]
2. Pengaturan akses terhadap web server
Pengaturan akses pada Apache web server dapat dibedakan menjadi 2 macam :
- Pengaturan akses berdasarkan alamat IP dari client
- Pengaturan akses dengan proses autentikasi pengguna.
Pengaturan akses berdasarkan IP Address client.
Model pengaturan akses web server yang diterapkan disini didasarkan pada informasi IP address dari pengguna. Aturan dapat dibuat sehingga untuk file atau direktori tertentu akses dari IP address pengguna diterima atau ditolak. Ada 3 kata kunci yang berkaitan dengan pengaturan ini yaitu Order, Deny, dan Allow. Kata kunci Order dapat diikuti oleh deny, allow atau allow, deny yang
menunjukkan urutan evaluasi pengaturan berdasarkan aturan Deny dan aturan Allow.
Kata kunci Allow maupun Deny diikuti oleh kata kunci from dan :
all : menunjukkan akses untuk semua host diperbolehkan (Allow) atau ditolak (Deny)
IP address : yaitu alamat IP yang diperbolehkan atau ditolak semisal :
167.205.25.6
167.205.25. (berarti berlaku untuk alamat IP 167.205.25.0 167.205.25.255) atau 167.205. atau 167.
167.205.25.0/27 (berlaku untuk 167.205.25.0167.205.25.31)
167.205.0.0/255.255.0.0 (berlaku untuk 167.205.0.0167.205.255.255)
[Directory /var/www/]
Option -Indexes
AllowOverride None
Order allow,deny
Deny from all
Allow from 167.205.25.6
[/Directory]
[Directory /var/www/]
Option -Indexes
AllowOverride None
Order allow,deny
Deny from all
Allow from 167.205.25.
[/Directory]
[Directory /var/www/]
Option -Indexes
AllowOverride None
Order allow,deny
Deny from all
Allow from 167.205.25.0/27
[/Directory]
Pengaturan akses dengan proses autentikasi pengguna
Model pengaturan akses dengan proses autentikasi pengguna lebih fleksibel dibandingkan dengan pengaturan akses berdasarkan IP address pengguna. Ketika anda mencoba untuk mengakses suatu resources yang dilindungi oleh model autentikasi user semacam ini maka anda harus memasukan informasi login dan password yang sesuai dalam suatu form semacam ini.
Untuk mengimplementasikan mekanisme autentikasi ini perlu dilakukan perubahanperubahan pada file httpd.conf ataupun pada file .htaccess yang diletakkan pada direktori yang bersangkutan. Informasi data login dibuat dengan menggunakan program htpasswd. Berikut saya ilustrasikan langkah langkahnya
1. Pastikan webserver Apache telah terinstall
# aptget install apache2
2. Buat direktori untuk menyimpan file https
# mkdir /var/www/secure
3. Instalasi openssl
# aptget install openssl sslcert
# mkdir /etc/apache2/ssl
Mengaktifkan apache2 module :
# a2enmod ssl
# a2enmod auth_basic
5. Tambahkan konfigurasi ports SSL
# nano /etc/apache2/ports.conf
Listen 80
Listen 443
6. Edit dan tambahkan pada konfigurasi apache
# nano /etc/apache2/sitesenabled/000default
[VirtualHost *:443]
SSLEngine On
SSLCertificateFile /etc/apache2/ssl/server.cert
SSLCertificateKeyFile /etc/apache2/ssl/server.key
ServerName Komdig
ServerAdmin zenhadi at eepisits.edu
DocumentRoot /var/www/secure
Alias /secure /var/www/secure
[Directory /var/www/secure/]
AuthUserFile /home/student/.htpasswd
AuthName EnterPassword
AuthType Basic
require validuser
Order Deny,allow
Allow from all
[/Directory]
[/VirtualHost]
7. Buat sertifikat di sisi server
# cd /etc/apache2/ssl
Pembuatan kunci privat untuk server dengan algoritma RSA, kunci privat akan disimpan di server
dengan nama server.key
# openssl rsa in privkey.pem out server.key
Pembuatan CSR (Certificate Signing Request). Idealnya, CSR akan dikrimkan ke sebuah CA (Certificate Authority) seperti Thawte atau Verisign, kemudian mereka akan melakukan verifikasi terhadap identitas dari pihak yang meminta sertifikat tersebut untuk ditanda tangani. Karena kita tidak memiliki sertifikat yang dapat ditanda tangani oleh CA tersebut, maka opsi yang lain adalah
dengan selfsign CSR.
# openssl req new > server.csr
Generating a 1024 bit RSA private key
………..++++++
……………++++++
writing new private key to ‘privkey.pem’
Enter PEM pass phrase: => melindungi kunci privat
Verifying Enter PEM pass phrase:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.
Country Name (2 letter code) [AU]:ID
State or Province Name (full name) [SomeState]:DKI Jakarta
Locality Name (eg, city) []:Jakarta
Organization Name (eg, company) [Internet Widgits Pty Ltd]:RSKB
Organizational Unit Name (eg, section) []: IT
Common Name (eg, YOUR name) []:admin
Email Address []:asrulsani.mohamad@gmail.com
Please enter the following ‘extra’ attributes
to be sent with your certificate request
A challenge password []:mypass
An optional company name []:RSKB
Penandatanganan sertifikat dengan kunci privat yang dibuat diatas, sehingga disebut selfsign certificate, dengan masa berlaku 365
# openssl x509 in server.csr out server.cert req signkey server.key days 365
Cek file :
# ls
server.cert
server.csr
server.key
NB:
File server.cert adalah sertifkat yang telah ditanda tangani
File server.csr adalah sertifikat yang belum ditanda tangani yang berisi informasi tentang suatu
badan atau institusi
File server.key, merupakan kunci privat dari server
8. Buat password untuk masuk ke webserver (apache2)
# htpasswd c /home/student/.htpasswd asrul
9. Restart apache
# /etc/init.d/apache2 restart
10. Ujicoba dengan menggunakan browser, catat dan analisa
a. Uji dengan http
URL : http://
b. Uji dengan https, akan muncul sertifikat dari server dan autentikasinya
URL : https://
Tuliskan informasi certificate yang diperoleh.
11. Copy dan edit file index.html, dan simpan di /var/www/secure
# cp /var/www/index.html /var/www/secure
# vim /var/www/secure/index.html => tambahkan keterangan untuk membedakan dengan http
It works!
Ini di https
12. Uji kembali dengan https, catat dan analisa
URL : https://
13. Analisa dengan menggunakan wireshark baik ketika mengakses menggunakan http dan https.
Bandingkan hasil proses antara http dan https.
3. Meminimalkan layanan publik pada mesin yang menjalankan web server.
Pada umumnya mesinmesin komputer yang terhubung dengan internet melayani beberapa program layanan sekaligus. Karena itu perlunya meminimalkan layanan publik pada mesin yang menjalankan web server. Ada beberapa alasan yang mendasari hal tersebut antara lain :
Keterbatasan alamat IP saat ini
Keterbatasan sumber daya mesin komputer
Keinginan memaksimalkan sumber daya komputer dengan menjalankan
Untuk melakukan langkah ini kita mulai ke file /etc/apache2/apache2.conf untuk melakukan beberapa perubahan option di file konfigurasi tersebut.
* MaxKeepAliveRequest
Meski di default 100, Jika Web Server dari hari ke hari Maksimum cuma di kunjungi < 15 secara bersamaan, kecilkan aja jadi 60
MaxKeepAliveRequest 60
*Time Out
Defaultnya 300, Kecilkan aja untuk mengurangi efek DDoS jika di serang
TimeOut 75
*KeepAliveTimeout
Defaultnya 5, perbesar saja nilainya agar performance akses bertubi-tubi dari user berkurang, beri nilai 10 (selang waktu 10 detik), ini untuk mengurangi efek DDoS jika terjadi.
KeepAliveTimeout 10
Demikian Langkah-langkah dasar mengamankan Web Server, selanjutnya penulis akan bahas ke arah mengamankan Web Aplikasi dan Database Server kita