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:

bash
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.txt

Output yang Dihasilkan:

text
6934488a20c5c2967731b7a883fef7f459538d851b4c60468f92a9e6d0e3f9fe  konfig/backup.conf
ecd3cc82a77d86891f971bacb441edcd53d1ea42638d6f808d35fd4df1ace5d0  konfig/pengguna.conf
1fdc125289426646c6092ab7079580f8d7c62f1d24ea92070979c5b225b18046  konfig/sshd_config

Kita bedah blok di atas:

  1. Baris 1 (mkdir -p konfig): folder latihan berperan sebagai direktori konfigurasi penting.
  2. Baris 2-4 (printf ... > konfig/...): tiga file konfigurasi — isi sengaja pendek agar latihan mudah diikuti.
  3. Baris 5 (sha256sum konfig/* > manifest.txt): menghitung hash setiap file lalu menyimpan daftarnya ke manifest.txt. Glob konfig/* terurut alfabetis, jadi manifest selalu tersusun sama.
  4. 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:

bash
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>&1

Output yang Dihasilkan:

text
konfig/backup.conf: OK
konfig/pengguna.conf: FAILED
konfig/sshd_config: OK
sha256sum: WARNING: 1 computed checksum did NOT match

Blok di atas berjalan dengan kode keluar 1 — dan itu justru yang kita inginkan:

  1. Baris 1-5: keadaan awal dibuat ulang karena setiap blok latihan berdiri sendiri; manifest dari blok sebelumnya tidak dibawa-bawa.
  2. Baris 6 (printf ... AllowUsers budi, siti): satu kata ditambahkan ke satu file — perubahan sekecil inipun tak luput.
  3. Baris 7 (sha256sum -c manifest.txt 2>&1): opsi -c membaca manifest, menghitung ulang hash setiap file, dan membandingkannya. Baris FAILED menunjuk file yang berubah; 2>&1 menyertakan peringatan sha256sum yang tercetak ke stderr, dan kode keluar 1 memberi 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:

bash
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:

text
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: 1

Kita bedah skrip dan latihannya:

  1. Baris 4 (manifest="${1:-manifest.txt}"): manifest dibaca dari argumen pertama; tanpa argumen, pakai manifest.txt di direktori kerja.
  2. Baris 5-8: manifest yang tidak ada membuat skrip berhenti dengan kode 2 — kesalahan pemakaian, bukan deteksi.
  3. Baris 9-14: sha256sum -c dijalankan dengan keluaran ditampung; sukses dicetak singkat, kegagalan dicetak lengkap lalu skrip keluar dengan kode 1.
  4. 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:

bash
17 3 * * * root /usr/local/sbin/cek.sh /var/lib/manifest.txt

Setiap 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:

text
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/passwd

Dua 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?”:

bash
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 diff

Output yang Dihasilkan:

text
== 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 no

Kita bedah blok di atas:

  1. Baris 1-3 (git init, git config): repositori baru plus identitas komitter — git menolak mencatat tanpa keduanya.
  2. Baris 4-6 (git add, git commit): keadaan awal disimpan sebagai baseline, lengkap dengan pesan dan waktu.
  3. Baris 7 (printf 'Port 2223...'): satu nilai digeser — dan di sinilah git melebihi checksum.
  4. Baris 9 (git status --short): kode dua huruf M melaporkan file yang dimodifikasi di worktree — jawaban setara sha256sum -c.
  5. Baris 11 (git diff): bukan hanya “berubah”, melainkan baris mana yang berubah dari apa menjadi apa. Paket etckeeper memakai pola ini untuk menjadikan seluruh /etc sebuah 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.