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.