Episode ini membahas hardening Bacula dengan prinsip least privilege: menjalankan daemon dengan user non-root bila memungkinkan, mengunci permission konfigurasi hingga 600, audit log yang efektif, password FD unik per client, serta monitoring akses untuk mendeteksi penyalahgunaan.

TLS dan firewall menutup pintu dari luar. Tapi setengah pertempuran keamanan justru di dalam: berapa banyak hak yang sebenarnya dibutuhkan setiap komponen? Prinsip least privilege menjawabnya — beri setiap proses hanya hak minimum yang ia butuhkan, tidak lebih. Di episode 14 kita meng-hardening Bacula dari dalam.
Tiga sasaran: user daemon yang tidak istimewa, konfigurasi yang terkunci, dan log yang bisa dipercaya. Plus satu kebiasaan penting di sisi client: password unik per mesin.
File Daemon adalah komponen paling sensitif: ia membaca file yang dijadwalkan Director. Jika FD berjalan sebagai root, kompromi FD = akses root ke seluruh sistem. Solusinya: jalankan FD sebagai user khusus.
Bacula Community FD mendukung directive FDUser di bacula-fd.conf:
FileDaemon {
Name = client-fd
FDUser = bacula
FDPort = 9103
}Dengan ini, FD menurunkan privilege setelah start. Batasan yang harus diterima: direktori yang dibackup harus bisa dibaca user tersebut. Untuk data yang hanya bisa dibaca root (misal /etc/shadow), kompromi harus dibuat — dan itulah alasan banyak admin memilih tetap root di lingkungan khusus, dengan kompensasi pengamanan lain.
Note
Director (bacula-dir) dan Storage Daemon (bacula-sd) juga punya opsi menurunkan privilege (directive DirUser/SDUser di beberapa edisi), tapi SD sering tetap perlu akses ke device tape. Evaluasi per komponen: turunkan privilege di mana mungkin, terima sisanya dengan mitigasi.
Bacula berjalan sebagai service systemd. Manfaatkan fitur hardening systemd pada file unit:
[Service]
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
ReadOnlyPaths=/etc/bacula
PrivateTmp=trueNoNewPrivileges=true mencegah eskalasi privilege, ProtectSystem=strict membuat sistem file read-only kecuali yang diizinkan. Sesuaikan ReadWritePaths dengan direktori storage Bacula.
Konfigurasi berisi password daemon. Kunci permission-nya:
sudo chmod 0640 /etc/bacula/*.conf
sudo chmod 0600 /etc/bacula/certs/*.key
sudo chown root:bacula /etc/bacula/*.confAturannya: baca untuk user service + root, tulis hanya root, tidak pernah world-readable. Kunci privat TLS (*.key) paling ketat: 0600 root.
Bacula mengirim pesan ke berbagai target via resource Messages. Untuk audit, arahkan semuanya ke file dan direktori:
Messages {
Name = Standard
mailcommand = "/usr/sbin/bsmtp -h localhost -f \"(Bacula)\" %r"
operatorcommand = "/usr/sbin/bsmtp -h localhost -f \"(Bacula)\" %r"
mail = root@localhost = all, !skipped
operator = root@localhost = mount
console = all, !skipped, !saved
append = "/var/log/bacula/bacula.log" = all, !skipped
catalog = all
}append = "/var/log/bacula/bacula.log" menulis semua pesan penting ke file log; mail mengirim notifikasi; console menampilkan ke bconsole. Log inilah bahan audit.
Log audit yang bisa diubah penyerang tidak berguna. Gunakan log rotation dan batasi akses:
sudo chmod 0640 /var/log/bacula/bacula.log
sudo chown root:bacula /var/log/bacula/bacula.logJika compliance menuntut, kirim log ke SIEM eksternal (syslog) agar ada salinan yang tidak bisa dihapus lokal.
Satu password Director yang sama untuk semua FD adalah pintu yang sangat lebar: kompromi satu client = semua client bisa dibackup/dibaca. Buat password unik per client:
Client {
Name = web-01-fd
Address = 10.0.0.11
Password = "pwd-untuk-web-01"
}
Client {
Name = db-01-fd
Address = 10.0.0.12
Password = "pwd-untuk-db-01"
}Masing-masing harus cocok dengan resource Director di bacula-fd.conf mesin tersebut. Automatisasi (Ansible/Terraform) adalah cara realistis mengelola password unik ratusan client — generate per host, inject ke konfigurasi.
Warning
Password FD yang bocor berarti siapa pun yang memilikinya bisa meminta Director membaca file dari client tersebut. Rotasi password FD adalah langkah pertama wajib saat ada indikasi kompromi — dan sebaiknya dilakukan rutin bersama rotasi credential lain.
Pantau siapa yang terhubung ke daemon:
* status client=web-01-fd
* status dir
ss -tnp | grep -E "9101|9102|9103"Dari bconsole, status client menampilkan koneksi FD yang sedang aktif; status dir menampilkan koneksi konsol. Pola mencurigakan yang harus diwaspadai:
Korelasi tiga hal ini — log job, koneksi aktif, dan alamat sumber — adalah audit access yang sesungguhnya.
[x] FD berjalan dengan user non-root bila memungkinkan
[x] NoNewPrivileges + ProtectSystem di unit systemd
[x] Konfigurasi 0640 root:bacula; kunci TLS 0600
[x] Log mengalir ke file + mail + (opsional) syslog/SIEM
[x] Password FD unik per client, dirotasi rutin
[x] Koneksi aktif dipantau via status dan ssInti yang harus dibawa pulang:
FDUser; perkecil hak service di systemd.0640 root:bacula, kunci TLS 0600 root.Messages ke file + email; proteksi dari modifikasi.Di episode 15 selanjutnya kita akan menskalakan Bacula ke banyak client dan multi-Director — banyak FD ke satu Director/SD, konfigurasi per-tenant dengan Client resource dan ACL, serta opsi Director HA dan SD clustering. Inilah transisi dari deployment kecil menuju arsitektur enterprise.