Web Toolbar by Bobby

Wednesday, 6 October 2010

Proxy Server Linux dengan Squid


Bagi sebagian rekan-rekan yang mau membuat proxy server dengan Linux, atau bagi adik-adik Ilmu Komputer USD yang mau coba-coba belajar bikin proxy, saya ingin membagikan pengalaman kecil saya dalam membuat proxy menggunakan Linux. Meski banyak software untuk membuat proxy server, saya memilih squid karena paketnya sudah ter-include dalam distro yang saya gunakan (Fedora Core) dan hampir sebagian proxy server Linux menggunakan squid. Untuk spesifikasi hardware yang saya gunakan, dapat dilihat di artikel Proxy Server di tempat kerja saya. Proxy server tersebut menggunakan squid versi 2.6-12 pada distro Fedora Core 6 yang saya fungsikan sebagai:
  1. Menyimpan halaman web di proxy untuk mempercepat akses Internet.

  2. Akses kontrol Internet berdasarkan IP Address. Menggunakan 2 network yang berbeda (saya fungsikan juga sebagai router – dengan IP Forwarding), untuk ini, saya menggunakan 3 NIC pada 1 server.

  3. Blacklist daftar situs terlarang secara manual.

  4. Membatasi ukuran download File dengan ekstension tertentu dan hanya berlaku pada jam tertentu.

  5. Pesan Error dalam format Bahasa Indonesia.

  6. Rule untuk memperbolehkan akses Internet hanya protokol tertentu saja.

Langkah-langkah yang saya lakukan:

  1. Instal aplikasi squid
  2. Edit file konfigurasi squid
  3. Buat direktori dan file blacklist untuk blacklist secara manual
  4. Buat direktori dan file untuk pesan error dalam bahasa indonesia
  5. Check konfigurasi firewall yang diterapkan di proxy
  6. Jalankan servicenya
  7. Test konfigurasi di proxy dan client

File konfigurasi squid: /etc/squid/squid.conf (versi saya)

#SQUID 2.6.STABLE12
#Author by: http://fxekobudi.net

# OPTION JARINGAN
# —————————————————————————–
http_port 3128
icp_port 0

# OPTION UKURAN CACHE
# ——————————————————————-
cache_mem 256 MB
cache_swap_low 94
cache_swap_high 96
maximum_object_size 16384 KB
minimum_object_size 4 KB
maximum_object_size_in_memory 2048 KB
fqdncache_size 1024
cache_replacement_policy heap GDSF
memory_replacement_policy heap GDSF

# DIREKTORI LOG DAN CACHE
# ——————————————————————
cache_dir aufs /var/spool/squid 9000 16 256
access_log /var/log/squid/access.log squid
cache_log /var/log/squid/cache.log
cache_store_log none

# TUNING CACHE PROXY
# ——————————————————————
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern . 0 20% 4320
negative_ttl 1 minutes

# TIMEOUT
# —————————————————————–
half_closed_clients off
# ————————————-
# Memblok situs terlarang (blacklist)secara manual
# ————————————-
acl noblacklist dstdomain “/etc/squid/blacklist/no-blacklist.txt”
acl katablacklist url_regex -i “/etc/squid/blacklist/kata-blacklist.txt”
acl domainblacklist dstdomain “/etc/squid/blacklist/domain-blacklist.txt”
acl ipblacklist dst “/etc/squid/blacklist/ip-blacklist.txt”

acl tdkbebasdownload time 08:00-13:00

# AKSES KONTROL
# ——————————————————————
acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl to_localhost dst 127.0.0.0/8
acl SSL_ports port 443
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl CONNECT method CONNECT
# ————————————-
# Daftar IP address
# ————————————-
acl lab1 src 192.168.254.1-192.168.254.40/255.255.255.255
acl staf-it src 192.168.254.41-192.168.254.42/255.255.255.255
acl lab2 src 192.168.254.43-192.168.254.44/255.255.255.255
acl ruang1 src 192.168.1.1-192.168.1.8/255.255.255.255
acl ruang2 src 192.168.1.11-192.168.1.17/255.255.255.255

# ————————————-
# Memblok situs terlarang secara manual
# ————————————-
http_access allow noblacklist
http_access deny katablacklist
http_access deny domainblacklist
http_access deny ipblacklist

http_access allow manager localhost
http_access deny manager
# ————————————-
# Rule yang saya terapkan
# ————————————-
http_access allow lab1
http_access allow staf-it
http_access allow lab2
http_access allow ruang1
http_access allow ruang2

acl magic_words2 url_regex -i ftp .exe .mp3 .vqf .tar.gz .gz .tar.bz2 .bz2 .rpm .zip .rar .avi .mpeg .mpe .mpg .qt .ram .rm .raw .wav .iso

# Cancel download if file is bigger than 2 MB = 2000×1024 byte = 2048000 byte
reply_body_max_size 2048000 allow magic_words2 tdkbebasdownload

http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost
http_access deny all
http_reply_access allow all
icp_access allow all

# PARAMETER ADMINISTRATOR
# —————————————————————–
cache_mgr fxekobudi@gmail.com
cache_effective_user squid
cache_effective_group squid
visible_hostname proxy.fxekobudi.local

# PESAN ERROR DALAM BAHASA INDONESIA
# ——————————————————————–
error_directory /usr/share/squid/errors/Indonesian

Agar fungsi blacklist manual itu dapat digunakan, buat direktori berisi file-file disebutkan dalam blacklist manual:

# mkdir /etc/squid/blacklist
# cd /etc/squid/blacklist/
# vim no-blacklist.txt
# vim kata-blacklist.txt
# vim domain-blacklist.txt
# vim ip-blacklist.txt

Minimal dimasukkan satu item untuk masing-masing file tersebut, karena jika tidak, maka saat kita melihat error log squid sesaat setelah service dijalankan, akan ada pesan error tidak menemukan item pada file tersebut…

Selain itu, saya juga menyertakan konfigurasi untuk pesan Error dari Proxy squid dalam bentuk bahasa indonesia, agar user di tempat kerja saya lebih mudah memahami maksudnya… Ide pesan error ini kemudian menjadi inspirasi saya saat mengkonfigurasi redirect SquidGuard untuk mengarah kepada file yang sengaja saya buat di root direktori web server proxy.
Untuk melakukannya, tinggal copykan saja pesan Error dalam bahasa Inggris ke direktori lokasi pesan error berbahasa Indonesia.

# cp /usr/share/squid/errors/English /usr/share/squid/errors/Indonesian

trus terjemahkan file-filenya…

Untuk menjalankan servicenya, gunakan saja perintah:

# /sbin/service squid start

Oh ya, Anda juga perlu menambahkan di konfigurasi Firewall menggunakan Iptable agar client diperbolehkan mengakses Internet ini melalui proxy, request client ke proxy dengan IP address yang terdaftar diperbolehkan melalui port 3128 (atau 8080) tergantung konfigurasi yang Anda gunakan… Saya jadi ingat waktu pertama kali mencoba, koneksi internet di server pake proxy udah jalan, tapi kok clientnya ngga bisa akses, eh ternyata emang client belum diperbolehkan akses ke IP address dan portnya proxy… Hehe. Agar bisa akses ke proxy, rule iptable-nya untuk file /etc/sysconfig/iptables harus memuat rule ini: (saya pakai konfigurasi firewall bawaan Fedora Core)

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 3128 -j ACCEPT

Untuk menerapkan IP forwarding, saya edit file /etc/sysctl.conf dan memberi nilai 1 (enable) untuk direktive:

net.ipv4.ip_forward = 0 menjadi net.ipv4.ip_forward = 1

Monday, 21 June 2010

Instalasi server yang dihack

Pendahuluan

Jika sedang "bernasib jelek", sebuah server yang cukup dijaga pun ada kalanya berhasil ditembus. Terutama ini kadang-kadang terjadi pada server publik yang memberi akses pada banyak user atau berisi banyak aplikasi yang rentan seperti aplikasi web PHP yang tidak terkini.

Dan sering kali sebuah server yang penting dan dipakai banyak orang tidak boleh down terlalu lama. Jika kita menginstal ulang dengan memformat, menginstal kembali OS, dan merestore data dari backup di harddisk/komputer lain (yang bisa berpuluh atau ratus gigabyte jumlahnya) maka total waktu yang dibutuhkan dapat berjam-jam lamanya. Kadang ini terlalu lama.

Artikel ini menjelaskan sebuah cara instalasi ulang tanpa format. Contoh kasus yang dibahas di sini adalah server berbasis Linux Debian, namun sebetulnya cara di artikel ini dapat diterapkan pada OS/distro lainnya. Namun tidak semua server memungkinkan untuk menggunakan cara ini. Server yang hanya bisa diakses secara remote, seperti server yang ada di luar negeri, tidak bisa menggunakan cara ini, kecuali jika datacenter memberikan akses terminal menggunakan KVM-over-IP.

Mengapa harus instal ulang?

Jika sebuah server telah di-"hack" dan pihak lain berhasil mendapatkan root, maka jalan satu-satunya untuk meyakinkan bahwa server telah bersih adalah memang dengan menginstal ulang OS. Ini karena hacker bisa:

1. Memasang trojan (program-program palsu) di /usr, /bin, dll (mis: /bin/login atau /usr/sbin/sshd kini dipalsukan agar selain menjalankan fungsi aslinya, juga menyadap password yang diketikkan siapa saja yang ingin login).

2. Memasang modul kernel agar dirinya tidak terdeteksi. Misalnya perintah "ls", "ps ax", "netstat", dll ditipu sehingga tidak memperlihatkan file program, proses, atau koneksi network milik si cracker, padahal sebetulnya ada.

3. memasang program-program lain, seperti program setuid-root, agar si cracker dapat kapan saja memperoleh kembali akses root kapan saja diinginkan. Program-program ini dapat saja tersembunyi dan tidak dapat kita lihat sama sekali.

4. Melindungi program dan proses milik si cracker agar tidak dapat kita hapus/kill.

Dengan kata lain, server yang sudah dihack tidak dapat lagi dipercaya keamanannya. Kita harus merestore semua program-program yang ada di /usr, /bin, dll dengan program asli dari CD instalasi atau dari mirror Debian yang tepercaya. Dengan kata lain, mudahnya adalah dengan melakukan instalasi ulang OS.

Prinsip

Cara yang dijelaskan dalam artikel ini menghindari kita harus mengkopi dulu data ke harddisk lain atau merestore data dari backup di harddisk/komputer lain, jadi tidak membutuhkan harddisk tambahan, dan mengirit waktu.

Prinsipnya adalah dengan, dari CD instalasi (atau live CD) me-mount dulu harddisk lalu memindahkan semua file yang ada di / ke dalam sebuah direktori, misalnya /.old, lalu melakukan instalasi OS. Maka akan terbentuk struktur baru yang bersih di harddisk (/bin, /boot, /etc, dll) sementara instalasi lama kita isolasi dulu di dalam /.old. Setelah instalasi baru selesai, kita pindahkan kembali data user ke dalam instalasi baru (setelah kita mengecek jangan sampai di data user terdapat file setuid-root atau account root ekstra).

Bagian pertama: Instalasi OS baru

Asumsi kita menggunakan Debian. Dan skema partisi server adalah semua data ditaruh di partisi tunggal /. (Jika kita memiliki partisi-partisi terpisah, misalnya /home, maka perlu disesuaikan. Intinya tetap bahwa kita harus menghindari dulu file dari instalasi lama bercampur dengan file instalasi baru.)

Pertama, down-kan server. Lalu boot kembali dengan CD instalasi Debian.

Kedua, setelah sampai pada tahap deteksi Disk, tekan Alt-F2 untuk mendapatkan shell. Mount harddisk (mis: /dev/sda1 jika SATA, atau /dev/hda1 jika masih IDE) ke /tmp/hda1:

# mkdir /tmp/hda1
# mount /dev/sda1 /tmp/hda1
# cd /tmp/hda1
# mkdir .old
# chmod 700 .old
# mv * .old
# ls -la; # pastikan semua telah berpindah ke dalam .old
# cd ..
# umount /tmp/hda1
Catatan: jika kita memiliki partisi backup, mis: di /dev/sdb1, ada baiknya juga dilakukan hal yang sama, yaitu mengisolasi dulu file-file yang ada ke dalam sebuah direktori, mis: .old tadi.

Ketiga, tekan Alt-F1 untuk kembali ke layar instalasi Debian. Lanjutkan instalasi. Catatan: hati-hati agar kita tidak menghapus atau memformat sda1 tersebut di atas.

Bagian kedua: menjinakkan data lama

Pertama, setelah boot dengan instalasi OS baru beserta updates-nya (dengan kernel dan software terbaru, agar tidak lagi rentan di-hack lagi melalui lubang ke amanan yang sama), mari kita lihat isi /.old. Pastikan permission-nya 700, dan kalau perlu kita "chattr -R +i /.old" dulu untuk melindungi dari kecelakaan terhapus dengan "rm", karena /.old ini saat ini akan kita "otopsi".

Catatan: sisa kabgjag di bawah dibuat dengan asumsi kita tidak melakukan chattr +i. Jika Anda melakukannya, pastikan Anda bisa menulis atau menghapus atau memindahkan data dari dalam /.old di mana diperlukan/disebutkan dalam artikel.

Kedua, carilah file-file yang setuid-root. File ini kemungkinan besar merupakan backdoor yang memungkinkan si hacker memperoleh root kembali.

# cd /root
# find /.old -type f -uid 0 -perm /u+s > setuid.txt
# find /.old -type f -gid 0 -perm /g+s > setgid.txt
Catatan: Sebuah server yang memiliki banyak file (jutaan), misalnya server shared hosting yang cukup penuh dengan user dapat memakan waktu 5-10 menit untuk menyelesaikan perintah di atas. Setelah kita mengamati isi file setuid.txt, kita bisa menghapus atau mematikan setuid bit pada file-file yang terdaftar di setuid.txt tersebut. Contoh:

# rm /.old/home/t10000/home/r00t
atau:

# chmod 0 /.old/home/t10000/home/r00t
Catatan: Cukup file-file setuid-root di dalam data user saja (mis: di direktori home/USERNAME/) yang perlu kita waspadai untuk tidak tetap menjadi setuid-root saat kita pasang di luar .old nanti. File-file di .old/bin/, .old/sbin/, dsb toh tidak akan kita pakai lagi karena kita sudah menginstal ulang OS, tapi jika ada file dengan nama aneh, maka kita bisa melihat pola si cracker dalam memilih nama-nama file gadungan yang merupakan setuid-root, misalnya usr/bin/ping2, var/tmp/root, dll. Di sini dibutuhkan pengalaman seorang sysadmin untuk mengenali nama-nama file yang umum dan mana yang ganjil.

Bagian ketiga: restore data user

Yang akan direstore:

1. account-account Unix (/etc/{passwd,shadow,group,gshadow}); 2. data user (mis: /home/USERNAME); 3. crontab user (/var/spool/cron/crontabs/USERNAME);

Pertama, untuk merestore account-account Unix, kita perlu memperhatikan hal-hal berikut. Mungkin ada user yang id-nya 0 selain "root", ini kemungkinan besar ditanam oleh cracker dan tidak boleh kita sertakan. Lalu, user-user lain yang namanya mencurigakan atau tidak dikenal juga sebaiknya tidak disertakan. Lalu, ada baiknya kita reset semua password user (lihat bagian keempat). Perintah di bawah ini hanya akan merestore user yang ditemui direktorinya di /.old/home/USERNAME dan uid > 0.

# cd /.old/etc
# perl -lne '/^([^:]+):[^:]+:(\d+)/; print if $2>0 and -d "/.old/home/$1"' passwd;#>>/etc/passwd
Catatan: Hanya lepaskan komen tanda ";#" di atas jika Anda telah yakin dan melihat output perintahnya.

Untuk 3 file lainnya, yaitu /etc/{shadow,group,gshadow} caranya sama. Catatan: di /etc/shadow kita reset passwordnya.

# perl -lne '/^([^:]+):[^:]+:(.*)/; print "$1:!:$2" if -d "/.old/home/$1"' shadow;#>>/etc/shadow
# perl -lne '/^([^:]+):/; print if -d "/.old/home/$1"' group;#>>/etc/group
# perl -lne '/^([^:]+):/; print if -d "/.old/home/$1"' gshadow;#>>/etc/gshadow
Periksa ulang dengan perintah "ls -l /.old/home/user" apakah semua file user uid dan gid-nya telah terpetakan dengan benar ke /etc/passwd dan /etc/group. Jika masih ada yang numerik berarti ada yang belum

Kedua, untuk merestore data user, cukup kita pindahkan saja dari /.old/home/* ke /home/. Bisa saja dikopi agar aman, tapi butuh waktu lebih lama (bisa berjam-jam). Lagipula (seharusnya!) Anda masih punya backup data-data di /home ini di tempat lain.

Ketiga, untuk restore crontab, pindahkan file crontab milik user yang ada di /.old/var/spool/cron/crontabs/.

Jika masih ada yang ingin direstore, misalnya database MySQL atau PostgreSQL, dapat dilakukan di sini. Yang penting Anda telah memastikan bahwa file-file data yang ingin direstore telah "jinak".

Bagian keempat: reset password

Resetlah semua password user. Caranya misalnya dengan perintah di bawah ini yang akan membuatkan daftar password baru bagi semua user yang memiliki home di /home/USERNAME, lalu meresetnya. Membutuhkan program makepasswd dan chpasswd yang tersedia di Debian:

# ( cd /home; for u in *; do echo "$u:`makepasswd`"; done ) > passwords.txt
# chpasswd -m < passwords.txt