Setiap dependency membawa lisensinya sendiri dan satu pilihan salah bisa memaksa open-sourcing seluruh produk; di episode ini kalian memahami spektrum lisensi copyleft vs permissive, mendeteksi lisensi otomatis dengan syft dan licensee, menyusun license policy organisasi, serta membangun approval workflow dependency baru yang tetap ramah developer

Episode 12 membahas SBOM sebagai daftar isi dependency — untuk keamanan. Episode ini menutup sisi lain dari daftar itu: lisensi. Setiap package yang kalian install membawa kontrak hukum, dan sebagian kontrak itu punya gigi: lisensi copyleft kuat bisa mewajibkan kalian membuka source seluruh produk komersial jika cara distribusinya keliru.
Ini bukan masalah teoretis: produk SaaS sudah pernah harus rewrite komponen karena terlanjur memakai library AGPL; vendor hardware pernah recall firmware karena GPL compliance. Sebagai DevSecOps engineer, tugas kalian membuat keputusan lisensi ini otomatis dan dini — di PR saat dependency ditambahkan, bukan saat due diligence akuisisi.
| Kategori | Contoh | Implikasi Praktis |
|---|---|---|
| Permissive | MIT, Apache-2.0, BSD | Aman hampir semua use case; jaga attribution |
| Weak copyleft | LGPL, MPL-2.0, EPL | Batasan hanya pada file/library itu |
| Strong copyleft | GPL-2.0/3.0 | Turunan wajib open source bila didistribusikan |
| Network copyleft | AGPL-3.0 | Memicu bahkan untuk penggunaan via network (SaaS) |
Dua catatan penting:
Tool yang sudah kalian kenal bisa langsung dipakai:
syft dir:. -o cyclonedx-json \
| jq -r '.components[] | select(.licenses) | "\(.name) -> \(.licenses[0].license.id)"'Untuk ekosistem tertentu, tool native lebih cepat:
npx license-checker --summary --onlyAllow "MIT;Apache-2.0;BSD-3-Clause;ISC"Tantangan teknisnya: metadata lisensi kadang kosong/salah di manifest. Tool seperti scancode-toolkit melakukan deteksi mendalam dengan membaca file LICENSE asli — lebih akurat tapi lambat; pola umumnya: checker cepat di setiap PR, scancode mendalam berkala.
Kebijakan yang bisa dieksekusi mesin, bukan dokumen 40 halaman:
allowed:
- MIT
- Apache-2.0
- BSD-2-Clause
- BSD-3-Clause
- ISC
review-required:
- LGPL-2.1 # ok jika dinamically linked & replacable
- MPL-2.0 # ok untuk file-level isolation
denied:
- GPL-2.0 # risiko distribusi produk kita
- GPL-3.0
- AGPL-3.0 # produk kita = network service
- Unlicensed # tanpa lisensi = all rights reserved!
- Unknown # harus diklarifikasi manual
exceptions:
- package: internal-fork-gpl-lib
reason: "Fork internal, tidak didistribusikan keluar"
expires: "2027-01-01"Perhatikan dua kategori yang sering terlupakan: Unlicensed dan Unknown — kode tanpa lisensi secara default tidak boleh dipakai sama sekali. Dan exceptions tetap mengikuti pola series ini: berjustifikasi + expiry.
Policy di atas dieksekusi sebagai gate sederhana:
jobs:
license-gate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Cek lisensi vs policy
run: |
npx license-checker --json > licenses.json
node scripts/check-license-policy.js \
licenses.json license-policy.yamlScript membandingkan hasil scan terhadap YAML policy → fail dengan pesan jelas kalau ada lisensi denied. Developer yang menambahkan package GPL akan tahu dalam hitungan menit di PR, bukan enam bulan kemudian.
Tip
Jalankan license gate pada level lockfile, bukan sekadar direct dependencies — lisensi transitive yang paling sering lolos perhatian namun sama mengikatnya.
Lisensi adalah salah satu dimensi review dependency baru; gabungkan dengan risiko supply chain (episode 12) menjadi checklist approval:
[x] Lisensi sesuai policy? -> gate otomatis
[x] Maintenance sehat? -> commit aktif 6 bulan, maintainer > 1
[x] Popularitas cukup? -> downloads/stars sebagai sinyal
[x] Tidak typo-squat? -> verifikasi nama resmi
[x] Dibutuhkan nyata? -> bisakah stdlib/internal lib?
[x] Alternatif berlisensi aman ada? -> bandingkan duluUntuk organisasi besar: private registry proxy (Artifactory/Nexus) dengan allowlist membuat workflow ini natural — package baru harus di-request, lalu tersedia untuk semua tim setelah disetujui sekali.
Sisi positif compliance: lisensi permissive biasanya hanya minta attribution. Otomasikan pembuatan NOTICE file:
npx license-checker --production --csv > THIRD-PARTY-NOTICES.csv
# atau dari SBOM:
syft myapp:latest -o template --file NOTICES.tmplGenerate di pipeline rilis → file selalu sinkron dengan dependency aktual → satu beban audit hilang permanen.
Inti yang harus dibawa pulang:
Di episode 24 selanjutnya kita membahas Security Observability — menyatukan semua telemetry security yang tersebar di episode-episode sebelumnya: pipeline detection-as-code dengan Sigma rules, integrasi SIEM, dan metrik-metrik yang menunjukkan apakah deteksi kalian benar-benar mencakup ancaman yang relevan. Sampai jumpa!