Panduan ini ditujukan kepada mereka yang menggunakan Gentoo Linux dalam lingkungan server atau mereka yang merasa butuh keamanan sistem yang lebih baik.
Tidak peduli berapa banyak cara perlindungan yang Anda implementasikan, semuanya akan sia-sia jika seorang penyerang bisa menjangkau fisik perangkat Anda. Pastikan bahwa perangkat keras Anda tidak mudah dijangkau. Contohnya, Anda mungkin akan menempatkan perangkat Anda pada suatu lemari yang terkunci. Kunci pada perangkat juga merupakan ide yang bagus. Untuk tingkat keamanan tertinggi, lakukan setting pada BIOS supaya hanya bisa melakukan boot dari harddisk saja. Matikan boot dari drive floppy dan CDROM. Untuk mereka yang paranoid, silakan mengaktifkan password BIOS. Password BIOS juga merupakan ide bagus untuk user laptop.
Dokumentasikan layanan-layanan (services) yang harus atau seharusnya dijalankan oleh server. Hal ini akan membantu Anda untuk menentukan komposisi partisi yang lebih baik bagi sistem. Dan juga akan memudahkan Anda dalam strategi deteksi dini penyusupan. Tentu saja Anda tidak perlu mendokumentasikan hal ini jika Anda hanya memiliki satu atau beberapa komputer saja dan hanya Anda satu-satunya penggunanya, contohnya jika suatu komputer akan berfungsi sebagai firewall maka komputer ini tidak boleh menjalankan
Dokumentasikan hal ini dan versi terkini dari sshd - ini akan membantu Anda memantau sistem mana yang perlu diperbarui (diupgrade) jika seseorang menemukan lubang keamanan baru pada sshd. Hal ini juga membantu penentuan orang yang punya hak akses ke sistem.
Aturan emas :
User 'root' adalah user yang paling vital dalam sistem dan tidak boleh digunakan sembarangan. Bila seorang penyerang mendapatkan akses root, maka Anda tidak bisa lagi mempercayai sistem Anda, jadi harus diinstalasi ulang.
Aturan emas untuk 'root'
Gentoo memiliki pencegahan untuk user biasa yang mencoba su. Setting dasar PAM menyatakan bahwa user harus menjadi anggota dari grup wheel untuk memungkinkannya melakukan su.
Ada beberapa alasan mengapa kebijaksanaan keamanan diperlukan.
Jadi jelas bahwa penting untuk membuat kebijaksanaan pada sistem dengan jumlah user lebih dari satu dan juga penting untuk mendidik user.
Suatu kebijaksaan adalah suatu dokumen (atau beberapa dokumen) yang berisi jawaban atas pertanyaan seperti siapa, di mana, mengapa dan apa. Setiap user pada sistem/jaringan Anda harus membaca, mengerti dan menandatanganinya. Penting bagi Anda untuk meluangkan waktu membantu user dalam memahami kebijaksanaan dan mengapa kebijaksanaan tersebut perlu ditandatangani atau apa yang akan terjadi jika mereka melakukan hal yang berlawanan dengan kebijaksanaan (dalam kebijaksanaan harus disebutkan hal ini juga). Hal ini harus diulang sekurang-kurangnya sekali dalam setahun sebab kebijaksanaan bisa berubah dan juga untuk mengingatkan user.
Sebagian besar kebijaksanaan bisa diterapkan langsung pada sistem operasi atau melalui firewall dan sebagian lainnya tidak.
Suatu kebijaksanaan keamanan harus berisi sedikitnya subyek berikut ini :
Kebijaksanaan untuk staf IT mungkin agak sedikit berbeda dari pada user biasa.
Kebijaksanaan keamanan bisa berubah menjadi banyak sekali, dan informasi vital dapat dengan mudah dilupakan. Kebijaksanaan untuk staf IT bisa juga mengandung kebijaksanaan yang diklasifikasikan untuk user biasa, jadi lebih bijaksana untuk membaginya menjadi beberapa kebijaksanaan kecil; seperti Kebijaksanaan Pemakaian Yang Bisa Diterima, Kebijaksanaan Password, Kebijaksanaan Email dan Kebijaksanaan Akses dari Seberang (Remote Access).
Contoh kebijaksanaan dapat ditemukan pada
File
Grub mendukung 2 cara yang berbeda dalam penambahan password pada file konfigurasi (
timeout 5 password changeme
Ditambahkan password
Ketika menambahkan suatu password md5, Anda perlu mengubah password ke dalam bentuk crypt format
(
Atau hal ini bisa Anda lakukan langsung dalam shell grub:
#/sbin/grub GRUB version 0.92 (640K lower / 3072K upper memory) [ Minimal BASH-like line editing is supported. For the first word, TAB lists possible command completions. Anywhere else TAB lists the possible completions of a device/filename. ] grub> md5crypt Password: ********Typed changeme Encrypted: $1$T7/dgdIJ$dJM.n2wZ8RG.oEiIOwJUs. grub> quit
Kemudian, potong dan tempelkan password Anda pada
timeout 5 password --md5 $1$T7/dgdIJ$dJM.n2wZ8RG.oEiIOwJUs.
Timeout 5 detik akan menjadi bermanfaat jika sistemnya terletak di remote dan harus bisa diboot-ulang tanpa interaksi keyboard. Pelajari lebih lanjut mengenai password grub dengan menjalankan
LILO juga mendukung dua cara untuk menangani password: global dan per-image, keduanya dalam bentuk teks murni.
Yang global diset pada permulaan file konfigurasi :
password=changeme restricted delay=3
Atau bisa juga ditambahkan pada suatu image.
image=/boot/bzImage read-only password=changeme restricted
Jika opsi
Untuk menyimpan informasi baru dalam
Dengan file
Kami menganjurkan Anda mengubah semua baris menjadi komentar selain
vc/1
Logging ekstra harus ditambahkan untuk menangkap peringatan-peringatan atau kesalahan-kesalahan yang akan mengingatkan adanya serangan yang sedang berlangsung atau terjadinya kompromi (pendudukan). Penyerang sering melakukan pemindai (scan) atau probe pada network sebelum menyerang.
Memiliki file log yang mudah dibaca dan dimanage adalah vital. Gentoo Linux mengijinkan Anda untuk memilih salah satu dari 3 logger pada saat instalasi.
Syslogd adalah logger yang paling banyak digunakan pada Linux dan Unix. Tidak memiliki fasilitas rotasi log. Karena itu perlu dibantu dengan menjalankan
Berikut ini adalah
# /etc/syslog.conf Configuration file for syslogd. # # For more information see syslog.conf(5) # manpage. # This is from Debian, we are using it for now # Daniel Robbins, 5/15/99 # # First some standard logfiles. Log by facility. # auth,authpriv.* /var/log/auth.log *.*;auth,authpriv.none -/var/log/syslog cron.* /var/log/cron.log daemon.* -/var/log/daemon.log kern.* -/var/log/kern.log lpr.* -/var/log/lpr.log mail.* /var/log/mail.log user.* -/var/log/user.log uucp.* -/var/log/uucp.log local6.debug /var/log/imapd.log # # Logging for the mail system. Split it up so that # it is easy to write scripts to parse these files. # mail.info -/var/log/mail.info mail.warn -/var/log/mail.warn mail.err /var/log/mail.err # Logging for INN news system # news.crit /var/log/news/news.crit news.err /var/log/news/news.err news.notice -/var/log/news/news.notice # # Some `catch-all' logfiles. # *.=debug;\ auth,authpriv.none;\ news.none;mail.none -/var/log/debug *.=info;*.=notice;*.=warn;\ auth,authpriv.none;\ cron,daemon.none;\ mail,news.none -/var/log/messages # # Emergencies and alerts are sent to everybody logged in. # *.emerg * *.=alert * # # I like to have messages displayed on the console, but only on a virtual # console I usually leave idle. # daemon,mail.*;\ news.=crit;news.=err;news.=notice;\ *.=debug;*.=info;\ *.=notice;*.=warn /dev/tty8 #Setup a remote logging server *.* @logserver # The named pipe /dev/xconsole is for the `xconsole' utility. To use it, # you must invoke `xconsole' with the `-file' option: # # $ xconsole -file /dev/xconsole [...] # # NOTE: adjust the list below, or you'll go crazy if you have a reasonably # busy site.. # #daemon.*,mail.*;\ # news.crit;news.err;news.notice;\ # *.=debug;*.=info;\ # *.=notice;*.=warn |/dev/xconsole local2.* -/var/log/ppp.log
Penyerang kebanyakan akan berusaha menghapus jejaknya dengan mengedit atau menghapus file log. Anda dapat mempersulit penyerang dengan mengirim log pada satu atau lebih server logging pada mesin yang berbeda. Dapatkan informasi lebih lanjut mengenai syslogd dengan menjalankan
Konfigurasi standar pada dasarnya sudah cukup. Jika Anda ingin diberi notifikasi melalui email ketika suatu kesalahan memasukkan password terjadi, gunakan salah satu dari skrip berikut ini.
Untuk postfix:
#! /bin/sh echo "$3" | mail -s "Warning (program : $2)" root
Untuk qmail:
#!/bin/sh echo "To: root Subject:Failure (Warning: $2) $3 " | /var/qmail/bin/qmail-inject -f root
Jangan lupa untuk mengubah skrip supaya bisa dieksekusi dengan
Kemudian buanglah tanda komentar pada baris perintah di bawah Password failures dalam
command = "/usr/local/sbin/mail_pwd_failures.sh"
Syslog-ng memberikan beberapa fitur yang sama seperti syslog dan metalog dengan sedikit perbedaan. Syslog-ng bisa memfilter pesan-pesan berdasarkan tingkat dan isi (seperti metalog), memungkinkan remote logging seperti syslog, menangani log dari syslogd (bahkan aliran data-data dari Solaris), menulis ke TTY, menjalankan program dan dapat juga berfungsi sebagai server untuk logging. Pada dasarnya syslog-ng adalah logger terbaik, kombinasi syslog dan metalog dengan konfigurasi lebih canggih.
Suatu file konfigurasi klasik yang sedikit dimodifikasi.
options { long_hostnames(off); sync(0); }; #source where to read log source src { unix-stream("/dev/log"); internal(); }; source kernsrc { file("/proc/kmsg"); }; #define destinations destination authlog { file("/var/log/auth.log"); }; destination syslog { file("/var/log/syslog"); }; destination cron { file("/var/log/cron.log"); }; destination daemon { file("/var/log/daemon.log"); }; destination kern { file("/var/log/kern.log"); }; destination lpr { file("/var/log/lpr.log"); }; destination user { file("/var/log/user.log"); }; destination mail { file("/var/log/mail.log"); }; destination mailinfo { file("/var/log/mail.info"); }; destination mailwarn { file("/var/log/mail.warn"); }; destination mailerr { file("/var/log/mail.err"); }; destination newscrit { file("/var/log/news/news.crit"); }; destination newserr { file("/var/log/news/news.err"); }; destination newsnotice { file("/var/log/news/news.notice"); }; destination debug { file("/var/log/debug"); }; destination messages { file("/var/log/messages"); }; destination console { usertty("root"); }; destination console_all { file("/dev/tty12"); }; destination xconsole { pipe("/dev/xconsole"); }; #create filters filter f_auth { facility(auth); }; filter f_authpriv { facility(auth, authpriv); }; filter f_syslog { not facility(authpriv, mail); }; filter f_cron { facility(cron); }; filter f_daemon { facility(daemon); }; filter f_kern { facility(kern); }; filter f_lpr { facility(lpr); }; filter f_mail { facility(mail); }; filter f_user { facility(user); }; filter f_debug { not facility(auth, authpriv, news, mail); }; filter f_messages { level(info..warn) and not facility(auth, authpriv, mail, news); }; filter f_emergency { level(emerg); }; filter f_info { level(info); }; filter f_notice { level(notice); }; filter f_warn { level(warn); }; filter f_crit { level(crit); }; filter f_err { level(err); }; filter f_failed { match("failed"); }; filter f_denied { match("denied"); }; #connect filter and destination log { source(src); filter(f_authpriv); destination(authlog); }; log { source(src); filter(f_syslog); destination(syslog); }; log { source(src); filter(f_cron); destination(cron); }; log { source(src); filter(f_daemon); destination(daemon); }; log { source(kernsrc); filter(f_kern); destination(kern); }; log { source(src); filter(f_lpr); destination(lpr); }; log { source(src); filter(f_mail); destination(mail); }; log { source(src); filter(f_user); destination(user); }; log { source(src); filter(f_mail); filter(f_info); destination(mailinfo); }; log { source(src); filter(f_mail); filter(f_warn); destination(mailwarn); }; log { source(src); filter(f_mail); filter(f_err); destination(mailerr); }; log { source(src); filter(f_debug); destination(debug); }; log { source(src); filter(f_messages); destination(messages); }; log { source(src); filter(f_emergency); destination(console); }; #default log log { source(src); destination(console_all); };
Sangat mudah untuk membuat konfigurasi, tetapi juga sangat mudah untuk melupakan sesuatu dalam file konfigurasi karena ukurannya yang raksasa. Pembuat program ini masih menjanjikan beberapa fitur tambahan seperti enkripsi, otentikasi, kompresi dan kontrol MAC (Mandatory Access Control). Dengan pilihan-pilihan ini, maka sempurnalah syslog-ng untuk memenuhi kebutuhan logging jaringan. Karena penyerang tidak bisa memata-matai log.
Dan keuntungan syslog-ng lainnya. Tidak harus dijalankan oleh root!.
Ketika memuat partisi
Sayangnya setting-setting ini dapat dengan mudah dipatahkan dengan menjalankan alur tidak langsung. Bagaimanapun, setting
/dev/sda1 /boot ext2 noauto,noatime 1 1 /dev/sda2 none swap sw 0 0 /dev/sda3 / reiserfs notail,noatime 0 0 /dev/sda4 /tmp reiserfs notail,noatime,nodev,nosuid,noexec 0 0 /dev/sda5 /var reiserfs notail,noatime,nodev 0 0 /dev/sda6 /home reiserfs notail,noatime,nodev,nosuid 0 0 /dev/sda7 /usr reiserfs notail,noatime,nodev,ro 0 0 /dev/cdroms /cdrom0 /mnt/cdrom iso9660 noauto,ro 0 0 proc /proc proc defaults 0 0
Mengatur pembatasan sumber daya bisa sangat efektif untuk pencegahan DoS lokal atau menangani jumlah maksimum login yang diijinkan untuk suatu grup atau user.
* soft core 0 * hard core 0 * hard nproc 15 * hard rss 10000 * - maxlogins 2 @dev hard core 100000 @dev soft nproc 20 @dev hard nproc 35 @dev - maxlogins 10
Jika Anda mendapatkan diri Anda sedang mencoba untuk set
* L2 C0 U15 R10000 kn L10 C100000 U35
Di sini kita lakukan setting default dan setting spesifik untuk user kn.
Limits adalah bagian dari paket sys-apps/shadow. Tidak perlu melakukan setting pembatasan pada file ini jika Anda telah mematikan
Menerapkan kuota pada sistem file akan mencegah user menggunakan atau menulis pada seluruh kapasitas disk. Kuota diaktifkan di kernel dan ditambahkan pada suatu titik pemuatan.
Pilihan kernel diaktifkan dalam konfigurasi kernel di bawah
Mulai dengan instalasi kuota dengan
/dev/sda1 /boot ext2 noauto,noatime 1 1 /dev/sda2 none swap sw 0 0 /dev/sda3 / reiserfs notail,noatime 0 0 /dev/sda4 /tmp ext3 notail,noatime,nodev,nosuid,noexec,usrquota,grpquota 0 0 /dev/sda5 /var ext3 notail,noatime,nodev,usrquota,grpquota 0 0 /dev/sda6 /home ext3 notail,noatime,nodev,nosuid,usrquota,grpquota 0 0 /dev/sda7 /usr reiserfs notail,noatime,nodev,ro 0 0 /dev/cdroms/cdrom0 /mnt/cdrom iso9660 noauto,ro 0 0 proc /proc proc defaults 0 0
Pada setiap partisi yang sudah Anda aktifkan kuotanya, buatlah file kuota
(
# touch /tmp/quota.user # touch /tmp/quota.group # chmod 600 /tmp/quota.user # chmod 600 /tmp/quota.group
Langkah ini harus dilakukan pada setiap partisi dimana kuota diaktifkan. Setelah menambahkan dan melakukan konfigurasi pada file kuota, kita perlu menambahkan skrip
# rc-update add quota default
Kita sekarang akan melakukan konfigurasi pada sistem untuk memeriksa kuota seminggu sekali dengan menambahkan baris berikut pada
0 3 * * 0 /sbin/quotacheck -avug.
Sesudah boot ulang mesinnya, maka sekarang waktunya untuk set kuota untuk user dan grup.
Quotas for user kn: /dev/sda4: blocks in use: 2594, limits (soft = 5000, hard = 6500) inodes in use: 356, limits (soft = 1000, hard = 1500)
Untuk jelasnya silakan baca
Jika kebijaksanaan menyatakan bahwa user harus mengubah password mereka setiap minggu, ubah nilai
File
-:ALL EXCEPT wheel sync:console -:wheel:ALL EXCEPT LOCAL .gentoo.org
Setup akses login akan dilakukan sehingga anggota dari grup wheel bisa login secara lokal atau dari domain gentoo.org. Mungkin ini terlalu paranoid, tetapi lebih baik aman dari pada menyesal.
User normal tidak boleh mempunyai akses ke file konfigurasi atau password. Seorang penyerang bisa mencuri password dari database atau website dan menggunakannya untuk mengganti atau bahkan lebih buruk, menghapus data. Karena itu penting sekali untuk menempatkan perijinan secara benar. Kalau Anda yakin bahwa suatu file hanya digunakan oleh root, ubah ijinnya dengan
# /usr/bin/find / -type f \( -perm -2 -o -perm -20 \) \ -exec ls -lg {} \; 2>/dev/null >writable.txt # /usr/bin/find / -type d \( -perm -2 -o -perm -20 \) \ -exec ls -ldg {} \; 2>/dev/null >>writable.txt
Ini akan membuat suatu file raksasa dengan perijinan dari semua file dengan ijin bisa ditulisi oleh grup atau semua orang. Periksa perijinan dan hapuskan ijin bisa ditulisi oleh dunia pada file setiap orang, dengan menjalankan
File dengan bit SUID or SGID yang diset memungkinkan file tersebut dijalankan dengan hak istimewa user atau grup
# /usr/bin/find / -type f \( -perm -004000 -o -perm -002000 \) \ -exec ls -lg {} \; 2>/dev/null >suidfiles.txt
Akan dihasilkan file yang berisi daftar dari semua file SUID/SGID.
/bin/su /bin/ping /bin/mount /bin/umount /var/qmail/bin/qmail-queue /usr/bin/chfn /usr/bin/chsh /usr/bin/crontab /usr/bin/chage /usr/bin/expiry /usr/bin/sperl5.6.1 /usr/bin/newgrp /usr/bin/passwd /usr/bin/gpasswd /usr/bin/procmail /usr/bin/suidperl /usr/lib/misc/pt_chown /usr/sbin/unix_chkpwd /usr/sbin/traceroute /usr/sbin/pwdb_chkpwd
Secara default Gentoo Linux tidak memiliki banyak file SUID (bergantung pada apa yang Anda install), tetapi Anda mungkin mendapatkan suatu daftar seperti di atas. Kebanyakan perintah-perintah itu tidak boleh digunakan oleh user biasa, hanya root yang boleh. Matikan bit SUID pada
File SUID yang saya miliki pada sistem saya hanyalah
PAM adalah bagian dari pustaka bersama (shared libraries) yang memberikan suatu alternatif untuk melakukan otentikasi dalam program. Rambu
# emerge cracklib
auth required pam_unix.so shadow nullok account required pam_unix.so password required pam_cracklib.so difok=3 retry=3 minlen=8 dcredit=2 ocredit=2 password required pam_unix.so md5 use_authtok session required pam_unix.so
Cracklib akan ditambahkan untuk memastikan user menggunakan password dengan minimum panjang 8 karakter dan berisi minimum 2 angka, 2 tanda lainnya dan setidaknya harus berbeda 3 karakter dari password sebelumnya. Sehingga user akan dipaksa untuk memilih password yang baik (kebijakan password). Periksa dokumen
auth required pam_pwdb.so nullok auth required pam_shells.so auth required pam_nologin.so auth required pam_env.so account required pam_pwdb.so password required pam_cracklib.so difok=3 retry=3 minlen=8 dcredit=2 ocredit=2 use_authtok password required pam_pwdb.so shadow md5 session required pam_pwdb.so session required pam_limits.so
Setiap layanan yang tidak dikonfigurasikan dengan file PAM pada
auth required pam_deny.so auth required pam_warn.so account required pam_deny.so account required pam_warn.so password required pam_deny.so password required pam_warn.so session required pam_deny.so session required pam_warn.so
Adalah suatu cara untuk mengontrol akses ke layanan, biasanya dijalankan oleh inetd (yang tidak dimiliki oleh Gentoo) tetapi bisa juga digunakan oleh xinetd dan layanan-layanan lainnya.
ALL:PARANOID
ALL: LOCAL @wheel time: LOCAL, .gentoo.org
Seperti yang dapat Anda lihat, formatnya sangat mirip dengan
Dimungkinkan juga untuk menjalankan suatu perintah ketika suatu layanan sedang diakses (dapat digunakan ketika mengaktifkan relaying untuk user dial in) tetapi tidak direkomendasikan karena orang-orang cenderung untuk membuat masalah lebih banyak daripada memecahkan masalah. Contoh, bisa jadi Anda mengkonfigurasikan suatu skrip untuk mengirimkan email pada saat seseorang melanggar aturan deny, tetapi kemudian seorang penyerang dapat menjalankan serangan DoS dengan terus menerus melanggar aturan deny. Sehingga dihasilkan banyak aktivitas I/O dan mail, jadi jangan lakukan itu! Baca
Aturan dasar ketika mengkonfigurasikan kernel adalah membuang semua yang tidak Anda perlukan. Sehingga akan dihasilkan kernel yang kecil tetapi juga membuang kerentanan yang mungkin ada dalam driver dan fitur-fitur yang lain.
Pertimbangkan juga untuk mematikan dukungan modul yang bisa dimuat (loadable). Meskipun masih tetap dimungkinkan untuk menambahkan modul-modul (root kits) tanpa fitur ini, tetapi hal ini akan mempersulit penyerang biasa untuk menginstalasi root kit melalui modul kernel.
Banyak parameter kernel dapat diubah melalui file system
Untuk mengubah parameter dan variabel kernel secara dinamis dan langsung, Anda harus mendefinisikan
# /bin/echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all
Setting ini akan membuat kernel mengabaikan semua pesan ping yang juga dikenal sebagai pesan ICMP tipe 0. Alasannya adalah suatu paket IP yang membawa pesan ICMP bisa berisi muatan lain dari pada yang Anda kira. Administrator menggunakan ping sebagai alat diagnostik dan sering mengeluh bahwa mereka tidak bisa melakukan ping. Tidak ada alasan bagi orang luar untuk bisa melakukan ping (ke dalam). Tetapi kadang-kadang berguna juga untuk orang dalam kalau bisa melakukan ping. Jadi solusinya adalah mematikan ICMP tipe 0 di firewall.
# /bin/echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
Setting ini akan mematikan tanggapan pada broadcast ICMP dan akan mencegah serangan Smurf. Serangan Smurf terjadi dengan mengirimkan pesan ICMP tipe 0 pada alamat broadcast network. Biasanya penyerang menggunakan alamat asal yang dispoof (ditumpangi/ditunggangi). Semua komputer pada network tersebut akan menjawab pesan ping dan membebani host yang ditunggangi.
# /bin/echo "0" > /proc/sys/net/ipv4/conf/all/accept_source_route
Jangan menerima paket yang diubah jalur sumbernya (source routed). Penyerang dapat menggunakan pengubahan jalur sumber (source routing) untuk menghasilkan trafik yang seolah-olah dihasilkan dari dalam network Anda, tetapi sebenarnya dirouting balik ke arah darimana ia berasal, sehingga penyerang dapat memasuki network Anda. Source routing sangat jarang digunakan untuk tujuan-tujuan yang sah secara hukum, jadi matikan saja.
# /bin/echo "0" > /proc/sys/net/ipv4/conf/all/accept_redirects
Matikan penerimaan ICMP redirect. ICMP redirect bisa digunakan untuk mengubah tabel routing Anda, dan mungkin berakhir dengan buruk.
# /bin/echo "1" > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
Hidupkan perlindungan terhadap respons pesan kesalahan yang buruk.
# for i in /proc/sys/net/ipv4/conf/*; do /bin/echo "1" > $i/rp_filter done
Hidupkan filtering untuk reverse path. Ini akan membantu memastikan bahwa paket-paket akan menggunakan alamat sumber yang sah, dengan otomatis menolak paket yang masuk jika data table routing untuk alamat sumber mereka tidak cocok dengan interface network darimana mereka berasal. Jadi ada tambahan keamanan yaitu mencegah IP yang ditunggangi.
# /bin/echo "1" > /proc/sys/net/ipv4/conf/all/log_martians
Melakukan log pada paket-paket yang ditunggangi, paket yang source routed dan paket redirect.
# /bin/echo "0" > /proc/sys/net/ipv4/ip_forward
Pastikan bahwa IP forwarding dalam keadaan off. Kita hanya membutuhkannya pada host yang berfungsi sebagai multi-homed.
Semua setting ini akan direset ketika mesin diboot ulang. Jadi saya menganjurkan Anda untuk memasukkannya pada
Sintaks dari
(Manual dengan menggunakan echo): /bin/echo "0" > /proc/sys/net/ipv4/ip_forward(Otomatis pada sysctl.conf): net.ipv4.ip_forward = 0
Patch dari
Dan mungkin masih banyak lagi.
xinetd adalah pengganti inetd (yang tidak dimiliki Gentoo), daemon untuk layanan internet. xinetd mendukung kontrol akses berdasarkan alamat dari host remote dan jam untuk akses. Juga mendukung kemampuan log yang lebih akurat, termasuk waktu start server, alamat host remote, nama user remote, waktu aktifnya server, dan tindakan-tindakan yang diminta.
Seperti layanan yang lain, sebaiknya digunakan konfigurasi default yang baik. Tetapi karena
# emerge xinetd tcp-wrappers
Dan edit file konfigurasi:
defaults { only_from = localhost instances = 10 log_type = SYSLOG authpriv info log_on_success = HOST PID log_on_failure = HOST cps = 25 30 } # This will setup pserver (cvs) via xinetd with the following settings: # max 10 instances (10 connections at a time) # limit the pserver to tcp only # use the user cvs to run this service # bind the interfaces to only 1 ip # allow access from 10.0.0.* # limit the time developers can use cvs from 8am to 5pm # use tpcd wrappers (access control controlled in #/etc/hosts.allow and/etc/hosts.deny ) # max_load on the machine set to 1.0 # The disable flag is per default set to no but I like having # it in case of it should be disabled service cvspserver { socket_type = stream protocol = tcp instances = 10 protocol = tcp wait = no user = cvs bind = 10.0.0.2 only_from = 10.0.0.0 access_times = 8:00-17:00 server = /usr/sbin/tcpd server_args = /usr/bin/cvs --allow-root=/mnt/cvsdisk/cvsroot pserver max_load = 1.0 log_on_failure += RECORD disable = no }
Untuk informasi lebih lanjut, bacalah
Satu-satunya cara pengamanan yang dibutuhkan oleh OpenSSH adalah menghidupkan otentikasi yang lebih kuat berdasarkan enkripsi pada kunci umum (public key). Terlalu banyak site (seperti
#Only enable version 2 Protocol 2 #No direct root access PermitRootLogin no #Turn on Public key authentication PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys #Disable .rhost files and normal password auth. RhostsAuthentication no PasswordAuthentication no PermitEmptyPasswords no AllowHosts *.gentoo.org #Only people in the wheel or admin group can be given access AllowGroups wheel admin #Of all the people in those groups, only kn and bs really have access AllowUsers kn bs #add logging level SyslogFacility AUTH LogLevel INFO #bind ListenAddress 127.0.0.1
Sekarang yang harus dilakukan user adalah membuat suatu kunci (pada mesin dimana mereka akan melakukan login) dengan perintah berikut ini
# /usr/bin/ssh-keygen -t dsa
Dan ketikkan suatu frasa pass
Generating public/private dsa key pair. Enter file in which to save the key (/home/kn/.ssh/id_dsa):[Press enter] Created directory '/home/kn/.ssh'. Enter passphrase (empty for no passphrase):[Enter passphrase] Enter same passphrase again:[Enter passphrase again] Your identification has been saved in /home/kn/.ssh/id_dsa. Your public key has been saved in /home/kn/.ssh/id_dsa.pub. The key fingerprint is: 07:24:a9:12:7f:83:7e:af:b8:1f:89:a3:48:29:e2:a4 kn@knielsen
Tambahan dua file pada direktori
Sekarang user harus menjaga kunci pribadi ini secara baik. Simpanlah pada media yang selalu mereka bawa atau simpan pada workstation mereka (sebutkan hal ini pada kebijaksanaan
Informasi lebih lanjut, kunjungi website
Secara default XFree dikonfigurasikan untuk berlaku sebagai Xserver. Hal ini dapat menjadi berbahaya, karena X menggunakan koneksi TCP yang tidak dienkripsi dan selalu siap untuk melayani xclient.
Tetapi kalau Anda bergantung pada penggunaan workstation Anda sebagai sebuah Xserver, maka gunakan perintah
Solusi lebih aman adalah mematikan fitur ini secara keseluruhan dengan menjalankan X secara
defaultserverargs="-nolisten tcp"
Untuk memastikan bahwa
CONFIG_PROTECT_MASK="/usr/X11R6/bin/startx"
Jika Anda menggunakan manajer login grafis, Anda perlu melakukan pendekatan berbeda.
For
[server-Standard] command=/usr/X11R6/bin/X -nolisten tcp
Untuk
:0 local /usr/bin/X11/X -nolisten tcp
Umumnya, menggunakan FTP (File Transfer Protocol) adalah ide yang buruk. Karena data yang tidak terenkripsi, siap melayani pada 2 port (biasanya port 20 dan 21), dan login anonymous yang biasanya dicari-cari oleh penyerang (untuk memperdagangkan software ilegal). Karena protokol FTP mempunyai beberapa masalah keamanan, Anda sebaiknya menggunakan
Pure-ftpd adalah cabang dari trollftpd yang asli. Dimodifikasi untuk alasan keamanan dan kegunaan oleh Frank Dennis.
Gunakan user virtual (jangan pernah memakai account dari sistem) dengan menghidupkan opsi
AUTH="-lpuredb:/etc/pureftpd.pdb" ## Misc. Others ## MISC_OTHER="-A -E -X -U 177:077 -d -4 -L100:5 -I 15"
Dan konfigurasikan setting
Dokumentasi bisa didapatkan di
Proftpd memiliki beberapa masalah keamanan, tetapi sepertinya sudah banyak diperbaiki. Tetap ada beberapa penambahan:
ServerName "My ftp daemon" #Don't show the ident of the server ServerIdent on "Go away" #Makes it easier to create virtual users RequireValidShell off #Use alternative password and group file (passwd uses crypt format) AuthUserFile "/etc/proftpd/passwd" AuthGroupFile "/etc/proftpd/group" # Permissions Umask 077 # Timeouts and limitations MaxInstances 30 MaxClients 10 "Only 10 connections allowed" MaxClientsPerHost 1 "You have already logged on once" MaxClientsPerUser 1 "You have already logged on once" TimeoutStalled 10 TimeoutNoTransfer 20 TimeoutLogin 20 #Chroot everyone DefaultRoot ~ #don't run as root User nobody Group nogroup #Log every transfer TransferLog /var/log/transferlog #Problems with globbing DenyFilter \*.*/
Dokumentasi bisa didapatkan pada
Vsftpd (singkatan dari very secure ftp) adalah suatu daemon ftp kecil yang berjalan dengan konfigurasi default yang cukup masuk akal. Sederhana dan tidak mempunyai banyak fitur (seperti user virtual) sebagaimana pureftp dan proftp.
anonymous_enable=NO local_enable=YES #read only write_enable=NO #enable logging of transfers xferlog_std_format=YES idle_session_timeout=20 data_connection_timeout=20 nopriv_user=nobody chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chrootlist ls_recurse_enable=NO
Seperti yang Anda lihat, tidak ada jalan lain bagi layanan ini untuk memiliki ijin secara individual dan tidak ada aksi default chroot. Tetapi ketika sampai pada hal setting anonymous, layanan ini cukup bagus. Kadang-kadang menyenangkan kalau memiliki server ftp anonymous (untuk sharing open source) dan vsftpd melakukannya dengan baik pada hal ini.
Apache (1.3.26) dilengkapi dengan file konfigurasi yang cukup baik tetapi kita perlu memperbaiki beberapa hal, seperti binding ke satu alamat dan menjaganya dari kebocoran informasi. Hal-hal ini adalah opsi yang harus diaplikasikan pada file konfigurasi.
Jika Anda tidak mematikan
HTTPD_OPTS="-D SSL"
#Make it listen on your ip Listen 127.0.0.1 BindAddress 127.0.0.1 #It is not a good idea to use nobody or nogroup - #for every service not running as root #(just add the user apache with group apache) User apache Group apache #Will keep apache from telling about the version ServerSignature Off ServerTokens Prod
Apache dikompilasi dengan
Dokumentasi bisa didapatkan pada
Qmail dianggap sebagai server mail yang paling aman. Qmail ditulis dengan dasar pemikiran keamanan (dan paranoia). Qmail tidak mengijinkan relaying secara default dan belum pernah mendapatkan lubang keamanan sejak 1996. Lakukan
Dokumentasi bisa didapatkan di
Djbdns adalah implementasi DNS dimana pembuat software ini ingin mempertaruhkan
Samba adalah protokol untuk share file dengan network Microsoft/Novell dan
[global] #Bind to an interface interfaces = eth0 10.0.0.1/32 #Make sure to use encrypted password encrypt passwords = yes directory security mask = 0700 #allow traffic from 10.0.0.* hosts allow = 10.0.0. #Enables user authentication #(don't use the share mode) security = user #Disallow privileged accounts invalid users = root @wheel #Maximum size smb shows for a share (not a limit) max disk size = 102400 #Uphold the password policy min password length = 8 null passwords = no #Use PAM (if added support) obey pam restrictions = yes pam password change = yes
Pastikan bahwa perijinan diset secara benar pada setiap share dan ingatlah untuk membaca
Sekarang jalankan ulang server dan tambahkan user yang memiliki hak akses ke layanan ini. Hal ini dilakukan melalui
Layanan chroot adalah suatu cara untuk membatasi suatu lingkungan layanan (atau user) kepada hal-hal yang hanya boleh diakses dan tidak bisa mendapatkan akses (atau informasi) yang mengarah ke akses root. Dengan menjalankannya sebagai user yang lain dari root (nobody, apache, named) seorang penyerang hanya dapat mengakses file dengan ijin dari user ini. Jadi seorang penyerang tidak bisa mendapatkan akses root bahkan jika layanan tersebut mempunyai cacat dalam keamanannya.
Beberapa layanan seperti pure-ftpd dan bind memiliki fitur untuk chroot, dan layanan lain tidak. Jika suatu layanan mendukung hal ini, gunakanlah, jika tidak maka Anda harus menemukan cara untuk membuatnya sendiri. Coba kita lihat bagaimana cara membuat suatu chroot, untuk pemahaman dasar dari cara kerja chroot, kita akan melakukan percobaan dengan
Buatlah direktori
Perintah berikut akan menghasilkan daftar pustaka yang digunakan oleh bash.
# ldd /bin/bash libncurses.so.5 => /lib/libncurses.so.5 (0x4001b000) libdl.so.2 => /lib/libdl.so.2 (0x40060000) libc.so.6 => /lib/libc.so.6 (0x40063000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
Sekarang buatlah lingkungan untuk bash.
# mkdir /chroot/bash # mkdir /chroot/bash/bin # mkdir /chroot/bash/lib
Berikutnya, kopikan file yang digunakan oleh bash (
Anda akan menyadari bahwa di dalam chroot tidak ada yang berfungsi kecuali
Pada dasarnya cara ini adalah cara yang sama untuk membuat layanan yang dichroot. Perbedaannya adalah bahwa layanan-layanan kadang-kadang bergantung pada peralatan dan file konfigurasi pada
Cara lain untuk membuat lingkungan yang lebih aman adalah dengan menggunakan lingkungan server virtual. Penerapannya dengan melakukan kopi dari Linux yang ada dan boot dalam mode virtual. Jika server dikompromikan, hanya bagian server virtual yang dikompromikan dan bukan instalasi yang sesungguhnya.
Contoh server virtual:
Orang-orang sering berpikir bahwa firewall akan memberikan keamanan yang paling tinggi, tetapi mereka salah. Dalam banyak kasus, suatu firewall yang dikonfigurasikan secara salah akan menghasilkan keamanan yang paling buruk daripada tidak ada firewallnya sama sekali. Suatu firewall juga merupakan bagian dari software dan harus diperlakukan sama seperti bagian software yang lain, karena ada kemungkinan juga berisi bug.
Jadi pikirkan baik-baik sebelum mengimplementasikan! Apakah Anda memang memerlukannya ? Jika Anda kira Anda memerlukannya, tulislah satu kebijaksanaan bagaimana seharusnya firewall tersebut bekerja, apa tipe firewall dan siapa yang mengoperasikannya. Tetapi pertama-tama baca panduan ini dulu.
Firewall digunakan untuk dua tujuan:
Secara dasar ada tiga macam firewall:
Suatu firewall harus merupakan mesin yang terdedikasi dan tidak menjalankan layanan apapun (atau
Semua lalu lintas network adalah dalam bentuk paket. Sejumlah besar lalu lintas juga dipecah menjadi paket-paket kecil untuk kemudahan penanganan yang kemudian akan digabung kembali di tempat tujuan. Di dalam awalan (header) dari setiap paket terdapat keterangan mengenai bagaimana dan ke mana paket tersebut harus disampaikan. Dan keterangan-keterangan inilah yang digunakan oleh firewall penyaringan paket. Penyaringan dilakukan berdasarkan:
Pada dasarnya penyaringan didasarkan pada semua data yang ada pada awalan paket dan bukan isi paket.
Kelemahannya:
Keuntungannya:
Contoh-contoh penyaring paket yang gratis pada Linux:
Atau gateway tingkat sirkit adalah firewall yang melakukan validasi koneksi sebelum mengijinkan pertukaran data. Artinya firewall ini tidak secara langsung mengijinkan atau menolak paket berdasarkan pada awalan paket tetapi menentukan apakah koneksi antara kedua sisi sah sesuai dengan aturan yang dapat dikonfigurasi, sebelum memulai sesinya dan mengijinkan pertukaran data. Penyaringan didasarkan pada:
Semua trafik divalidasi, dimonitor dan trafik yang tidak diinginkan bisa dihentikan.
Kelemahan:
Gateway tingkat aplikasi adalah proxy untuk aplikasi, bertukar data dengan sistem remote atas nama klien. Aplikasi disembunyikan dari publik secara aman, di belakang DMZ (De-Militarized Zone: bagian dari jaringan internal yang bisa dilihat publik melalui firewall) atau di balik suatu firewall yang sama sekali tidak mengijinkan koneksi dari sisi luar. Penyaringan didasarkan pada:
Keuntungan:
Kelemahan:
Gateway aplikasi dianggap sebagai solusi yang paling aman karena tidak harus dijalankan sebagai root dan host yang berada di belakangnya tidak dapat dijangkau dari Internet.
Contoh gateway aplikasi yang gratis:
Untuk menjalankan iptables, bagian iptables pada kernel harus di-enable dulu. Saya sudah menambahkannya sebagai modul (perintah
Sekarang lakukan percobaan dengan menjalankan
Iptables adalah penyaring paket tipe baru dan diperbaiki habis-habisan dalam kernel Linux 2.4.x. Iptables merupakan kelanjutan dari penyaring paket sebelumnya yaitu ipchains dalam kernel Linux 2.2.x. Salah satu perbaikan utama adalah iptables mampu melakukan penyaringan paket penuh-perhatian. Dengan penyaringan paket penuh-perhatian maka setiap koneksi TCP yang terbentuk bisa dipantau.
Suatu koneksi TCP terdiri dari sekumpulan paket yang berisi informasi mengenai alamat IP sumber, alamat IP tujuan, nomor urutan sehingga paket dapat digabungkan dan tidak dihilangkan. TCP adalah protokol yang berorientasi koneksi, berlawanan dengan UDP yang tidak berorientasi koneksi.
Dengan menguji awalan paket TCP, suatu penyaring paket penuh-perhatian dapat menentukan apakah suatu paket TCP yang diterima adalah bagian dari koneksi yang sudah terbentuk atau bukan dan memutuskan apakah akan menerima atau menolak paket tersebut.
Pada penyaring paket yang tidak penuh-perhatian, dimungkinkan untuk menipu penyaring paket untuk menerima paket yang seharusnya ditolak, dengan cara memanipulasi awalan paket TCP. Ini dilakukan dengan cara memanipulasi rambu SYN atau rambu lain dalam awalan TCP. Penyaring paket penuh-perhatian akan menolak paket-paket tersebut, karena bukan merupakan bagian dari koneksi yang sudah terbentuk. Kemungkinan adanya pemindai siluman (stealth scan) juga akan dihentikan, karena paket-paket tersebut bukan merupakan bagian dari koneksi yang sudah terbentuk.
Iptables memberikan beberapa fitur lain seperti NAT (Network Address Translation) dan pembatasan kecepatan. Pembatasan kecepatan sangat berguna untuk mencegah beberapa serangan DoS (Denial of Service) seperti banjir SYN.
Koneksi TCP terbentuk dengan cara yang disebut jabat tangan tiga langkah. Ketika memulai suatu koneksi TCP, sisi klien mengirimkan suatu paket ke server dengan rambu SYN yang diset. Ketika sisi server menerima paket SYN, server akan menjawab dengan mengirimkan paket SYN+ACK kembali ke sisi klien. Ketika paket SYN+ACK diterima, sisi klien akan menjawab dengan paket ACK yang ketiga dengan efek mengakui koneksi tersebut.
Serangan banjir SYN dilakukan dengan mengirimkan paket SYN tetapi sengaja tidak menjawab paket SYN+ACK. Sisi klien dapat membentuk paket dengan alamat IP sumber yang palsu karena tidak perlu memberikan jawaban. Sisi server akan menambahkan suatu entri pada antrian dari koneksi setengah jalan ketika menerima paket SYN dan kemudian menunggu paket akhir ACK sebelum menghapus entri itu dari antrian. Antrian memiliki jumlah slot yang terbatas dan kalau semua slot dipenuhi maka tidak akan ada koneksi yang baru lagi. Jika paket ACK tidak diterima sebelum suatu periode timeout yang ditentukan maka entri tersebut akan dihapus dari antrian secara otomatis. Setting dari timeout adalah bervariasi tetapi biasanya 30-60 detik atau bahkan lebih. Sisi klien menginisiasikan serangan dengan pembentukan paket SYN yang sangat banyak dengan alamat IP sumber yang berbeda-beda dan mengirimkannya ke alamat IP tujuan secepat-cepatnya dan karena itu memenuhi antrian koneksi setengah jalan dan menghalangi klien lainnya untuk membuat koneksi yang sah dengan server.
Pada saat inilah pembatas kecepatan akan berguna. Pembatasan kecepatan penerimaan paket SYN bisa dilakukan dengan menggunakan
Sekarang beberapa hal praktis!
Ketika iptables dimuat dalam kernel, ada 5 hal di mana Anda bisa menempatkan aturan-aturan Anda. Kelima hal tersebut adalah
Anda dapat menempatkan aturan-aturan secara langsung ke dalam 5 rantai utama atau membuat rantai baru dan menambahkannya sebagai suatu aturan ke rantai yang sudah ada. Iptables mendukung opsi-opsi berikut.
Opsi: | Deskripsi: |
---|---|
Pertama-tama kita akan mencoba untuk menolak semua paket ICMP ke mesin kita, untuk membiasakan kita dengan iptables.
# iptables -A INPUT -p icmp -j DROP
Pertama kita menentukan rantai yang akan ditambahkan setelah protokol dan kemudian tujuan. Tujuan bisa berupa nama dari rantai yang didefinisikan user atau satu dari tujuan khusus
Sekarang coba
# iptables -F
Sekarang perhatikan penyaringan paket penuh-perhatian pada iptables. Jika kita ingin memiliki inspeksi penuh-perhatian pada paket yang masuk pada eth0 kita bisa melakukannya dengan:
# iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
Perintah ini menyebabkan semua paket akan diterima dari suatu koneksi yang sudah terbentuk atau yang berkaitan dalam rantai INPUT. Dan Anda dapat membuang setiap paket yang tidak berada dalam tabel kondisi (state table) dengan melakukan
Modul/Cocok untuk | Deskripsi | Opsi Lanjutan |
---|---|---|
Marilah kita mencoba membuat rantai yang didefinisikan user dan mengaplikasikannya pada salah satu rantai yang sudah ada:
Membuat suatu rantai baru dengan satu aturan # iptables -X mychain # iptables -N mychain # iptables -A mychain -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPTKebijaksanaan default adalah mengijinkan semua trafik keluar. Trafik ke dalam dibuang. # iptables -P OUTPUT ACCEPT # iptables -P INPUT DROPDan tambahkan pada rantai INPUT # iptables -A INPUT -j mychain
Dengan mengaplikasikan aturan pada rantai masukan, kita mendapatkan kebijaksanaan: Semua paket keluar diijinkan dan semua paket yang datang akan dibuang.
Dokumentasi bisa didapatkan pada
Marilah kita lihat contoh penuh. Dalam kasus ini kebijaksanaan firewall/gateway saya menyatakan:
#!/sbin/runscript IPTABLES=/sbin/iptables IPTABLESSAVE=/sbin/iptables-save IPTABLESRESTORE=/sbin/iptables-restore FIREWALL=/etc/firewall.rules DNS1=212.242.40.3 DNS2=212.242.40.51 #inside IIP=10.0.0.2 IINTERFACE=eth0 LOCAL_NETWORK=10.0.0.0/24 #outside OIP=217.157.156.144 OINTERFACE=eth1 opts="${opts} showstatus panic save restore showoptions rules" depend() { need net } rules() { stop ebegin "Setting internal rules" einfo "Setting default rule to drop" $IPTABLES -P FORWARD DROP $IPTABLES -P INPUT DROP $IPTABLES -P OUTPUT DROP #default rule einfo "Creating states chain" $IPTABLES -N allowed-connection $IPTABLES -F allowed-connection $IPTABLES -A allowed-connection -m state --state ESTABLISHED,RELATED -j ACCEPT $IPTABLES -A allowed-connection -i $IINTERFACE -m limit -j LOG --log-prefix \ "Bad packet from ${IINTERFACE}:" $IPTABLES -A allowed-connection -j DROP #ICMP traffic einfo "Creating icmp chain" $IPTABLES -N icmp_allowed $IPTABLES -F icmp_allowed $IPTABLES -A icmp_allowed -m state --state NEW -p icmp --icmp-type \ time-exceeded -j ACCEPT $IPTABLES -A icmp_allowed -m state --state NEW -p icmp --icmp-type \ destination-unreachable -j ACCEPT $IPTABLES -A icmp_allowed -p icmp -j LOG --log-prefix "Bad ICMP traffic:" $IPTABLES -A icmp_allowed -p icmp -j DROP #Incoming traffic einfo "Creating incoming ssh traffic chain" $IPTABLES -N allow-ssh-traffic-in $IPTABLES -F allow-ssh-traffic-in #Flood protection $IPTABLES -A allow-ssh-traffic-in -m limit --limit 1/second -p tcp --tcp-flags \ ALL RST --dport ssh -j ACCEPT $IPTABLES -A allow-ssh-traffic-in -m limit --limit 1/second -p tcp --tcp-flags \ ALL FIN --dport ssh -j ACCEPT $IPTABLES -A allow-ssh-traffic-in -m limit --limit 1/second -p tcp --tcp-flags \ ALL SYN --dport ssh -j ACCEPT $IPTABLES -A allow-ssh-traffic-in -m state --state RELATED,ESTABLISHED -p tcp --dport ssh -j ACCEPT #outgoing traffic einfo "Creating outgoing ssh traffic chain" $IPTABLES -N allow-ssh-traffic-out $IPTABLES -F allow-ssh-traffic-out $IPTABLES -A allow-ssh-traffic-out -p tcp --dport ssh -j ACCEPT einfo "Creating outgoing dns traffic chain" $IPTABLES -N allow-dns-traffic-out $IPTABLES -F allow-dns-traffic-out $IPTABLES -A allow-dns-traffic-out -p udp -d $DNS1 --dport domain \ -j ACCEPT $IPTABLES -A allow-dns-traffic-out -p udp -d $DNS2 --dport domain \ -j ACCEPT einfo "Creating outgoing http/https traffic chain" $IPTABLES -N allow-www-traffic-out $IPTABLES -F allow-www-traffic-out $IPTABLES -A allow-www-traffic-out -p tcp --dport www -j ACCEPT $IPTABLES -A allow-www-traffic-out -p tcp --dport https -j ACCEPT #Catch portscanners einfo "Creating portscan detection chain" $IPTABLES -N check-flags $IPTABLES -F check-flags $IPTABLES -A check-flags -p tcp --tcp-flags ALL FIN,URG,PSH -m limit \ --limit 5/minute -j LOG --log-level alert --log-prefix "NMAP-XMAS:" $IPTABLES -A check-flags -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP $IPTABLES -A check-flags -p tcp --tcp-flags ALL ALL -m limit --limit \ 5/minute -j LOG --log-level 1 --log-prefix "XMAS:" $IPTABLES -A check-flags -p tcp --tcp-flags ALL ALL -j DROP $IPTABLES -A check-flags -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG \ -m limit --limit 5/minute -j LOG --log-level 1 --log-prefix "XMAS-PSH:" $IPTABLES -A check-flags -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP $IPTABLES -A check-flags -p tcp --tcp-flags ALL NONE -m limit \ --limit 5/minute -j LOG --log-level 1 --log-prefix "NULL_SCAN:" $IPTABLES -A check-flags -p tcp --tcp-flags ALL NONE -j DROP $IPTABLES -A check-flags -p tcp --tcp-flags SYN,RST SYN,RST -m limit \ --limit 5/minute -j LOG --log-level 5 --log-prefix "SYN/RST:" $IPTABLES -A check-flags -p tcp --tcp-flags SYN,RST SYN,RST -j DROP $IPTABLES -A check-flags -p tcp --tcp-flags SYN,FIN SYN,FIN -m limit \ --limit 5/minute -j LOG --log-level 5 --log-prefix "SYN/FIN:" $IPTABLES -A check-flags -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP # Apply and add invalid states to the chains einfo "Applying chains to INPUT" $IPTABLES -A INPUT -m state --state INVALID -j DROP $IPTABLES -A INPUT -j icmp_allowed $IPTABLES -A INPUT -j check-flags $IPTABLES -A INPUT -i lo -j ACCEPT $IPTABLES -A INPUT -j allow-ssh-traffic-in $IPTABLES -A INPUT -j allowed-connection einfo "Applying chains to FORWARD" $IPTABLES -A FORWARD -m state --state INVALID -j DROP $IPTABLES -A FORWARD -j icmp_allowed $IPTABLES -A FORWARD -j check-flags $IPTABLES -A FORWARD -o lo -j ACCEPT $IPTABLES -A FORWARD -j allow-ssh-traffic-in $IPTABLES -A FORWARD -j allow-www-traffic-out $IPTABLES -A FORWARD -j allowed-connection einfo "Applying chains to OUTPUT" $IPTABLES -A OUTPUT -m state --state INVALID -j DROP $IPTABLES -A OUTPUT -j icmp_allowed $IPTABLES -A OUTPUT -j check-flags $IPTABLES -A OUTPUT -o lo -j ACCEPT $IPTABLES -A OUTPUT -j allow-ssh-traffic-out $IPTABLES -A OUTPUT -j allow-dns-traffic-out $IPTABLES -A OUTPUT -j allow-www-traffic-out $IPTABLES -A OUTPUT -j allowed-connection #Allow client to route through via NAT (Network Address Translation) $IPTABLES -t nat -A POSTROUTING -o $IINTERFACE -j MASQUERADE eend $? } start() { ebegin "Starting firewall" if [ -e "${FIREWALL}" ]; then restore else einfo "${FIREWALL} does not exists. Using default rules." rules fi eend $? } stop() { ebegin "Stopping firewall" $IPTABLES -F $IPTABLES -t nat -F $IPTABLES -X $IPTABLES -P FORWARD ACCEPT $IPTABLES -P INPUT ACCEPT $IPTABLES -P OUTPUT ACCEPT eend $? } showstatus() { ebegin "Status" $IPTABLES -L -n -v --line-numbers einfo "NAT status" $IPTABLES -L -n -v --line-numbers -t nat eend $? } panic() { ebegin "Setting panic rules" $IPTABLES -F $IPTABLES -X $IPTABLES -t nat -F $IPTABLES -P FORWARD DROP $IPTABLES -P INPUT DROP $IPTABLES -P OUTPUT DROP $IPTABLES -A INPUT -i lo -j ACCEPT $IPTABLES -A OUTPUT -o lo -j ACCEPT eend $? } save() { ebegin "Saving Firewall rules" $IPTABLESSAVE > $FIREWALL eend $? } restore() { ebegin "Restoring Firewall rules" $IPTABLESRESTORE < $FIREWALL eend $? } restart() { svc_stop; svc_start } showoptions() { echo "Usage: $0 {start|save|restore|panic|stop|restart|showstatus}" echo "start) will restore setting if exists else force rules" echo "stop) delete all rules and set all to accept" echo "rules) force settings of new rules" echo "save) will store settings in ${FIREWALL}" echo "restore) will restore settings from ${FIREWALL}" echo "showstatus) Shows the status" }
Anjuran tambahan ketika membuat firewall:
Jika Anda menganggap bahwa iptables itu sulit dimengerti atau membutuhkan waktu lama untuk menghasilkan suatu firewall yang memadai, Anda dapat menggunakan
Squid adalah server proxy yang sangat handal dan dapat menyaring trafik berdasarkan: waktu, ekspresi regular (regex) pada alur/URI, alamat IP sumber dan tujuan, domain, browser, nama user yang diotentikasi, tipe MIME dan nomor port (protokol). Saya mungkin lupa beberapa fitur, tetapi cukup sulit untuk meliputi semua daftar fitur.
Dalam contoh berikut, saya menambahkan penyaringan banner sebagai pengganti penyaringan site porno. Alasannya adalah Gentoo.org
Dalam kasus ini, kebijaksanaan saya berbunyi:
Implementasikan dalam 4 langkah
# Bind to a ip and port http_port 10.0.2.1:3128 # Standard configuration hierarchy_stoplist cgi-bin ? acl QUERY urlpath_regex cgi-bin \? no_cache deny QUERY # Add basic access control lists 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 # Add who can access this proxy server acl localnet src 10.0.0.0/255.255.0.0 # And ports acl SSL_ports port 443 acl Safe_ports port 80 acl Safe_ports port 443 acl purge method PURGE # Add access control list based on regular # expressions within urls acl archives urlpath_regex "/etc/squid/files.acl" acl url_ads url_regex "/etc/squid/banner-ads.acl" # Add access control list based on time and day acl restricted_weekdays time MTWHF 8:00-17:00 acl restricted_weekends time A 8:00-13:00 acl CONNECT method CONNECT #allow manager access from localhost http_access allow manager localhost http_access deny manager # Only allow purge requests from localhost http_access allow purge localhost http_access deny purge # Deny requests to unknown ports http_access deny !Safe_ports # Deny CONNECT to other than SSL ports http_access deny CONNECT !SSL_ports # My own rules # Add a page do be displayed when # a banner is removed deny_info NOTE_ADS_FILTERED url_ads # Then deny them http_access deny url_ads # Deny all archives http_access deny archives # Restrict access to work hours http_access allow localnet restricted_weekdays http_access allow localnet restricted_weekends # Deny the rest http_access deny all
Berikutnya masukkan file-file yang akan Anda batasi. Saya telah menambahkan file zip, viv, exe, mp3, rar, ace, avi, mov, mpg, mpeg, au, ra, arj, tar, gz dan z.
\.[Zz][Ii][pP]$ \.[Vv][Ii][Vv].* \.[Ee][Xx][Ee]$ \.[Mm][Pp]3$ \.[Rr][Aa][Rr]$ \.[Aa][Cc][Ee]$ \.[Aa][Ss][Ff]$ \.[Aa][Vv][Ii]$ \.[Mm][Oo][Vv]$ \.[Mm][Pp][Gg]$ \.[Mm][Pp][Ee][Gg]$ \.[Aa][Uu]$ \.[Rr][Aa]$ \.[Aa][Rr][Jj]$ \.[Tt][Aa][Rr]$ \.[GgZz]$ \.[Zz]$
Kemudian kita menambahkan ekspresi regular untuk mengidentifikasikan banner. Anda mungkin akan sangat lebih kreatif dari saya:
/adv/.*\.gif$ /[Aa]ds/.*\.gif$ /[Aa]d[Pp]ix/ /[Aa]d[Ss]erver /[Aa][Dd]/.*\.[GgJj][IiPp][FfGg]$ /[Bb]annerads/ /adbanner.*\.[GgJj][IiPp][FfGg]$ /images/ad/ /reklame/ /RealMedia/ads/.* ^http://www\.submit-it.* ^http://www\.eads.* ^http://ads\. ^http://ad\. ^http://ads02\. ^http://adaver.*\. ^http://adforce\. adbot\.com /ads/.*\.gif.* _ad\..*cgi /Banners/ /SmartBanner/ /Ads/Media/Images/ ^http://static\.wired\.com/advertising/ ^http://*\.dejanews\.com/ads/ ^http://adfu\.blockstackers\.com/ ^http://ads2\.zdnet\.com/adverts ^http://www2\.burstnet\.com/gifs/ ^http://www.\.valueclick\.com/cgi-bin/cycle ^http://www\.altavista\.com/av/gifs/ie_horiz\.gif
Dan pada bagian akhir kita ingin file ini ditampilkan ketika banner dibuang. Pada dasarnya ini adalah file setengah html dengan gambar gif transparan 4x4.
<HTML> <HEAD> <META HTTP-EQUIV="REFRESH" CONTENT="0; URL=http://localhost/images/4x4.gif"> <TITLE>ERROR: The requested URL could not be retrieved</TITLE> </HEAD> <BODY> <H1>Add filtered!</H1>
Seperti yang Anda lihat di sini, squid memiliki banyak kebisaan dan sangat efektif untuk keperluan filter dan proxy. Bahkan bisa juga menggunakan proxy squid alternatif untuk skala pada network yang sangat besar. Konfigurasi yang saya sertakan di sini umumnya sesuai untuk network kecil dengan jumlah user 1-20.
Tetapi mengkombinasikan saringan paket (iptable) dan gateway aplikasi (squid) adalah mungkin solusi yang terbaik, bahkan jika squid terletak di suatu tempat yang aman dan tidak seorangpun dapat mengaksesnya dari luar. Kita masih perlu memperhitungkan serangan dari dalam.
Sekarang Anda telah mengkonfigurasikan browser klien Anda untuk menggunakan server proxy. Gateway akan mencegah user berhubungan langsung keluar jika mereka tidak menggunakan proxy.
Dapat juga melakukannya secara transparan dengan memanfaatkan iptables untuk melewatkan semua koneksi keluar melalui proxy squid. Ini dilakukan dengan menambahkan aturan forwarding/prerouting pada gateway:
# iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to proxyhost:3128 # iptables -t nat -A PREROUTING -p tcp --dport 443 -j DNAT --to proxyhost:3128
Kita sudah belajar bahwa:
Sekarang, jika Anda
AIDE adalah sistem deteksi penyusupan berdasarkan host (alternatif gratis selain Tripwire). Dan jika Anda sudah mengenal Tripwire, Anda seharusnya tidak mengalami kesulitan untuk mempelajari file konfigurasi AIDE.
File konfigurasi ini berdasarkan ekspresi regular, makro dan aturan-aturan untuk file dan direktori. Kita memiliki makro-makro sebagai berikut:
Makro | Penjelasan | Sintaks |
---|---|---|
Makro-makro ini akan sangat berguna jika Anda memiliki lebih dari satu kotak Gentoo dan ingin menggunakan AIDE di semua kotak tersebut. Tetapi tidak semua mesin menjalankan layanan yang sama atau bahkan usernya berbeda.
Berikutnya, kita memiliki sekumpulan rambu untuk memeriksa pada file dan direktori. Rambu ini merupakan kombinasi perijinan, properti file dan hash/checksum kriptografi.
Rambu | Penjelasan |
---|---|
Dan jika AIDE dikompilasi dengan dukungan mhash, maka terdapat beberapa fitur yang lain:
Rambu | Penjelasan |
---|---|
Sekarang Anda dapat membuat aturan-aturan Anda sendiri berdasarkan rambu-rambu di atas dengan cara mengkombinasikannya seperti :
All=R+a+sha1+rmd160 Norm=s+n+b+md5+sha1+rmd160
Hal terakhir yang perlu kita buat untuk file konfigurasi kita adalah untuk melihat bagaimana menambahkan suatu aturan pada suatu file atau direktori. Pada dasarnya Anda hanya tinggal mengetik nama file atau dir dan aturannya. AIDE akan menambahkan semua file secara rekursif jika Anda tidak menyebutkan sesuatu yang lain secara khusus.
Rambu | Penjelasan |
---|---|
Marilah kita perhatikan contoh yang lengkap
@@ifndef TOPDIR @@define TOPDIR / @@endif @@ifndef AIDEDIR @@define AIDEDIR /etc/aide @@endif @@ifhost smbserv @@define smbactive @@endif # The location of the database to be read. database=file:@@{AIDEDIR}/aide.db # The location of the database to be written. database_out=file:aide.db.new verbose=20 report_url=stdout # Rule definition All=R+a+sha1+rmd160 Norm=s+n+b+md5+sha1+rmd160 @@{TOPDIR} Norm !@@{TOPDIR}etc/aide !@@{TOPDIR}dev !@@{TOPDIR}proc !@@{TOPDIR}root !@@{TOPDIR}tmp !@@{TOPDIR}var/log !@@{TOPDIR}var/run !@@{TOPDIR}usr/portage @@ifdef smbactive !@@{TOPDIR}etc/smb/private/secrets.tdb @@endif =@@{TOPDIR}home Norm
Pada contoh di atas, dengan beberapa makro kita menetapkan di mana topdir untuk mulai dan di mana direktori AIDE berada. AIDE memeriksa file
Sesudah melakukan perubahan pada konfigurasi, Anda harus membuat file db Anda dengan menjalankan
0 3 * * * /usr/bin/aide -u
Dalam kasus ini, AIDE berjalan sekali pada pukul 3 pagi. Saya memilih jam ini karena saya tidak ingin mengganggu user ketika mereka bekerja. Sebagai catatan, saya menggunakan opsi
Sekarang ada beberapa masalah dengan menyimpan file db secara lokal karena penyerang akan (bila dia tahu kalau aide dipasang) berusaha mengubah file db, memperbarui file db atau memodifikasi
Informasi bisa didapatkan pada halaman proyek
Snort adalah suatu Network Intrusion Detection System (NIDS). Untuk menginstalasi dan mengkonfigurasikannya, gunakan contoh berikut.
# useradd snort -d /var/log/snort -s /dev/null # chown -R snort /var/log/snort
PIDFILE=/var/run/snort_eth0.pid MODE="full" NETWORK="10.0.0.0/24" LOGDIR="/var/log/snort" CONF=/etc/snort/snort.conf SNORT_OPTS="-D -s -u snort -dev -l $LOGDIR -h $NETWORK -c $CONF"
Step 1 var HOME_NET 10.0.0.0/24 var EXTERNAL_NET any var SMTP $HOME_NET var HTTP_SERVERS $HOME_NET var SQL_SERVERS $HOME_NET var DNS_SERVERS [10.0.0.2/32,212.242.40.51/32] var RULE_PATH ./Step 2 preprocessor frag2 preprocessor stream4: detect_scans detect_state_problems detect_scans disable_evasion_alerts preprocessor stream4_reassemble: ports all preprocessor http_decode: 80 8080 unicode iis_alt_unicode double_encode iis_flip_slash full_whitespace preprocessor rpc_decode: 111 32771 preprocessor bo: -nobrute preprocessor telnet_decodeStep 3 include classification.configStep 4 include $RULE_PATH/bad-traffic.rules include $RULE_PATH/exploit.rules include $RULE_PATH/scan.rules include $RULE_PATH/finger.rules include $RULE_PATH/ftp.rules include $RULE_PATH/telnet.rules include $RULE_PATH/smtp.rules include $RULE_PATH/rpc.rules include $RULE_PATH/rservices.rules include $RULE_PATH/dos.rules include $RULE_PATH/ddos.rules include $RULE_PATH/dns.rules include $RULE_PATH/tftp.rules include $RULE_PATH/web-cgi.rules include $RULE_PATH/web-coldfusion.rules include $RULE_PATH/web-iis.rules include $RULE_PATH/web-frontpage.rules include $RULE_PATH/web-misc.rules include $RULE_PATH/web-attacks.rules include $RULE_PATH/sql.rules include $RULE_PATH/x11.rules include $RULE_PATH/icmp.rules include $RULE_PATH/netbios.rules include $RULE_PATH/misc.rules include $RULE_PATH/attack-responses.rules include $RULE_PATH/backdoor.rules include $RULE_PATH/shellcode.rules include $RULE_PATH/policy.rules include $RULE_PATH/porn.rules include $RULE_PATH/info.rules include $RULE_PATH/icmp-info.rules include $RULE_PATH/virus.rules # include $RULE_PATH/experimental.rules include $RULE_PATH/local.rules
config classification: not-suspicious,Not Suspicious Traffic,3 config classification: unknown,Unknown Traffic,3 config classification: bad-unknown,Potentially Bad Traffic, 2 config classification: attempted-recon,Attempted Information Leak,2 config classification: successful-recon-limited,Information Leak,2 config classification: successful-recon-largescale,Large Scale Information Leak,2 config classification: attempted-dos,Attempted Denial of Service,2 config classification: successful-dos,Denial of Service,2 config classification: attempted-user,Attempted User Privilege Gain,1 config classification: unsuccessful-user,Unsuccessful User Privilege Gain,1 config classification: successful-user,Successful User Privilege Gain,1 config classification: attempted-admin,Attempted Administrator Privilege Gain,1 config classification: successful-admin,Successful Administrator Privilege Gain,1 # NEW CLASSIFICATIONS config classification: rpc-portmap-decode,Decode of an RPC Query,2 config classification: shellcode-detect,Executable code was detected,1 config classification: string-detect,A suspicious string was detected,3 config classification: suspicious-filename-detect,A suspicious filename was detected,2 config classification: suspicious-login,An attempted login using a suspicious username was detected,2 config classification: system-call-detect,A system call was detected,2 config classification: tcp-connection,A TCP connection was detected,4 config classification: trojan-activity,A Network Trojan was detected, 1 config classification: unusual-client-port-connection,A client was using an unusual port,2 config classification: network-scan,Detection of a Network Scan,3 config classification: denial-of-service,Detection of a Denial of Service Attack,2 config classification: non-standard-protocol,Detection of a non-standard protocol or event,2 config classification: protocol-command-decode,Generic Protocol Command Decode,3 config classification: web-application-activity,access to a potentially vulnerable web application,2 config classification: web-application-attack,Web Application Attack,1 config classification: misc-activity,Misc activity,3 config classification: misc-attack,Misc Attack,2 config classification: icmp-event,Generic ICMP event,3 config classification: kickass-porn,SCORE! Get the lotion!,1
Informasi lebih lanjut bisa didapatkan pada website