Artikel:Menginstal ulang server yang dihack
[draft artikel infolinux]
Pendahuluan
Jika sedang "bernasib jelek", sebuah server yang cukup dijaga pun ada
kalanya berhasil ditembus. Terutama ini kadang-kadang terjadi pada
server publik yang memberi akses pada banyak user atau berisi banyak
aplikasi yang rentan seperti aplikasi web PHP yang tidak terkini.
Dan sering kali sebuah server yang penting dan dipakai banyak orang
tidak boleh down terlalu lama. Jika kita menginstal ulang dengan
memformat, menginstal kembali OS, dan merestore data dari backup di
harddisk/komputer lain (yang bisa berpuluh atau ratus gigabyte
jumlahnya) maka total waktu yang dibutuhkan dapat berjam-jam
lamanya. Kadang ini terlalu lama.
Artikel ini menjelaskan sebuah cara instalasi ulang tanpa
format. Contoh kasus yang dibahas di sini adalah server berbasis Linux
Debian, namun sebetulnya cara di artikel ini dapat diterapkan pada
OS/distro lainnya. Namun tidak semua server memungkinkan untuk
menggunakan cara ini. Server yang hanya bisa diakses secara remote,
seperti server yang ada di luar negeri, tidak bisa menggunakan cara
ini, kecuali jika datacenter memberikan akses terminal menggunakan
KVM-over-IP.
Mengapa harus instal ulang?
Jika sebuah server telah di-"hack" dan pihak lain berhasil mendapatkan
root, maka jalan satu-satunya untuk meyakinkan bahwa server telah
bersih adalah memang dengan menginstal ulang OS. Ini karena hacker
bisa:
1. Memasang trojan (program-program palsu) di /usr, /bin, dll (mis:
/bin/login atau /usr/sbin/sshd kini dipalsukan agar selain menjalankan
fungsi aslinya, juga menyadap password yang diketikkan siapa saja yang
ingin login).
2. Memasang modul kernel agar dirinya tidak terdeteksi. Misalnya
perintah "ls", "ps ax", "netstat", dll ditipu sehingga tidak
memperlihatkan file program, proses, atau koneksi network milik si
cracker, padahal sebetulnya ada.
3. memasang program-program lain, seperti program setuid-root, agar si
cracker dapat kapan saja memperoleh kembali akses root kapan saja
diinginkan. Program-program ini dapat saja tersembunyi dan tidak dapat
kita lihat sama sekali.
4. Melindungi program dan proses milik si cracker agar tidak dapat
kita hapus/kill.
Dengan kata lain, server yang sudah dihack tidak dapat lagi dipercaya
keamanannya. Kita harus merestore semua program-program yang ada di
/usr, /bin, dll dengan program asli dari CD instalasi atau dari mirror
Debian yang tepercaya. Dengan kata lain, mudahnya adalah dengan
melakukan instalasi ulang OS.
Prinsip
Cara yang dijelaskan dalam artikel ini menghindari kita harus mengkopi
dulu data ke harddisk lain atau merestore data dari backup di
harddisk/komputer lain, jadi tidak membutuhkan harddisk tambahan, dan
mengirit waktu.
Prinsipnya adalah dengan, dari CD instalasi (atau live CD) me-mount
dulu harddisk lalu memindahkan semua file yang ada di / ke dalam
sebuah direktori, misalnya /.old, lalu melakukan instalasi OS. Maka
akan terbentuk struktur baru yang bersih di harddisk (/bin, /boot,
/etc, dll) sementara instalasi lama kita isolasi dulu di dalam
/.old. Setelah instalasi baru selesai, kita pindahkan kembali data
user ke dalam instalasi baru (setelah kita mengecek jangan sampai di
data user terdapat file setuid-root atau account root ekstra).
Bagian pertama: Instalasi OS baru
Asumsi kita menggunakan Debian. Dan skema partisi server adalah semua
data ditaruh di partisi tunggal /. (Jika kita memiliki partisi-partisi
terpisah, misalnya /home, maka perlu disesuaikan. Intinya tetap bahwa
kita harus menghindari dulu file dari instalasi lama bercampur dengan
file instalasi baru.)
Pertama, down-kan server. Lalu boot kembali dengan CD instalasi
Debian.
Kedua, setelah sampai pada tahap deteksi Disk, tekan Alt-F2
untuk mendapatkan shell. Mount harddisk (mis: /dev/sda1 jika SATA,
atau /dev/hda1 jika masih IDE) ke /tmp/hda1:
# mkdir /tmp/hda1
# mount /dev/sda1 /tmp/hda1
# cd /tmp/hda1
# mkdir .old
# chmod 700 .old
# mv * .old
# ls -la; # pastikan semua telah berpindah ke dalam .old
# cd ..
# umount /tmp/hda1
Catatan: jika kita memiliki partisi backup, mis: di /dev/sdb1, ada
baiknya juga dilakukan hal yang sama, yaitu mengisolasi dulu file-file
yang ada ke dalam sebuah direktori, mis: .old tadi.
Ketiga, tekan Alt-F1 untuk kembali ke layar instalasi
Debian. Lanjutkan instalasi. Catatan: hati-hati agar kita tidak
menghapus atau memformat sda1 tersebut di atas.
Bagian kedua: menjinakkan data lama
Pertama, setelah boot dengan instalasi OS baru beserta
updates-nya (dengan kernel dan software terbaru, agar tidak lagi
rentan di-hack lagi melalui lubang ke amanan yang sama), mari kita
lihat isi /.old. Pastikan permission-nya 700, dan kalau perlu kita
"chattr -R +i /.old" dulu untuk melindungi dari kecelakaan terhapus
dengan "rm", karena /.old ini saat ini akan kita "otopsi".
Catatan: sisa kabgjag di bawah dibuat dengan asumsi kita tidak
melakukan chattr +i. Jika Anda melakukannya, pastikan Anda bisa
menulis atau menghapus atau memindahkan data dari dalam /.old di mana
diperlukan/disebutkan dalam artikel.
Kedua, carilah file-file yang setuid-root. File ini kemungkinan
besar merupakan backdoor yang memungkinkan si hacker memperoleh root
kembali.
# cd /root
# find /.old -type f -uid 0 -perm /u+s > setuid.txt
# find /.old -type f -gid 0 -perm /g+s > setgid.txt
Catatan: Sebuah server yang memiliki banyak file (jutaan), misalnya
server shared hosting yang cukup penuh dengan user dapat memakan waktu
5-10 menit untuk menyelesaikan perintah di atas. Setelah kita
mengamati isi file setuid.txt, kita bisa menghapus atau mematikan
setuid bit pada file-file yang terdaftar di setuid.txt
tersebut. Contoh:
# rm /.old/home/t10000/home/r00t
atau:
# chmod 0 /.old/home/t10000/home/r00t
Catatan: Cukup file-file setuid-root di dalam data user saja (mis: di
direktori home/USERNAME/) yang perlu kita waspadai untuk tidak tetap
menjadi setuid-root saat kita pasang di luar .old nanti. File-file di
.old/bin/, .old/sbin/, dsb toh tidak akan kita pakai lagi karena kita
sudah menginstal ulang OS, tapi jika ada file dengan nama aneh, maka
kita bisa melihat pola si cracker dalam memilih nama-nama file
gadungan yang merupakan setuid-root, misalnya usr/bin/ping2,
var/tmp/root, dll. Di sini dibutuhkan pengalaman seorang sysadmin
untuk mengenali nama-nama file yang umum dan mana yang ganjil.
Bagian ketiga: restore data user
Yang akan direstore:
1. account-account Unix (/etc/{passwd,shadow,group,gshadow});
2. data user (mis: /home/USERNAME);
3. crontab user (/var/spool/cron/crontabs/USERNAME);
Pertama, untuk merestore account-account Unix, kita perlu
memperhatikan hal-hal berikut. Mungkin ada user yang id-nya 0 selain
"root", ini kemungkinan besar ditanam oleh cracker dan tidak boleh
kita sertakan. Lalu, user-user lain yang namanya mencurigakan atau
tidak dikenal juga sebaiknya tidak disertakan. Lalu, ada baiknya kita
reset semua password user (lihat bagian keempat). Perintah di bawah
ini hanya akan merestore user yang ditemui direktorinya di
/.old/home/USERNAME dan uid > 0.
# cd /.old/etc
# perl -lne '/^([^:]+):[^:]+:(\d+)/; print if $2>0 and -d "/.old/home/$1"' passwd;#>>/etc/passwd
Catatan: Hanya lepaskan komen tanda ";#" di atas jika Anda telah yakin
dan melihat output perintahnya.
Untuk 3 file lainnya, yaitu /etc/{shadow,group,gshadow} caranya
sama. Catatan: di /etc/shadow kita reset passwordnya.
# perl -lne '/^([^:]+):[^:]+:(.*)/; print "$1:!:$2" if -d "/.old/home/$1"' shadow;#>>/etc/shadow
# perl -lne '/^([^:]+):/; print if -d "/.old/home/$1"' group;#>>/etc/group
# perl -lne '/^([^:]+):/; print if -d "/.old/home/$1"' gshadow;#>>/etc/gshadow
Periksa ulang dengan perintah "ls -l /.old/home/user" apakah semua
file user uid dan gid-nya telah terpetakan dengan benar ke /etc/passwd
dan /etc/group. Jika masih ada yang numerik berarti ada yang belum
Kedua, untuk merestore data user, cukup kita pindahkan saja dari
/.old/home/* ke /home/. Bisa saja dikopi agar aman, tapi butuh waktu
lebih lama (bisa berjam-jam). Lagipula (seharusnya!) Anda masih punya
backup data-data di /home ini di tempat lain.
Ketiga, untuk restore crontab, pindahkan file crontab milik user
yang ada di /.old/var/spool/cron/crontabs/.
Jika masih ada yang ingin direstore, misalnya database MySQL atau
PostgreSQL, dapat dilakukan di sini. Yang penting Anda telah
memastikan bahwa file-file data yang ingin direstore telah "jinak".
Bagian keempat: reset password
Resetlah semua password user. Caranya misalnya dengan perintah di
bawah ini yang akan membuatkan daftar password baru bagi semua user
yang memiliki home di /home/USERNAME, lalu meresetnya. Membutuhkan
program makepasswd dan chpasswd yang tersedia di Debian:
# ( cd /home; for u in *; do echo "$u:`makepasswd`"; done ) > passwords.txt
# chpasswd -m < passwords.txt
Atau jika aplikasi manajemen server (mis: control panel) memiliki
fasilitas reset password masal (beserta fitur untuk mengirim email,
dll), silakan digunakan di sini.
|