Paket 2 · Praktik LanjutanModul H — DevSecOps

Secrets, SSH & Access Management

Mengelola secret aplikasi, kunci SSH, token CI, rotasi, least privilege, dan audit akses.

Kebocoran kredensial adalah salah satu penyebab insiden paling umum. Secret harus disimpan, dibagikan, dan dirotasi dengan cara yang terkontrol.

Jenis secret

SecretContoh
PasswordDatabase, admin panel
API keyLayanan pihak ketiga
TokenCI/CD, registry
Private keySSH, signing
CertificateTLS, client cert
Connection stringDatabase URL

Yang tidak boleh dilakukan

  • Commit .env ke Git.
  • Menaruh secret di image Docker.
  • Menulis secret di log.
  • Mengirim secret lewat chat.
  • Memakai satu password untuk semua layanan.
  • Menyimpan secret di wiki terbuka.

Secret yang ter-commit harus dianggap bocor

Menghapus file di commit baru tidak cukup. Rotasi kredensial, hapus dari riwayat Git, dan audit penggunaan.

Tingkat pengelolaan

SkalaSolusi
Kecil.env permission 600 + secret CI
MenengahSOPS + age/KMS, Vault
BesarVault, cloud secret manager, workload identity

.env dengan aman

cat > /srv/app/.env <<'EOF'
NODE_ENV=production
DATABASE_URL=postgres://app:pass@10.10.10.20:5432/app
EOF

chown deploy:deploy /srv/app/.env
chmod 600 /srv/app/.env

Pastikan .env ada di .gitignore dan .dockerignore.

Secret CI

GitHub Actions

env:
  DATABASE_URL: ${{ secrets.DATABASE_URL }}
  • Gunakan environment production dengan reviewer.
  • Batasi permissions.
  • Jangan mencetak secret.
  • Rotasi token secara berkala.

GitLab CI

deploy:
  script:
    - echo "Deploy menggunakan $DEPLOY_TOKEN"
  environment: production

Tandai variable Protected dan Masked.

SOPS + age

SOPS mengenkripsi nilai secret di file yang tetap bisa di-commit.

age-keygen -o key.txt
sops --encrypt --age <public-key> secrets.yaml > secrets.enc.yaml
sops --decrypt secrets.enc.yaml

File terenkripsi aman di repository; private key disimpan di tempat aman.

HashiCorp Vault

Vault menyediakan secret dinamis, leasing, dan audit.

vault kv put secret/app db_password=...
vault kv get secret/app

Aplikasi mengambil secret saat runtime dengan token terbatas, bukan menyimpan permanen.

SSH key management

Buat kunci dengan passphrase

ssh-keygen -t ed25519 -a 100 -C "deploy@ci"

Batasi kunci

Di ~/.ssh/authorized_keys:

restrict,command="/usr/local/bin/deploy.sh" ssh-ed25519 AAAA... deploy-ci

Opsi restrict menonaktifkan forwarding, PTY, dan fitur lain yang tidak perlu.

Rotasi

  1. Buat kunci baru.
  2. Tambahkan ke server.
  3. Uji akses.
  4. Hapus kunci lama.
  5. Perbarui CI.

Least privilege

  • User deploy hanya boleh mengakses direktori aplikasi.
  • Database user hanya boleh operasi yang dibutuhkan.
  • Token CI hanya untuk repo/environment terkait.
  • Jangan memakai kredensial admin untuk rutinitas.

MFA dan akses admin

  • Aktifkan MFA di GitHub/GitLab/Cloudflare.
  • Batasi akses panel dengan Tailscale/IP allowlist.
  • Gunakan akun terpisah untuk admin.
  • Catat akses darurat (break-glass).

Audit

  • Aktifkan audit log di GitHub/GitLab.
  • Pantau login SSH.
  • Pantau penggunaan token.
  • Tinjau akses secara berkala.
  • Hapus akun/kunci yang tidak dipakai.
journalctl -u ssh --since "7 days ago" | grep -i "accepted\|failed"

Praktik: menyiapkan deploy token

  1. Buat user deploy di server.
  2. Buat SSH key khusus CI tanpa passphrase, simpan di secret CI.
  3. Batasi authorized_keys dengan restrict.
  4. Beri akses hanya ke /srv/app.
  5. Simpan token registry terpisah.
  6. Dokumentasikan rotasi.
  7. Audit akses bulanan.

Ringkasan

  • Secret harus disimpan terenkripsi dan tidak masuk Git/image/log.
  • Gunakan secret CI, SOPS, atau Vault sesuai skala.
  • SSH key harus dibatasi dan dirotasi.
  • Least privilege dan audit mengurangi risiko.

Selanjutnya

On this page