Panduan Keamanan Gentoo Linux Kim Nielsen John P. Davis Eric R. Stockbridge Carl Anderson Jorge Paulo Sven Vermeulen Benny Chuang Sune Jeppesen Tiemo Kieft Zack Gilburd Panduan ini adalah panduan langkah demi langkah untuk meningkatkan keamanan sistem Gentoo Linux. 0.4.21 March 9, 2004 Pendahuluan

Panduan ini ditujukan kepada mereka yang menggunakan Gentoo Linux dalam lingkungan server atau mereka yang merasa butuh keamanan sistem yang lebih baik.

Catatan : Jika Anda tertarik lebih jauh pada hal-hal mengenai keamanan Gentoo setelah membaca panduan ini, maka Anda dipersilakan untuk mengunjungi Proyek Hardened Gentoo
Pertimbangan Pra-Instalasi
Keamanan Fisik

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.

Perencanaan Daemon/Layanan

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 satupun layanan, kecuali mungkin sshd.

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.

Skema Partisi

Aturan emas :

  • Setiap cabang direktori dimana user mempunyai hak untuk menulis (/home dan /tmp /var), harus berada pada partisi terpisah dan diterapkan kuota disk. Portage menggunakan /var/tmp untuk mengkompilasi file-file, sehingga partisinya harus besar. Hal ini akan mengurangi resiko pemenuhan direktori / oleh user.
  • Setiap cabang direktori yang akan Anda gunakan untuk menginstalasi perangkat lunak non distribusi harus berada di partisi yang berbeda. Menurut Standard Hirarki File, direktori ini adalah /opt atau /usr/local. Kalau dua direktori ini berada pada partisi yang berbeda, maka kedua direktori ini tidak akan terhapus ketika melakukan instalasi ulang sistem.
  • Usahakan untuk memindahkan data statis ke partisinya sendiri, dan muat partisi tersebut pada moda baca-saja (read-only). Kalau Anda benar-benar paranoid, Anda bisa mencoba menyimpan data statis pada media baca-saja, seperti CDROM.
User root

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'

  • Selalu membuat user biasa untuk operasi sehari-hari dan jika user ini memerlukan akses sebagai root, tambahkan user tersebut dalam grup wheel. Hal ini memungkinkan user tersebut untuk su ke root.
  • Jangan pernah menjalankan X atau aplikasi user lainnya dengan akses root.
  • Selalu menggunakan alur mutlak (absolute path) ketika beroperasi sebagai root. Root bisa tertipu dengan menjalankan aplikasi yang lain daripada yang dikira dilakukannya. Sebagai contoh, jika seseorang mencampuradukkan ALUR(PATH) dan su ke root tanpa menggunakan su -. Maka root akan menggunakan alur dari user.
  • Jika user hanya memerlukan beberapa perintah dari seluruh perintah yang bisa dilakukan oleh root, pertimbangkan untuk menggunakan sudo, tetapi harap berhati-hati dengan sudo ini !
  • Jangan pernah meninggalkan terminal Anda, pada saat Anda mengakses sebagai 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.

Kebijaksanaan Keamanan

Ada beberapa alasan mengapa kebijaksanaan keamanan diperlukan.

  • Anda tidak bisa klaim bahwa Anda mempunyai jaringan yang aman tanpa suatu definisi apa yang aman menurut Anda.
  • Hampir mustahil untuk menangkap penyerang yang potensial, membenahi permasalahan jaringan, atau melakukan audit, tanpa memata-matai lalu lintas jaringan atau melihat direktori home pribadi. Dan memata-matai tanpa ijin dari user adalah ilegal di sebagian besar negara-negara di dunia. Dan karena sekitar 60% dari penyerangan yang ada sekarang ini berasal dari dalam organisasi, maka penting bagi Anda untuk tetap membuka mata.
  • Anda tidak bisa mengharapkan user memikirkan keamanan sistemnya sendiri, jika Anda tidak pernah menjelaskan betapa pentingnya atau bagaimana mereka harus melindungi diri mereka sendiri dan rekan-rekannya.
  • Petunjuk dan dokumentasi yang baik selalu membuahkan hasilnya.
  • Polisi atau penegak hukum federal tidak bisa membantu Anda menangkap penyerang, jika mereka tidak tahu konfigurasi network Anda atau layanan dari Anda.
  • Apa yang akan Anda lakukan kalau terjadi suatu serangan ? Anda perlu mendefinisikan tindakan Anda dan kepada siapa Anda harus melapor. Apakah Anda hanya menelepon polisi atau tim CERT pada setiap kejadian ? Mereka tidak akan menanggapi Anda secara serius!

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.

Buatlah kebijaksanaan yang mudah dibaca dan sangat akurat pada setiap subyek.

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 :

  • Penggunaan yang bisa diterima
    • Screen saver
    • Penanganan password
    • Download software dan instalasinya
    • Informasi yang menyatakan bahwa user selalu diawasi
    • Penggunaan software anti virus
  • Penanganan informasi sensitif (segala bentuk form tertulis, kertas atau digital)
    • Bersihkan meja dan amankan informasi yang terklasifikasi
    • Matikan komputer sebelum meninggalkannya
    • Penggunaan enkripsi
    • Serah terima kunci kepada rekan kerja yang bisa dipercaya
    • Penanganan materi terklasifikasi pada saat tugas keluar kantor
  • Penanganan perangkat komputer pada saat tugas keluar kantor
    • Penanganan laptop pada saat berada di perjalanan dan tinggal di hotel

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 The SANS Security Policy Project. Jika Anda hanya mempunyai jaringan yang kecil dan mengira bahwa kebijaksanaan ini terlalu banyak, Anda perlu melihat ke Site Security Handbook.

Memperketat keamanan setelah/selama instalasi
Rambu-rambu USE

File make.conf berisi rambu-rambu USE yang didefinisikan oleh user dan file /etc/make.profile/make.defaults berisi rambu-rambu USE default untuk Gentoo Linux. Untuk panduan ini, rambu-rambu yang penting adalah pam (Pluggable Authentication Modules), tcpd (TCP wrappers) dan ssl (Secure Socket Layer). Semuanya ada dalam rambu-rambu USE default.

Password GRUB

Grub mendukung 2 cara yang berbeda dalam penambahan password pada file konfigurasi (/boot/grub/grub.conf). Salah satu cara adalah dengan menggunakan password teks murni dan cara lain adalah dengan enkripsi md5+salt.

timeout 5
password changeme

Ditambahkan password changeme dan jika tidak ada password yang dimasukkan maka setting boot default yang akan digunakan.

Ketika menambahkan suatu password md5, Anda perlu mengubah password ke dalam bentuk crypt format (man crypt) yang sama formatnya dengan /etc/shadow. Informasi lebih lanjut silakan lihat man crypt. Password changeme yang terenkripsi akan terlihat seperti ini $1$T7/dgdIJ$dJM.n2wZ8RG.oEiIOwJUs.

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 /boot/grub/grub.conf.

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 info grub.

Password LILO

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 restricted tidak dimasukkan, maka prompt password akan muncul setiap kali menjalankannya.

Untuk menyimpan informasi baru dalam lilo.conf Anda perlu menjalankan /sbin/lilo.

Pengetatan penggunaan konsol

Dengan file /etc/securetty, Anda bisa menentukan perangkat tty (terminal) mana untuk login sebagai root.

Kami menganjurkan Anda mengubah semua baris menjadi komentar selain vc/1. Hal ini menyebabkan root hanya dapat login sekali dan hanya pada satu terminal.

Pengguna dalam grup wheel masih dapat melakukan su - untuk menjadi root pada TTY yang lain.
vc/1
Logging Lebih Lanjut

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.

Logging: Syslogd

Syslogd adalah logger yang paling banyak digunakan pada Linux dan Unix. Tidak memiliki fasilitas rotasi log. Karena itu perlu dibantu dengan menjalankan /usr/sbin/logrotate dalam suatu cron job dan dikonfigurasikan dalam /etc/logrotate.conf. Sesering apa rotasi log dilakukan bergantung pada beban sistem.

Berikut ini adalah syslog.conf standar dengan beberapa fitur tambahan. Kami sudah membuang tanda komentar pada baris cron dan tty dan menambahkan suatu server untuk logging secara remote. Untuk meningkatkan keamanan, Anda bisa menambahkan log di dua tempat yang berbeda.

#  /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 man syslog.

Metalog

Metalog dari Frank Dennis tidak bisa log ke server remote, tetapi keuntungannya ada pada kinerja dan fleksibilitas logging. Metalog dapat melakukan log berdasarkan nama program, urgensi, fasilitas (seperti syslogd) dan memiliki kemampuan pencocokan ekspresi regular (regular expression matching) dan bisa menjalankan skrip eksternal jika suatu pola spesifik terjadi. Sangat bagus untuk mengambil tindakan bila diperlukan.

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 /bin/chmod +x /usr/local/sbin/mail_pwd_failures.sh

Kemudian buanglah tanda komentar pada baris perintah di bawah Password failures dalam /etc/metalog/metalog.conf sebagai berikut:

command  = "/usr/local/sbin/mail_pwd_failures.sh"
Syslog-ng

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!.

Pemuatan Partisi

Ketika memuat partisi ext2, ext3 atau reiserfs, Anda mempunyai beberapa pilihan yang bisa Anda aplikasikan pada /etc/fstab. Pilihan-pilihan tersebut adalah :

  • nosuid - Akan mengabaikan bit SUID dan membuatnya seperti file biasa
  • noexec - Akan mencegah eksekusi file dari partisi ini
  • nodev - Mengabaikan peralatan

Sayangnya setting-setting ini dapat dengan mudah dipatahkan dengan menjalankan alur tidak langsung. Bagaimanapun, setting /tmp ke noexec akan menghentikan sekitar 99% dari semua skrip kanak-kanak karena disain eksploitasi mereka adalah untuk dijalankan langsung dari /tmp.

/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
Penempatan /tmp dalam moda noexec dapat mencegah eksekusi beberapa skrip tertentu. Kuota disk lihatlah Bagian Quota. Saya tidak melakukan setting /var ke noexec atau nosuid bahkan bila file-file tersebut secara normal tidak dijalankan dari titik pemuatan ini. Alasannya adalah qmail diinstalasi dalam /var/qmail dan harus diijinkan untuk menjalankan dan mengakses suatu file SUID. Saya melakukan setup /usr dalam moda baca-saja karena saya tidak pernah menulis apapun di sana, kecuali kalau saya mau update Gentoo. Kemudian saya akan memuat ulang sistem file dalam moda baca-tulis, perbarui dan muat ulang kembali. Bahkan jika Anda tidak menggunakan qmail, Gentoo masih membutuhkan setting bit yang bisa dieksekusi pada /var/tmp karena ebuilds dibuat di sini. Tetapi suatu alur alternatif bisa dibuat jika Anda tetap bertahan untuk menempatkan /var dalam moda noexec.
Pembatasan user/group
/etc/security/limits.conf

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 nproc atau maxlogins ke 0, mungkin sebaiknya Anda hapus saja user tersebut. Contoh di atas mengubah setting grup dev untuk proses, file inti dan maxlogins. Sisanya diset ke nilai defaultnya.

/etc/security/limits.conf adalah bagian dari paket PAM dan hanya berlaku untuk aplikasi yang menggunakan PAM.
/etc/limits

/etc/limits sangat mirip dengan file limit /etc/security/limits.conf. Perbedaannya hanyalah terletak pada format dan hanya bekerja pada user atau wild card (bukan grup). Marilah kita melihat contoh konfigurasi berikut:

*   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 pam dalam make.conf atau PAM yang tidak dikonfigurasi secara benar.

Kuota Pastikan bahwa sistem file dimana Anda bekerja mendukung kuota. ReiserFS tidak termasuk di dalamnya!

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 File systems->Quota support. Terapkan setting berikut, kompilasi ulang kernel dan boot kembali menggunakan kernel baru.

Mulai dengan instalasi kuota dengan emerge quota. Kemudian modifikasi /etc/fstab Anda dan tambahkan usrquota dan grpquota pada partisi yang akan Anda batasi penggunaan disknya seperti contoh di bawah ini.

/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 (quota.user dan quota.group) dan tempatkan dalam root dari partisi tersebut.

# 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 quota pada runlevel boot.

# rc-update add quota default

Kita sekarang akan melakukan konfigurasi pada sistem untuk memeriksa kuota seminggu sekali dengan menambahkan baris berikut pada /etc/crontab:

0 3 * * 0 /sbin/quotacheck -avug.

Sesudah boot ulang mesinnya, maka sekarang waktunya untuk set kuota untuk user dan grup. edquota -u kn akan memulai editor yang didefinisikan dalam $EDITOR (defaultnya adalah nano) dan Anda bisa edit kuota dari user kn. edquota -g akan melakukan hal yang sama untuk grup saja.

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 man edquota atau Quota mini howto.

/etc/login.defs

Jika kebijaksanaan menyatakan bahwa user harus mengubah password mereka setiap minggu, ubah nilai PASS_MAX_DAYS ke 14 dan PASS_WARN_AGE ke 7. Juga disarankan bahwa Anda menggunakan password aging, karena metoda brute force akan menemukan password apapun, hanya persoalan waktu saja. Kami juga menganjurkan Anda untuk set LOG_OK_LOGINS ke yes.

/etc/login.access

File login.access juga merupakan bagian dari paket sys-apps/shadow, yang memanfaatkan tabel kontrol akses untuk login. Tabel itu digunakan untuk mengatur mereka yang bisa dan tidak bisa login berdasarkan nama user, nama grup atau nama host. Secara default, semua user pada sistem diijinkan untuk login sehingga file itu hanya berisi komentar dan contoh saja. Apapun yang Anda amankan, server maupun workstation, kami menganjurkan Anda untuk set file ini sehingga tidak ada orang lain selain Anda (admin) yang punya hak akses ke konsol.

Setting ini tidak berlaku untuk root.
-:ALL EXCEPT wheel sync:console
-:wheel:ALL EXCEPT LOCAL .gentoo.org
Hati-hati ketika melakukan konfigurasi pada pilihan ini, karena suatu kesalahan akan mengakibatkan Anda tidak bisa mengakses mesin itu jika Anda tidak mempunyai hak akses root. Setting ini tidak berlaku untuk SSH, karena SSH tidak menjalankan /bin/login secara default. Setting ini bisa diaktifkan dengan menggunakan UseLogin yes pada /etc/ssh/sshd_config. SSH akan menggunakan login dan setting tersebut.

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.

Perijinan file
Bisa dibaca oleh Dunia (World)

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 0600 dan pastikan file itu adalah milik user yang tepat dengan menggunakan chown.

Bisa ditulisi oleh Dunia/Grup (World/Group)
# /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 /bin/chmod o-w pada file-file tersebut.

File SUID/SGID

File dengan bit SUID or SGID yang diset memungkinkan file tersebut dijalankan dengan hak istimewa user atau grup pemilik dan bukan user yang mengeksekusi filenya. Biasanya bit-bit ini digunakan pada file-file yang harus dijalankan oleh root untuk melaksanakan apa yang harus dilakukan. File-file ini akan membawa ke kompromi root lokal (jika terdapat lubang keamanan). Hal ini sangat berbahaya dan file-file dengan bit SUID atau SGID yang diset harus dihindari sebisanya. Jika Anda tidak menggunakan file-file ini, terapkan chmod 0 pada file-file tersebut atau unmerge paket pemilik mereka (cek paket mana yang memiliki mereka dengan menggunakan qpkg -f. Jika Anda belum memilikinya, silakan ketik emerge gentoolkit). Atau matikan bit SUID dengan chmod -s.

# /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 ping, mount, umount, chfn, chsh, newgrp, suidperl, pt_chown dan traceroute dengan chmod -s pada setiap file. Jangan buang bit pada su, qmail-queue atau unix_chkpwd. Kalau dibuang, maka Anda tidak bisa melakukan su dan menerima mail. Dengan membuang bit ini, maka Anda menghilangkan kemungkinan dari user biasa (atau seorang penyerang) untuk mendapatkan akses root melalui file-file ini.

File SUID yang saya miliki pada sistem saya hanyalah su, passwd, gpasswd, qmail-queue, unix_chkpwd dan pwdb_chkpwd. Tetapi jika Anda menjalankan X, maka Anda mungkin punya lebih banyak, karena X membutuhkan akses.

PAM (Pluggable Authentication Modules)

PAM adalah bagian dari pustaka bersama (shared libraries) yang memberikan suatu alternatif untuk melakukan otentikasi dalam program. Rambu pam pada USE secara default adalah on. Jadi setting PAM pada Gentoo Linux adalah cukup lumayan, tetapi selalu ada ruang untuk perbaikan. Pertama-tama lakukan instalasi cracklib.

# 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 PAM untuk opsi yang lainnya.

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 /etc/pam.d akan menggunakan aturan-aturan dalam /etc/pam.d/other. Setting default adalah deny seperti yang seharusnya begitu. Tetapi sepertinya saya akan mempunyai log yang sangat banyak dan karena itu saya menambahkan pam_warn.so. Konfigurasi terakhir adalah pam_limits yang dikontrol oleh /etc/security/limits.conf. Lihat bagian /etc/security/limits.conf untuk setting mengenai ini.

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
TCP Wrappers

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.

Layanan ini harus menjalankan tcpd pada argumen servernya (dalam xinetd). Lihat bab mengenai xinetd untuk informasi lebih lanjut.
ALL:PARANOID
ALL: LOCAL @wheel
time: LOCAL, .gentoo.org

Seperti yang dapat Anda lihat, formatnya sangat mirip dengan /etc/login.access. Tcpd mendukung layanan khusus dan mereka tidak bekerja dalam area yang sama dengan keamanan. Setting ini hanya berlaku untuk layanan-layanan yang menggunakan tcp wrappers.

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 man 5 hosts_access untuk informasi lebih lanjut.

Keamanan Kernel
Membuang fungsi

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.

/proc (kernel flags)

Banyak parameter kernel dapat diubah melalui file system /proc atau dengan menggunakan sysctl.

Untuk mengubah parameter dan variabel kernel secara dinamis dan langsung, Anda harus mendefinisikan CONFIG_SYSCTL di kernel Anda. Setting ini default di kernel 2.4 standar.

# /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
Jika Anda menghidupkan IP forwarding, Anda akan mendapatkan hasil ini.

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.

Tetapi menghidupkan filtering reverse path dapat menjadi masalah jika Anda menggunakan routing asimetris (paket dari Anda ke suatu host melalui jalur yang berbeda dengan paket dari host tersebut ke Anda) atau jika Anda mengoperasikan host yang tidak melakukan routing tetapi mempunyai beberapa alamat IP pada interface yang berbeda.
# /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 /etc/sysctl.conf yang secara otomatis akan dipanggil oleh skrip init /etc/init.d/bootmisc.

Sintaks dari /etc/sysctl.conf cukup singkat. Buanglah /proc/sys/ dari alur yang disebutkan sebelumnya dan gantikan / dengan .:

(Manual dengan menggunakan echo):
/bin/echo "0" > /proc/sys/net/ipv4/ip_forward

(Otomatis pada sysctl.conf):
net.ipv4.ip_forward = 0
Grsecurity

Patch dari Grsecurity adalah standar di Gentoo kernel sources tetapi dimatikan secara default. Konfigurasikan kernel Anda sebagaimana biasanya Anda kerjakan dan kemudian konfigurasikan opsi Grsecurity. Penjelasan mendalam mengenai opsi Grsecurity (versi 1.9) dapat dilihat pada halaman proyek Gentoo Hardened.

Grsec-sources yang terbaru berisi dukungan untuk versi 2.* dari Grsecurity. Informasi lebih lanjut dari set patch Grsecurity yang diperbarui dapat dilihat pada dokumen yang ada di halaman Grsecurity.

Kerneli

Kerneli adalah patch yang menambahkan enkripsi pada kernel yang ada. Dengan melakukan patch kernel Anda, Anda akan mendapatkan opsi-opsi baru seperti: Cryptographic ciphers, digest algorithms dan cryptographic loop filters.

Patch kerneli untuk saat ini masih belum berada dalam versi stabil untuk kernel terbaru, jadi hati-hati menggunakannya.
Patch-patch kernel yang lain
  • The OpenWall Project
  • Linux Intrusion Detection System
  • Rule Set Based Access Control
  • NSA's security enhanced kernel
  • Wolk

Dan mungkin masih banyak lagi.

Layanan untuk Pengamanan
Menggunakan xinetd

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 xinetd berjalan sebagai root dan mendukung protokol-protokol yang mungkin tidak Anda ketahui benar cara kerjanya, maka kami tidak menganjurkan Anda menggunakannya. Tetapi jika Anda tetap ingin menggunakannya, berikut ini adalah cara untuk menambahkan keamanan padanya:

# 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 man 5 xinetd.conf.

ssh

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 http://www.sourceforge.net, http://www.php.net dan http://www.apache.org) menderita penyusupan ke sistem mereka disebabkan password yang lemah atau password yang jelek.

#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 ~/.ssh/ Anda yaitu id_dsa dan id_dsa.pub. File id_dsa adalah kunci pribadi Anda dan harus Anda simpan. File lain id_dsa.pub adalah untuk didistribusikan ke setiap server yang bisa Anda akses. Tambahkan kunci pada direktori home user dalam ~/.ssh/authorized_keys dan user seharusnya sudah bisa login.

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 password).

Informasi lebih lanjut, kunjungi website OpenSSH.

X

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.

Kalau Anda tidak memerlukan layanan ini, maka disable saja!

Tetapi kalau Anda bergantung pada penggunaan workstation Anda sebagai sebuah Xserver, maka gunakan perintah /usr/X11R6/bin/xhost dengan hati-hati. Perintah ini memungkinkan klien dari host lain untuk terhubung dan menggunakan tampilan Anda. Ini berguna bagi Anda yang membutuhkan aplikasi X yang berjalan pada mesin yang lain dan satu-satunya cara adalah melalui network. Sintaknya adalah /usr/X11R6/bin/xhost +hostname

Jangan pernah menggunakan fitur xhost +! Hal ini akan mengijinkan semua klien untuk berhubungan dan memegang kendali atas X Anda. Jika seorang penyerang dapat mengakses X Anda, maka dia dapat merekam dalam log semua ketikan Anda dan mengontrol desktop Anda. Jika Anda harus menggunakannya selalu ingatlah untuk memastikan satu host yang diijinkan.

Solusi lebih aman adalah mematikan fitur ini secara keseluruhan dengan menjalankan X secara startx -- -nolisten tcp atau mematikannya secara permanen pada konfigurasi.

defaultserverargs="-nolisten tcp"

Untuk memastikan bahwa startx tidak ditulis ulang ketika melakukan emerge versi baru dari XFree, Anda harus melindunginya. Tambahkan baris berikut pada /etc/make.conf:

CONFIG_PROTECT_MASK="/usr/X11R6/bin/startx"

Jika Anda menggunakan manajer login grafis, Anda perlu melakukan pendekatan berbeda.

For gdm (Gnome Display Manager)

[server-Standard]
command=/usr/X11R6/bin/X -nolisten tcp

Untuk xdm (X Display Manager) dan kdm (Kde Display Manager)

:0 local /usr/bin/X11/X -nolisten tcp 
FTP

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 sftp atau HTTP sebagai penggantinya. Jika tidak, amankan layanan Anda sebaik-baiknya dan siapkan diri Anda.

Pure-ftpd

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. Set menjadi -lpuredb:/etc/pureftpd.pdb dan membuat user Anda dengan menggunakan /usr/bin/pure-pw.

AUTH="-lpuredb:/etc/pureftpd.pdb"

## Misc. Others ##
MISC_OTHER="-A -E -X -U 177:077 -d -4 -L100:5 -I 15"

Dan konfigurasikan setting MISC_OTHER Anda sehingga tidak mengijinkan anonymous (-E), chroot semua orang (-A), User tidak dapat membaca dan menulis ke file yang namanya dimulai dengan sebuah . (titik) (-X), maks waktu idle (-I), batasi rekursi (-L) dan umask yang masuk akal .

Jangan menggunakan opsi -w atau -W! Kalau Anda ingin mempunyai suatu site warez, berhentilah membaca panduan ini!

Dokumentasi bisa didapatkan di http://www.pureftpd.org.

Proftpd

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 http://www.proftpd.org.

Vsftpd

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

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 ssl pada /etc/make.conf Anda sebelum menginstalasi apache, Anda harus memiliki akses pada server yang mampu melakukan ssl. Tambahkan baris berikut ini untuk mengaktifkan kemampuan ini.

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 --enable-shared=max dan --enable-module=all. Secara default semua modul akan diaktifkan, jadi Anda harus memberikan tanda komentar pada semua modul dalam bagian LoadModule (LoadModule dan AddModule) untuk modul yang tidak Anda gunakan. Jalankan ulang layanan dengan perintah /etc/init.d/apache restart.

Dokumentasi bisa didapatkan pada http://www.apache.org.

Qmail

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 emerge qmail dan lakukan konfigurasi!

Bind

Dokumentasi bisa didapatkan di Internet Software Consortium. Manual Referensi Administrasi BIND 9 juga berada pada doc/arm.

Djbdns

Djbdns adalah implementasi DNS dimana pembuat software ini ingin mempertaruhkan uangnya untuk keamanan dari software ini. Djbdns sangat berbeda cara kerjanya dibandingkan Bind 9 tetapi boleh dicoba juga. Informasi lebih lanjut bisa didapatkan dari http://www.djbdns.org/.

Samba

Samba adalah protokol untuk share file dengan network Microsoft/Novell dan tidak boleh digunakan melalui Internet. Tetapi bagaimanapun tetap perlu diamankan.

[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 documentation.

Sekarang jalankan ulang server dan tambahkan user yang memiliki hak akses ke layanan ini. Hal ini dilakukan melalui /usr/bin/smbpasswd dengan parameter -a

Chroot atau server virtual

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 bash (cara belajar yang mudah).

Buatlah direktori /chroot (mkdir chroot). Dan temukan pustaka dinamis yang dikompilasi bersama dengan bash (jika bash dikompilasi dengan -static maka langkah ini tidaklah perlu):

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 (/lib) ke lib yang dichroot dan kopi perintah bash ke direktori bin yang dichroot. Hal ini akan menghasilkan lingkungan yang tepat sama, tetapi dengan fungsi yang sedikit. Sesudah kopi, cobalah: chroot /chroot/bash. Jika Anda mendapatkan prompt yang berbunyi / artinya berfungsi dengan baik! Kalau tidak, maka akan ada pesan file apa saja yang kurang. Beberapa pustaka bersama saling bergantungan satu sama lain.

Anda akan menyadari bahwa di dalam chroot tidak ada yang berfungsi kecuali echo. Ini karena kita tidak memiliki perintah lain dalam lingkungan chroot tersebut selain bash dan echo sebagai fungsi bawaannya.

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 /etc. Kopikan saja mereka (peralatan bisa dikopikan dengan cp -a) ke dalam lingkungan yang dichroot, ubah skrip init untuk menggunakan chroot sebelum menjalankannya. Kadang cukup sukar untuk menemukan peralatan dan file konfigurasi yang diperlukan oleh suatu layanan. Di sini perintah strace menjadi berguna. Jalankan layanan dengan /usr/bin/strace bash dan carilah open, read, stat dan mungkin connect. Anda akan mendapatkan gambaran mengenai file apa yang harus dikopikan. Tetapi pada kebanyakan kasus, kopikan file passwd (edit kopinya dan buang user-user yang tidak berkaitan dengan layanan tersebut), /dev/zero, /dev/log dan /dev/random.

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:

  • User-Mode Linux dan howto mengenai User-Mode Linux.
Firewall
Sebuah firewall

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:

  • Untuk menjaga user (worm/penyerang) tetap di luar
  • Untuk menjaga user (karyawan/anak-anak) tetap di dalam

Secara dasar ada tiga macam firewall:

  • Penyaringan paket
  • Relai sirkit
  • Gateway Aplikasi

Suatu firewall harus merupakan mesin yang terdedikasi dan tidak menjalankan layanan apapun (atau sshd sebagai perkecualian satu-satunya) dan amankan dengan cara-cara yang direkomendasikan oleh panduan ini.

Penyaringan paket

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:

  • Mengijinkan atau menolak paket berdasarkan alamat IP sumber/tujuan
  • Mengijinkan atau menolak paket berdasarkan port sumber/tujuan
  • Mengijinkan atau menolak paket berdasarkan protokol
  • Mengijinkan atau menolak paket berdasarkan pada rambu dari protokol khusus

Pada dasarnya penyaringan didasarkan pada semua data yang ada pada awalan paket dan bukan isi paket.

Kelemahannya:

  • Informasi alamat dalam paket dapat menjadi potensial alamat IP palsu atau istilah kami ditunggangi oleh pengirim
  • Data atau permintaan yang ada dalam paket yang diijinkan mungkin mengandung data yang tidak diinginkan yang digunakan oleh penyerang untuk mengeksploitasi bug yang diketahui berada pada layanan-layanan yang ada atau di balik firewall
  • Biasanya ini merupakan suatu titik kelemahan

Keuntungannya:

  • Sederhana dan mudah untuk diimplementasikan
  • Dapat memberikan peringatan atas kemungkinan serangan sebelum terjadi (contoh dengan mendeteksi adanya portscan)
  • Bagus untuk menghentikan serangan SYN

Contoh-contoh penyaring paket yang gratis pada Linux:

  • Iptables
  • Ipchains
  • SmoothWall
Relai Sirkit

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:

  • Alamat IP sumber/tujuan
  • Port sumber/tujuan
  • Periode waktu
  • Protokol
  • User
  • Password

Semua trafik divalidasi, dimonitor dan trafik yang tidak diinginkan bisa dihentikan.

Kelemahan:

  • Beroperasi pada Lapis Transpor (Transport Layer) dan mungkin membutuhkan modifikasi yang cukup berarti pada program yang memberikan fungsi transpor
Gateway Aplikasi

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:

  • Mengijinkan atau menolak berdasarkan pada alamat IP sumber/tujuan
  • Berdasarkan isi paket
  • Membatasi akses file berdasarkan tipe atau ekstensi file

Keuntungan:

  • Bisa cache file, meningkatkan kinerja jaringan
  • Logging detil semua koneksi
  • Skala secara sempurna (beberapa server proxy bisa "membagi bersama" data yang di-cache)
  • Tidak ada koneksi langsung dari sisi luar
  • Bahkan bisa mengubah isi paket secara langsung

Kelemahan:

  • Konfigurasinya kompleks

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:

  • Squid
Iptables

Untuk menjalankan iptables, bagian iptables pada kernel harus di-enable dulu. Saya sudah menambahkannya sebagai modul (perintah iptables akan menjalankannya pada saat dibutuhkan) dan kompilasi ulang kernel saya. Untuk informasi lebih lanjut bagaimana melakukan konfigurasi kernel Anda untuk iptables, kunjungilah Tutorial Iptables Bab 2: Persiapan. Setelah Anda melakukan kompilasi kernel (atau sambil melakukan kompilasi kernel) Anda harus menambahkan perintah iptables. Lakukan saja emerge iptables dan iptables bisa jalan.

Sekarang lakukan percobaan dengan menjalankan iptables -L. Kalau gagal, berarti ada sesuatu yang salah dan Anda harus memeriksa ulang konfigurasi Anda.

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 -m limit --limit 1/s. Jumlah paket SYNC yang diterima akan diterima satu per detik dan karenanya membatasi banjir SYN pada sumber daya kita.

Sekarang beberapa hal praktis!

Ketika iptables dimuat dalam kernel, ada 5 hal di mana Anda bisa menempatkan aturan-aturan Anda. Kelima hal tersebut adalah INPUT, OUTPUT, FORWARD, PREROUTING dan POSTROUTING. Setiap hal ini disebut suatu rantai dan terdiri dari daftar aturan-aturan. Setiap aturan berbunyi sebagai berikut, jika suatu awalan paket sama dengan ini, maka hal-hal berikut ini yang harus dilakukan terhadap paket ini. Jika aturan tersebut tidak cocok dengan paket, maka paket akan disampaikan ke aturan berikutnya dalam rantai tersebut.

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.

-AAppend (tambah)-DDelete (hapus)-IInsert (selip)-RReplace (ganti)-LList (tampilkan daftar)-FHapus semua aturan dalam rantai atau semua rantai-ZNolkan hitungan dalam rantai atau semua rantai-CUji paket ini pada rantai-NBuat suatu rantai baru yang didefinisikan user-XHapus suatu rantai yang didefinisikan user-PGanti kebijaksanaan pada rantai untuk tujuan-EGanti nama rantai-pProtokol-sAlamat sumber/mask-dAlamat tujuan/mask-iNama input (nama ethernet)-oNama output (nama ethernet)-jLompat (tujuan dari aturan)-mPencocokan Lanjutan (bisa menggunakan ekstensi)-nKeluaran numerik untuk alamat dan port-tTabel untuk memanipulasi-vMode Verbose-xPerluas angka (tampilkan nilai nyata)-fHanya cocok dengan fragmen kedua atau lebih-VVersi Paket--line-numbersCetak nomor baris ketika menampilkan daftar
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 ACCEPT, DROP, REJECT, LOG, QUEUE, MASQUERADE. Dalam kasus ini kita menggunakan DROP yang akan membuang paket tanpa memberitahukan klien.

Sekarang coba ping localhost. Anda tidak akan mendapatkan jawaban karena iptables akan membuang semua pesan ICMP yang datang. Demikian pula, ia tidak dapat melakukan ping ke mesin lain, karena semua paket jawaban ICMP akan dibuang. Sekarang hapuskan rantai tersebut untuk memungkinkan ICMP kembali.

# 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 iptables -A INPUT -i eth0 -m state --state INVALID -j DROP seperti sebelumnya. Hal ini memungkinkan penyaringan paket penuh-perhatian dalam iptables dengan memuat kondisi diperluas. Jika Anda ingin mengijinkan orang lain untuk berhubungan mesin Anda, Anda dapat menggunakan --state NEW. Iptables memiliki beberapa modul untuk tujuan yang berbeda. Beberapa di antaranya:

macPerluasan pencocokan alamat mac dari paket yang masuk.--mac-sourcestateMemungkinkan inspeksi penuh-perhatian--state (pilihan state adalah ESTABLISHED,RELATED, INVALID, NEW)limitPembatasan pencocokan kecepatan--limit, --limit-burstownerMencoba untuk mencocokkan bermacam-macam karakteristik dari pembuat paket --uid-owner userid --gid-owner groupid --pid-owner processid --sid-owner sessionid uncleanMacam-macam pemeriksaan keabsahan paket
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 ACCEPT
Kebijaksanaan default adalah mengijinkan semua trafik keluar. Trafik ke dalam dibuang.
# iptables -P OUTPUT ACCEPT
# iptables -P INPUT DROP
Dan 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 Dokumentasi netfilter/iptables.

Marilah kita lihat contoh penuh. Dalam kasus ini kebijaksanaan firewall/gateway saya menyatakan:

  • Koneksi ke firewall hanya diijinkan melalui SSH (port 22)
  • Jaringan lokal harus memiliki akses ke HTTP, HTTPS dan SSH (DNS harus diijinkan juga)
  • Trafik ICMP bisa berisi muatan dan tidak boleh masuk. Tentu saja kita harus mengijinkan beberapa macam trafik ICMP.
  • Pemindai port harus dideteksi dan dicatat log
  • Serangan SYN harus dihindari
  • Semua trafik yang lain harus dibuang dan dicatat log
#!/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:

  1. Buatlah kebijaksanaan firewall Anda sebelum mengimplementasikannya
  2. Jagalah supaya tetap sederhana
  3. Ketahui cara kerja protokol (baca RFC (Request For Comments))
  4. Ingatlah bahwa suatu firewall hanyalah suatu software yang berjalan sebagai root
  5. Ujilah firewall Anda

Jika Anda menganggap bahwa iptables itu sulit dimengerti atau membutuhkan waktu lama untuk menghasilkan suatu firewall yang memadai, Anda dapat menggunakan Shorewall. Sebenarnya yang digunakan adalah iptables juga untuk menghasilkan aturan-aturan firewall, tetapi konsentrasinya adalah pada aturan-aturan dan bukan pada protokol khusus.

Squid

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 tidak boleh didaftar bersama dengan beberapa site porno. Dan saya tidak mau menghabiskan waktu untuk mencoba mencari beberapa site yang bagus untuk Anda.

Dalam kasus ini, kebijaksanaan saya berbunyi:

  • Surfing (HTTP/HTTPS) diijinkan selama jam kerja (senin-jumat 8-17 dan sabtu 8-13) jika mereka masuk terlambat mereka harus bekerja, bukan surfing
  • Download dilarang (.exe, .com, .arj, .zip, .asf, .avi, .mpg, .mpeg etc)
  • Kami tidak menyenangi banner, jadi disaring dan diganti dengan gif transparan (di sini Anda bisa menjadi kreatif!)
  • Semua koneksi yang lain dari dan ke Internet dilarang

Implementasikan dalam 4 langkah mudah.

# 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]$
Catatan, [] dengan huruf besar dan huruf kecil untuk setiap karakter. Ini dimaksudkan supaya tidak seorangpun bisa melakukan tipuan dengan mengakses file AvI sebagai pengganti avi

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>
Jangan tutup tag <HTML> <BODY>. Semuanya akan dilakukan oleh squid.

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.

Di Mozilla, lakukan setting di Edit->Preferences->Advanced->Proxies.

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
Sekarang, apa yang telah kita pelajari?

Kita sudah belajar bahwa:

  1. Suatu firewall dapat menjadi suatu resiko tersendiri. Firewall yang dikonfigurasikan secara buruk adalah lebih jelek daripada tidak memiliki firewall sama sekali.
  2. Bagaimana melakukan setting gateway dasar dan proxy transparan.
  3. Kunci firewall bagus adalah mengetahui protokol mana yang akan Anda ijinkan untuk lewat.
  4. Trafik IP tidak selalu berisi data yang sah / benar, contoh paket ICMP bisa berisi muatan tertentu.
  5. Bagaimana mencegah serangan SYN.
  6. Penyaringan trafik HTTP dengan membuang gambar-gambar dan download yang mengandung virus.
  7. Mengkombinasikan penyaringan paket dan gateway aplikasi memberikan kendali yang lebih baik.

Sekarang, jika Anda benar-benar menginginkannya, buatlah suatu firewall yang cocok dengan kebutuhan Anda.

Deteksi Penyusupan
AIDE (Advanced Intrusion Detection Environment)

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:

ifdefJika didefinisikan@@ifdef "name"ifndefJika tidak didefinisikan@@ifndef "name"defineDefinisi suatu variabel@@define "name" "value"undefBuang definisi suatu variabel@@undef "name"ifhostJika "hostname"@@ifhost "hostname"ifnhostJika bukan "hostname"@@ifnhost "hostname"endif Endif harus digunakan setelah semua makro di atas kecuali define dan undef @@endif
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.

pperijinaniinodenjumlah linkuuserggroupssizebblock countmmtimeaatimecctimeSperiksa pertambahan ukuranmd5md5 checksumsha1sha1 checksumrmd160rmd160 checksumtigertiger checksumRp+i+n+u+g+s+m+c+md5Lp+i+n+u+gEEmpty group>Growing logfile p+u+g+i+n+S
Rambu Penjelasan

Dan jika AIDE dikompilasi dengan dukungan mhash, maka terdapat beberapa fitur yang lain:

havalhaval checksumgostgost checksumcrc32crc32 checksum
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.

!Jangan tambahkan ini pada file atau direktori.=Tambahkan direktori ini, tetapi jangan rekursif.
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 /etc/aide/aide.db ketika melakukan pemeriksaan integritas file. Tetapi ketika memperbarui atau membuat file baru, AIDE menyimpan informasi pada /etc/aide/aide.db.new. Hal ini dilakukan supaya file db baru tidak menimpa file db yang lama. Pilihan report_URL belum diimplementasikan. Tetapi keinginan pembuat software ini adalah setidaknya AIDE sanggup untuk mengirimkan email atau mungkin menjalankan suatu skrip.

Sesudah melakukan perubahan pada konfigurasi, Anda harus membuat file db Anda dengan menjalankan aide -i dan kemudian kopi file /etc/aide/aide.db.new ke /etc/aide/aide.db dan menambahkan cek ke cron dengan menjalankan crontab -e sebagai root.

Bergantung pada cpu Anda, akses disk dan rambu yang Anda pergunakan pada file, mungkin diperlukan beberapa saat untuk menjalankannya.
0 3   * * * /usr/bin/aide -u
Ingatlah untuk melakukan setup sehingga Anda mendapatkan mail root. Jika tidak maka Anda tidak akan tahu apa yang dilaporkan aide.

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 -u (Update) daripada -C (Check). Karena -u juga melakukan pemeriksaan pada file dan tidak menimpa ulang file db asli, maka terjadi penghematan waktu karena yang Anda perlukan hanyalah melakukan kopi suatu file ketika dideteksi adanya perubahan. Jadi hanya memeriksa perubahan untuk melihat apakah itu dilakukan Anda atau oleh seorang penyerang sebelum Anda mengkopikannya!

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 /usr/bin/aide. Maka Anda harus membuat suatu CD atau media lain dan meletakkan kopi dari file .db dan binari aide.

Informasi bisa didapatkan pada halaman proyek AIDE.

Snort

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_decode

Step 3
include classification.config

Step 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 Snort.