Resep troubleshooting menuntaskan kecelakaan yang terlihat, tetapi keamanan bekerja di arah sebaliknya: celah tidak mengirim pesan galat, tidak membuat container restart, dan tidak muncul di log sampai seseorang dari luar yang menemukannya. Satu-satunya pertahanan yang efektif adalah audit berkala lewat checklist yang setiap butirnya bisa diverifikasi dari terminal, bukan dari perasaan. Chapter ini merangkum keputusan-keputusan keamanan dari seluruh Course menjadi dua puluh sembilan butir dalam enam kategori — image, runtime, jaringan, secret, host, dan operasional — masing-masing dengan alasan satu kalimat dan rujukan chapter asalnya, lalu menutupnya dengan satu contoh docker run hardened sebagai bentuk akhir seluruh aturan.
Image dan Build #
Tujuh butir pertama menutup pintu masuk paling awal: apa saja yang ikut terkirim di dalam image.
- Build multi-stage. Toolchain compiler dan dependensi build tidak boleh tinggal di image produksi karena setiap paket tambahan adalah permukaan serangan tambahan — pola dari Multi-Stage Build.
- Base image dipin digest.
FROMdengan@sha256:...membekukan bit yang dijalankan produksi, bukan tag yang bisa bergeser diam-diam — pelajaran dari Image Digest. - Aplikasi berjalan non-root.
USERsebelumCMDmembatasi daya jangkau proses bila penyerang lolos ke dalam container — dasar dari Menjalankan Container Non-Root. - Base image minimal. Alpine atau varian slim memangkas paket yang tidak dipakai aplikasi sekaligus memangkas celahnya — argumen ukuran dari Mengurangi Ukuran Image.
- Tidak ada secret di layer. Password tidak pernah ditulis di
RUNmaupun build arg karena layer bisa dibaca siapa pun yang memegang image; suntikan lewat--secret— aturan Secret dan SSH Mount. - Scan CVE dengan ambang tegas.
docker scout cvesdijalankan di pipeline dan build gagal bila temuan melewati ambang yang disepakati tim — praktik Image Scanning. - Provenance dan SBOM terlampir. Image ditandatangani asal-usulnya dan menyimpan daftar paket sehingga rantai pasok bisa diaudit pihak ketiga — capaian Image Provenance.
Konfigurasi Runtime #
Enam butir berikut membatasi apa yang boleh dilakukan proses di dalam container ketika aplikasi sudah berjalan.
- Filesystem read-only dengan tmpfs.
--read-only --tmpfs /tmpmembekukan rootfs sehingga aplikasi yang disusupi tidak bisa menanam berkas — pola Read-Only Filesystem. - Capabilities dicabut semua lalu ditambah seperlunya.
--cap-drop=ALLmemulai dari titik paling ketat, bukan mewarisi dua belas capability bawaan — disiplin Linux Capabilities. - Tidak ada mode privileged.
--privilegedmelepas semua capability, semua device host, seccomp, dan profil LSM sekaligus — peringatan inti Privileged Container. - Batas CPU dan memori terpasang.
--cpusdan--memorymencegah satu container melapari tetangganya dan host — praktik CPU dan Memory Limit. - PIDs limit terpasang.
--pids-limitmemutus serangan fork bomb sebelum kernel kehabisan process table — peran PIDs Limit dan Ulimit. - no-new-privileges aktif.
--security-opt no-new-privilegesmemblokir proses menaikkan hak lewat berkas setuid — lapisan dari Seccomp, AppArmor, dan SELinux.
Jaringan #
Empat butir ini menjaga lalu lintas: siapa yang bisa dilihat, dihubungi, dan dari mana masuk.
- Hanya reverse proxy yang expose. Aplikasi dan database tidak menerbitkan port; seluruh trafik masuk melewati satu pintu — topologi dari Reverse Proxy dan TLS.
- Port manajemen terikat loopback.
-p 127.0.0.1:8080:80hanya membuka port ke mesin itu sendiri, bukan ke seluruh jaringan — trik dari Port Publishing. - Custom network per stack. Setiap stack berjalan pada network user-defined-nya sendiri sehingga container asing tidak satu broadcast domain — kebiasaan Membuat Custom Network.
- Tidak ada host network di produksi.
--network hostmelepas seluruh isolasi jaringan container dan membuka seluruh port host — batasan Host Network.
Secret dan Data #
Tiga butir berikut menjaga benda paling sensitif: kredensial dan data yang tidak boleh bocor atau hilang.
- Secret lewat mekanisme secret. compose secrets atau secret manager, bukan environment variable polos yang terbaca siapa pun lewat
docker inspect— kesimpulan Secret Management. - Permission volume sesuai UID aplikasi. Volume hanya bisa ditulis proses dengan UID yang benar; angka pemilik tidak pernah dinegosiasikan kernel — disiplin Permission dan Ownership Volume.
- Backup terenkripsi dan teruji dipulihkan. Backup yang belum pernah direstore hanyalah harapan, bukan jaring pengaman — pelajaran pahit Backup dan Recovery.
Host dan Daemon #
Lima butir ini menjaga sistem yang menjalankan semuanya, karena siapa pun yang menguasai daemon menguasai host.
- Tidak ada TCP tanpa TLS. Daemon berbicara lewat socket unix; bila terpaksa TCP, wajib
--tlsverifydengan sertifikat dua arah — peringatan Mengatur Akses Docker. - Keanggotaan grup docker minimal. Anggota grup docker memegang daya setara root host, jadi daftarnya harus bisa dihitung dengan jari — ancaman yang dibedah di Docker Socket Security.
- Rootless mode bila memungkinkan. Daemon yang berjalan sebagai user biasa menurunkan seluruh konsekuensi pembajakan socket — mitigasi dari Docker Socket Security.
- Engine dan base image berada pada versi terkini. Versi engine yang tua kehilangan perbaikan keamanan setiap bulan berjalan — kebiasaan pembaruan dari Update dan Rollback.
- Socket Docker tidak di-mount ke container. Agent CI dan monitoring memakai socket-proxy, bukan socket asli yang memberi root host — pola penutup Docker Socket Security.
Operasional #
Empat butir terakhir menjaga agar enam kategori di atas tetap benar enam bulan ke depan, bukan hanya hari ini.
- Log berrotasi. Driver
json-fileataulocaldenganmax-sizemencegah log memenuhi disk diam-diam — pengaturan dari Logging Production. - Monitoring anomali aktif. Lonjakan CPU, memori, atau jumlah restart harus terlihat sebelum menjadi insiden — praktik Monitoring Resource.
- Pembaruan berjalan sesuai jadwal yang terdokumentasi. Jendela update rutin dengan rencana rollback tertulis, bukan pembaruan dadakan saat insiden — ritme dari Update dan Rollback.
- Audit keamanan berkala dijalankan ulang. Checklist ini dibaca ulang setiap rilis besar karena keputusan lama bisa menjadi celah baru — kebiasaan dari Checklist Production.
Cara Memakai #
Checklist ini dirancang untuk diaudit setiap rilis, bukan sekali saat go-live: baca butir per butir, centang hanya yang benar-benar bisa dibuktikan dengan perintah atau berkas, dan catat buktinya singkat. Butir yang tidak bisa dicentang berstatus pemblokir rilis — bukan saran yang bisa ditunda dengan alasan “nanti dulu” — karena setiap butir lahir dari kegagalan nyata yang pernah dibedah di chapter asalnya. Checklist yang dijalankan setengah lebih berbahaya daripada tidak ada checklist, karena menghasilkan rasa aman tanpa pertahanan.
Contoh docker run Hardened #
Seluruh butir runtime dan jaringan bertemu dalam satu perintah berikut — bentuk akhir yang layak dijadikan patokan saat menulis service produksi mana pun:
$ docker run -d --name web --network app-net \
--user 1000:1000 --read-only --tmpfs /tmp \
--cap-drop=ALL --security-opt no-new-privileges \
--memory=256m --cpus=0.5 --pids-limit=100 \
myapp:1.0.0Output yang Dihasilkan:
57f2e1cb44df44e3db76664af959a9973b50d8a140f4536ea8dc4d17bc5d7823Mari kita telaah enam penguatan yang terpasang pada perintah di atas:
--user 1000:1000— proses berjalan sebagai UID biasa, bukan root; identitas numerik dipilih agar tidak bergantung pada isi/etc/passwdimage.--read-only --tmpfs /tmp— rootfs dibekukan sepenuhnya dan hanya/tmpyang bisa ditulis, sehingga berkas curian tidak punya tempat bersembunyi.--cap-drop=ALL— container lahir tanpa satu capability pun; bila aplikasi butuh misalnya port di bawah 1024, tambahkan--cap-add=NET_BIND_SERVICEsatu per satu.--security-opt no-new-privileges— kernel menolak semua percobaan menaikkan hak, termasuk lewat berkas setuid yang mungkin tersisa dari base image.--memory=256m --cpus=0.5— container yang rakus kehabisan napas sendiri tanpa menyeret host dan tetangga ke dalam kelaparan memori.--pids-limit=100— proses baru berhenti di angka seratus, memutus fork bomb lebih awal daripada--memorymelakukannya.
Flag --network app-net melengkapi keenam poin di atas: container hanya berbagi network dengan service yang memang satu stack, tanpa port yang diterbitkan ke host.
Dua puluh sembilan butir dan satu perintah hardened ini menutup sisi pertahanan Course, tetapi keamanan dan seluruh topik lainnya terus bergerak: versi engine berganti tiap bulan, image base ditambal, dan dokumentasi resmi bertambah halaman. Membaca dokumentasi adalah keterampilan terakhir yang membedakan pengguna Docker dari penjemput jawaban. Chapter penutup section ini memetakan seluruh Sumber Belajar Resmi — dokumentasi Docker, spesifikasi industri, dan urutan membaca yang paling efisien.
Referensi #
- Docker Engine Security — rangkuman resmi seluruh mekanisme keamanan daemon dan container.
- Referensi docker run
— flag runtime seperti
--read-only,--cap-drop, dan--security-opt. - Docker Scout — pemindaian CVE dan kebijakan ambang di pipeline.