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
| Secret | Contoh |
|---|---|
| Password | Database, admin panel |
| API key | Layanan pihak ketiga |
| Token | CI/CD, registry |
| Private key | SSH, signing |
| Certificate | TLS, client cert |
| Connection string | Database URL |
Yang tidak boleh dilakukan
- Commit
.envke 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
| Skala | Solusi |
|---|---|
| Kecil | .env permission 600 + secret CI |
| Menengah | SOPS + age/KMS, Vault |
| Besar | Vault, 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/.envPastikan .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: productionTandai 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.yamlFile 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/appAplikasi 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-ciOpsi restrict menonaktifkan forwarding, PTY, dan fitur lain yang tidak perlu.
Rotasi
- Buat kunci baru.
- Tambahkan ke server.
- Uji akses.
- Hapus kunci lama.
- 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
- Buat user
deploydi server. - Buat SSH key khusus CI tanpa passphrase, simpan di secret CI.
- Batasi
authorized_keysdenganrestrict. - Beri akses hanya ke
/srv/app. - Simpan token registry terpisah.
- Dokumentasikan rotasi.
- 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
Amankan artefak di Container & Dependency Security.
DevSecOps Fundamentals & Security Pipeline
Menerapkan keamanan di setiap tahap pipeline: SAST, SCA, secret scanning, container scan, SBOM, signing, dan policy gate.
Container & Dependency Security
Mengamankan image dan dependency: base image minimal, non-root, scanning, SBOM, signing, dan pembaruan otomatis.