Semua pengaman yang kita bangun sejauh ini bekerja sebelum perubahan terjadi: permission menolak akses, firewall menolak paket, MAC menolak operasi. Deteksi keamanan mengajukan pertanyaan yang berbeda — bukan “boleh atau tidak”, melainkan “apakah keadaan sistem masih seperti terakhir kali kita periksa?”. Penyerang yang sudah masuk diam-diam mengubah file: backdoor di /usr/bin, kunci SSH baru di authorized_keys, opsi konfigurasi yang digeser satu kata. Checksum menjawab dengan sidik jari satu arah: hash file berubah total meski isinya hanya bergeser satu byte. Chapter ini membangun pemantauan dari bahan yang ada di semua mesin Linux — sha256sum, skrip shell, dan git — lalu menempatkan AIDE di atas fondasi itu.
Checksum sebagai Sidik Jari #
Fungsi hash seperti SHA-256 meringkas isi file apa pun menjadi 64 karakter heksadesimal. Perhitungannya satu arah: dari hash kita tidak bisa mengembalikan isi file, tetapi isi yang sama selalu menghasilkan hash yang sama. Kita buat barang buktinya sekarang:
mkdir -p konfig
printf 'Port 2222\nPermitRootLogin no\n' > konfig/sshd_config
printf 'DB_HOST=192.0.2.10\nDB_USER=budi\n' > konfig/backup.conf
printf 'AllowUsers budi\n' > konfig/pengguna.conf
sha256sum konfig/* > manifest.txt
cat manifest.txtOutput yang Dihasilkan:
6934488a20c5c2967731b7a883fef7f459538d851b4c60468f92a9e6d0e3f9fe konfig/backup.conf
ecd3cc82a77d86891f971bacb441edcd53d1ea42638d6f808d35fd4df1ace5d0 konfig/pengguna.conf
1fdc125289426646c6092ab7079580f8d7c62f1d24ea92070979c5b225b18046 konfig/sshd_configKita bedah blok di atas:
- Baris 1 (
mkdir -p konfig): folder latihan berperan sebagai direktori konfigurasi penting. - Baris 2-4 (
printf ... > konfig/...): tiga file konfigurasi — isi sengaja pendek agar latihan mudah diikuti. - Baris 5 (
sha256sum konfig/* > manifest.txt): menghitung hash setiap file lalu menyimpan daftarnya kemanifest.txt. Globkonfig/*terurut alfabetis, jadi manifest selalu tersusun sama. - Baris 6 (
cat manifest.txt): manifest berisi satu hash dan satu nama file per baris — catatan berharga “keadaan dunia pada saat pencatatan”.
Satu Kata Berubah, Verifikasi Gagal #
Manifest hanya berguna bila diperiksa ulang. Kita buat ulang keadaan awal, ubah satu kata, lalu verifikasi:
mkdir -p konfig
printf 'Port 2222\nPermitRootLogin no\n' > konfig/sshd_config
printf 'DB_HOST=192.0.2.10\nDB_USER=budi\n' > konfig/backup.conf
printf 'AllowUsers budi\n' > konfig/pengguna.conf
sha256sum konfig/* > manifest.txt
printf 'AllowUsers budi, siti\n' > konfig/pengguna.conf
sha256sum -c manifest.txt 2>&1Output yang Dihasilkan:
konfig/backup.conf: OK
konfig/pengguna.conf: FAILED
konfig/sshd_config: OK
sha256sum: WARNING: 1 computed checksum did NOT matchBlok di atas berjalan dengan kode keluar 1 — dan itu justru yang kita inginkan:
- Baris 1-5: keadaan awal dibuat ulang karena setiap blok latihan berdiri sendiri; manifest dari blok sebelumnya tidak dibawa-bawa.
- Baris 6 (
printf ... AllowUsers budi, siti): satu kata ditambahkan ke satu file — perubahan sekecil inipun tak luput. - Baris 7 (
sha256sum -c manifest.txt 2>&1): opsi-cmembaca manifest, menghitung ulang hash setiap file, dan membandingkannya. BarisFAILEDmenunjuk file yang berubah;2>&1menyertakan peringatansha256sumyang tercetak ke stderr, dan kode keluar1memberi tanda kepada skrip pemanggilnya.
Pemantauan Berkala dengan cek.sh dan cron #
Verifikasi hanya bermakna bila dijalankan berkala — dan itu pekerjaan skrip, bukan manusia. Berikut cek.sh yang membungkus pola di atas:
cat > cek.sh <<'AKHIR'
#!/usr/bin/env bash
# cek.sh - bandingkan file terhadap manifest checksum.
# Pemakaian: bash cek.sh <manifest>
manifest="${1:-manifest.txt}"
if [ ! -f "$manifest" ]; then
printf 'cek.sh: manifest %s tidak ditemukan\n' "$manifest"
exit 2
fi
if sha256sum -c "$manifest" > hasil-cek.tmp 2>&1; then
printf 'SEMUA FILE MASIH UTUH\n'
exit 0
fi
cat hasil-cek.tmp
printf 'cek.sh: ADA PERUBAHAN - periksa file FAILED di atas\n'
exit 1
AKHIR
mkdir -p konfig
printf 'Port 2222\nPermitRootLogin no\n' > konfig/sshd_config
printf 'DB_HOST=192.0.2.10\nDB_USER=budi\n' > konfig/backup.conf
printf 'AllowUsers budi\n' > konfig/pengguna.conf
sha256sum konfig/* > manifest.txt
bash cek.sh manifest.txt
printf 'AllowUsers budi, siti\n' > konfig/pengguna.conf
bash cek.sh manifest.txt
printf 'kode keluar cek.sh: %s\n' "$?"Output yang Dihasilkan:
SEMUA FILE MASIH UTUH
konfig/backup.conf: OK
konfig/pengguna.conf: FAILED
konfig/sshd_config: OK
sha256sum: WARNING: 1 computed checksum did NOT match
cek.sh: ADA PERUBAHAN - periksa file FAILED di atas
kode keluar cek.sh: 1Kita bedah skrip dan latihannya:
- Baris 4 (
manifest="${1:-manifest.txt}"): manifest dibaca dari argumen pertama; tanpa argumen, pakaimanifest.txtdi direktori kerja. - Baris 5-8: manifest yang tidak ada membuat skrip berhenti dengan kode 2 — kesalahan pemakaian, bukan deteksi.
- Baris 9-14:
sha256sum -cdijalankan dengan keluaran ditampung; sukses dicetak singkat, kegagalan dicetak lengkap lalu skrip keluar dengan kode 1. - Baris 20 dan 23 (
bash cek.sh manifest.txt): dua panggilan — sebelum dan sesudah satu file diubah. Kode keluar berubah dari 0 ke 1, persis sinyal yang dibutuhkan penjadwal.
Di sistem sungguhan, penjadwalnya adalah cron — baris berikut masuk ke /etc/cron.d/pemeriksaan:
17 3 * * * root /usr/local/sbin/cek.sh /var/lib/manifest.txtSetiap pukul 03:17 root menjalankan cek.sh; selama hasilnya nihil cron diam, dan begitu skrip mengeluarkan baris FAILED, cron mengirimkannya sebagai email ke admin.
AIDE: Manifest yang Dikelola Paket #
Alat klasik domain ini adalah AIDE (Advanced Intrusion Detection Environment): polanya sama dengan manifest kita — database checksum dibuat saat sistem sehat, lalu dibandingkan berkala — tetapi semuanya sudah dikemas. Konfigurasi di aide.conf menentukan file mana yang diawasi dan atribut apa yang dicatat; sudo aide --init membangun database (dipindahkan dari aide.db.new ke aide.db), dan sudo aide --check menjalankan pemeriksaan. Berikut contoh tampilan hasil pemeriksaan yang menemukan sesuatu:
AIDE found differences between database and filesystem!!
Summary:
Total number of entries: 41234
Added entries: 1
Removed entries: 0
Changed entries: 1
Added entries:
f++++++++++++++++: /usr/local/bin/.backdoor
Changed entries:
f p s size mtime ctime: /etc/passwdDua temuan itu bercerita jelas: satu file baru muncul di /usr/local/bin dan /etc/passwd berubah — kombinasi klasik backdoor dengan akun baru. Dari sinilah investigasi dimulai, bukan berakhir.
git: Riwayat yang Bisa Ditanya #
Untuk direktori yang sudah berbentuk teks, kita punya alat yang lebih kaya: git. Repository pada dasarnya adalah manifest yang tersegel waktu — plus kemampuan menjawab “berubah jadi apa?”:
git init -q latihan-git
cd latihan-git
git config user.name "Budi"
git config user.email "[email protected]"
printf 'Port 2222\nPermitRootLogin no\n' > sshd_config
git add sshd_config
git commit -qm 'baseline konfigurasi sshd'
printf 'Port 2223\nPermitRootLogin no\n' > sshd_config
echo '== git status --short =='
git status --short
echo '== git diff =='
git diffOutput yang Dihasilkan:
== git status --short ==
M sshd_config
== git diff ==
diff --git a/sshd_config b/sshd_config
index 79d9d9b..3e4f163 100644
--- a/sshd_config
+++ b/sshd_config
@@ -1,2 +1,2 @@
-Port 2222
+Port 2223
PermitRootLogin noKita bedah blok di atas:
- Baris 1-3 (
git init,git config): repositori baru plus identitas komitter — git menolak mencatat tanpa keduanya. - Baris 4-6 (
git add,git commit): keadaan awal disimpan sebagai baseline, lengkap dengan pesan dan waktu. - Baris 7 (
printf 'Port 2223...'): satu nilai digeser — dan di sinilah git melebihi checksum. - Baris 9 (
git status --short): kode dua hurufMmelaporkan file yang dimodifikasi di worktree — jawaban setarasha256sum -c. - Baris 11 (
git diff): bukan hanya “berubah”, melainkan baris mana yang berubah dari apa menjadi apa. Paketetckeepermemakai pola ini untuk menjadikan seluruh/etcsebuah repositori git.
Alarm integritas kini terpasang: kita tahu kapan file penting berubah. Pertanyaan berikutnya menyangkut file yang memang berisi rahasia — password, token, kunci API — yang tidak boleh beredar dalam bentuk aslinya. Chapter berikutnya menyusun cara menyimpan dan menyerahkan kredensial tanpa menumpahkannya ke ps, history, atau repository.
Referensi lanjut: wiki Arch Linux tentang AIDE untuk konfigurasi dan pemakaianya, serta buku Pro Git untuk perintah-perintah yang dipakai di chapter ini.