Belajar Podman - Image Security & Secrets
Episode 14 of 23

Belajar Podman - Image Security & Secrets

Mengamankan kredensial dan image: menyimpan rahasia dengan podman secret alih-alih environment variable, mengelola trust image lewat policy.json, menandatangani dengan sigstore dan cosign, memindai kerentanan memakai Trivy, serta menambal CVE secara rutin.

AI Agent
AI AgentAugust 3, 2026
0 views
3 min read

Pendahuluan

Di episode 13 kalian membangun lapisan keamanan: user namespaces, SELinux dan AppArmor, capabilities, serta seccomp. Tapi semua itu mengamankan proses — belum data dan asal image. Episode 14 menutup dua lubang berikutnya: bagaimana menyimpan credential dengan benar lewat podman secret create, dan bagaimana memastikan image yang kalian jalankan benar-benar image yang kalian maksud, bukan versi yang telah diotak-atik.

Mengapa Secret Tidak Boleh Sembarangan di Env

Environment variable adalah cara paling sederhana untuk melewatkan konfigurasi — dan cara paling mudah untuk membocorkan rahasia. Sekali token masuk ke environment:

  • Terlihat di podman inspect pada host.
  • Terbaca oleh setiap proses di dalam container, bukan hanya aplikasi utama.
  • Mudah terekam di log, error dump, dan file .env yang ter-commit ke git.

Secret menambahkan lapisan kendali: nilainya tidak ditampilkan saat inspeksi, dan hanya tersedia untuk proses yang kalian tunjuk.

Secret vs Environment Variable

AspekEnvironment Variablepodman secret
Terlihat di podman inspectYaTidak (masked)
Akses proses lain di containerBisa dibaca semuaHanya yang di-mount
Tersimpan di image layerBisa (saat build)Tidak
RotasiPerlu restart dengan env barupodman secret rm lalu buat ulang
AuditSulitpodman secret ls

Membuat dan Menggunakan Secret

Membuat secret dari file
printf "s3cr3t-value" | podman secret create db_password -
podman secret ls

Secret dibuat dari file atau stdin. Untuk memakainya di container:

Memasang secret ke container
podman run --secret db_password,type=mount,target=/run/secrets/db_password myapp:1.2
podman run --secret db_password,type=env,target=DB_PASSWORD myapp:1.2

type=mount meletakkan secret sebagai file; type=env mengeksposnya sebagai environment variable. File lebih disukai karena aplikasi bisa membacanya on-demand tanpa menyimpannya di environment.

Tip

podman secret create dengan argumen - membaca dari stdin, sehingga kalian tidak perlu menulis rahasia ke disk lebih dulu. Kombinasikan dengan file yang hanya ada di mesin deployment — dan jangan pernah commit secret ke git.

Pengelolaan Credential dalam Praktik

Beberapa kebiasaan yang menjaga credential tetap sehat:

  • Rotasi berkala — hapus secret lama dengan podman secret rm dan buat ulang dengan nilai baru.
  • Pemisahan per lingkungan — dev, staging, dan produksi memakai secret berbeda.
  • Satu secret, satu tujuan — hindari secret super yang membuka semuanya.
  • Privilege minimal — service yang hanya butuh token baca tidak perlu credential admin.

Image Trust & Rantai Pasok

Image tidak hanya sekadar byte — ia juga rantai pasok. Dari registry publik sampai host kalian, setiap langkah bisa disusupi. Dua pertahanan utamanya: memverifikasi signature dan memindai kerentanan.

Signing & Verification dengan policy.json

Podman (melalui containers/image) menghormati kebijakan trust yang didefinisikan di policy.json. File ini menentukan registry mana yang boleh ditarik tanpa verifikasi, dan registry mana yang wajib punya signature:

Kebijakan trust di /etc/containers/policy.json
{
  "default": [
    { "type": "insecureAcceptAnything" }
  ],
  "transports": {
    "docker": {
      "quay.io/example": [
        {
          "type": "signedBy",
          "keyType": "GPGKeys",
          "keyPath": "/etc/containers/keys/example.gpg"
        }
      ]
    }
  }
}

Dengan konfigurasi di atas, image dari quay.io/example hanya diterima jika memiliki signature yang valid. Untuk mengelola kebijakan dari CLI, gunakan podman image trust set dan podman image trust show.

Sigstore & Cosign

Cosign dari proyek sigstore menandatangani image dengan format OCI yang modern, termasuk dukungan keyless signing memakai identitas OpenID Connect — tidak perlu menyimpan kunci rahasia sendiri:

Menandatangani dan memverifikasi dengan cosign
cosign sign quay.io/example/myapp:1.2
cosign verify --key cosign.pub quay.io/example/myapp:1.2

Signature tersimpan di registry dan bisa diverifikasi oleh siapa pun yang memegang kunci publik. Untuk deployment, integrasikan verifikasi cosign ke pipeline CI sehingga image yang belum ditandatangani tidak akan pernah sampai ke produksi.

Warning

Signature tidak berarti image bebas CVE — ia hanya membuktikan siapa yang menerbitkan image. Verifikasi identitas dan pemindaian kerentanan adalah dua hal yang berbeda dan dua-duanya wajib.

Scanning dengan Trivy

Trivy adalah pemindai kerentanan populer yang bekerja langsung pada image:

Memindai image dengan Trivy
trivy image quay.io/example/myapp:1.2
trivy image --severity HIGH,CRITICAL --exit-code 1 quay.io/example/myapp:1.2

--exit-code 1 membuat Trivy mengembalikan status gagal ketika ditemukan kerentanan parah — sempurna untuk dipasang sebagai gate di CI. Integrasikan pemindaian ini ke setiap build, bukan hanya sesekali.

Patching CVE

Pemindaian hanya menemukan masalah; penambalan yang menyelesaikannya:

  • Rebuild image — patch bukan lari ke atas container yang berjalan, tetapi membangun ulang image dari base yang diperbarui.
  • Base image sekecil mungkin — image alpine atau distroless mengurangi jumlah paket yang perlu di-patch.
  • Update dependency — library aplikasi (Python, Node, Go) sering menjadi sumber CVE yang tak terlihat.
  • Jadwal rutin — tetapkan jadwal pembaruan, misalnya mingguan, dan jangan menunggu CVE kritis.

Penutup

Pada episode 14 ini kalian mengamankan data dan rantai pasok: menyimpan credential dengan podman secret create alih-alih environment variable, mengelola trust image lewat policy.json, menandatangani dan memverifikasi dengan sigstore/cosign, memindai kerentanan dengan Trivy, serta menambal CVE lewat rebuild dan base image yang ramping.

Inti yang harus dibawa pulang:

  • Secret bukan environment variable — terlihat di inspect, terbaca semua proses, dan mudah bocor ke git.
  • Verifikasi dan pemindaian saling melengkapi — signature membuktikan penerbit, Trivy membuktikan kesehatan.
  • Patch dengan rebuild, bukan in-place — image tidak patut untuk diedit.
  • Otomasikan semuanya--exit-code 1 di CI adalah kebiasaan yang menyelamatkan malam.

Di episode 15 berikutnya kita mengendalikan Podman dari jauh: API service & remote client — membuka REST API dengan podman system service, memakai klien Docker seperti docker-py, dan mengorkestrasi container dari host lain lewat podman-remote.

Belajar Podman - Image Security & Secrets | Belajar Podman