Memahami Service Principal Name (SPN) sebagai identitas layanan di realm, cara mendaftarkan SPN dari Windows dengan setspn dan dari Linux dengan msktutil serta ktpass, hingga jenis-jenis delegation Kerberos beserta risikonya.

Di episode 19 kalian menjadikan server Linux warga domain AD: objek computer terdaftar, keytab host dihasilkan, dan SSSD menjembatani autentikasi Kerberos dengan PAM dan NSS. Mesin kini bisa membuktikan identitasnya ke KDC. Tapi bagaimana dengan layanan? Saat sebuah aplikasi menawarkan HTTP atau SSH, KDC perlu tahu service mana yang sedang diminta — di situlah Service Principal Name (SPN) berperan.
Episode 20 membedah SPN sebagai identitas layanan di realm, cara mendaftarkannya dari sisi Windows dan Linux, lalu masuk ke dunia delegation Kerberos: mekanisme yang mengizinkan sebuah service meminta tiket atas nama user. Delegation adalah fitur yang sangat kuat dan sekaligus sangat berbahaya bila dikonfigurasi sembarangan.
SPN adalah pengenal unik sebuah layanan di dalam realm. Formatnya selalu tiga bagian: nama layanan, host, dan realm.
| Bagian | Contoh | Fungsi |
|---|---|---|
| service | HTTP | Nama layanan yang ditawarkan (HTTP, SSH, LDAP, cifs, host) |
| host | web01.example.com | Nama lengkap host tempat layanan berjalan |
| realm | EXAMPLE.COM | Realm Kerberos tempat akun layanan terdaftar |
Saat klien ingin mengakses layanan HTTP/web01.example.com, klien meminta service ticket untuk SPN itu ke KDC. KDC akan mencari akun mana yang memiliki SPN tersebut, lalu menandatangani tiket dengan kunci akun itu. Ini persis alur yang kalian lihat di episode 3: tanpa SPN yang benar, KDC menjawab KDC_ERR_S_PRINCIPAL_UNKNOWN — "server not found in Kerberos database".
Di dunia Windows, SPN dikelola dengan setspn. SPN dilekatkan ke sebuah akun user atau computer yang menjadi "identitas" layanan:
setspn -S HTTP/web01.example.com svc-web
setspn -L svc-web
setspn -Q HTTP/web01.example.comsetspn -S melakukan penambahan sekaligus pengecekan duplikat — perintah ini akan menolak jika SPN sudah dimiliki akun lain.setspn -L menampilkan daftar SPN yang dimiliki sebuah akun.setspn -Q menanyakan siapa pemilik SPN tertentu; sangat berguna untuk mendeteksi duplikasi.SPN di dalam realm wajib unik. Jika dua akun memiliki SPN yang sama, KDC tidak tahu kunci mana yang dipakai untuk menandatangani service ticket. Dampaknya: autentikasi layanan menjadi tidak stabil — kadang berhasil, kadang gagal dengan KRB_AP_ERR_MODIFIED. Perhatikan hal-hal berikut:
setspn -S (bukan setspn -A dari era lama) agar duplikat langsung terdeteksi saat pendaftaran.setspn -Q */* dan filter hasil yang muncul lebih dari sekali.Tip
SPN yang terduplikasi hampir mustahil didiagnosis dari sisi klien — gejalanya hanya KRB_AP_ERR_MODIFIED saat koneksi. Biasakan audit setspn -Q */* secara rutin, bukan hanya ketika muncul masalah.
Aplikasi Linux juga butuh SPN, dan ada dua jalur utama: menggunakan tool msktutil untuk mengelola machine account beserta SPN-nya dari sisi Linux, atau menghasilkan keytab dari AD dengan ktpass di sisi Windows.
msktutil adalah utilitas yang memungkinkan Linux membuat dan memperbarui machine account di AD, menambah SPN, serta menulis keytab:
msktutil create --computer-name web01 \
--service HTTP/web01.example.com \
--upn svc-web@EXAMPLE.COM \
--server dc01.example.com \
--keytab /etc/krb5.keytab--service menambahkan SPN ke machine account.--upn menetapkan User Principal Name akun tersebut.--keytab menentukan lokasi file keytab yang dihasilkan.Setelah keytab tersedia, verifikasi isinya dan uji autentikasi tanpa password:
klist -kt /etc/krb5.keytab
kinit -k -t /etc/krb5.keytab HTTP/web01.example.comPendekatan klasik dari sisi Windows adalah ktpass yang dijalankan di domain controller atau workstation dengan tools RSAT:
ktpass -princ HTTP/web01.example.com@EXAMPLE.COM \
-mapuser svc-web \
-crypto AES256-SHA1 \
-ptype KRB5_NT_PRINCIPAL \
-out /tmp/web01.keytab/princ menentukan SPN yang menjadi identitas utama keytab./mapuser memetakan SPN tersebut ke akun AD svc-web./crypto AES256-SHA1 memastikan hanya enkripsi AES yang dipakai — hindari RC4 (detail di episode 21).klist -kt web01.keytab serta kinit -k -t web01.keytab HTTP/web01.example.com.Baik lewat msktutil maupun ktpass, hasil akhirnya sama: keytab berisi kunci akun yang SPN-nya cocok, siap dipakai aplikasi untuk menerima tiket.
Delegation mengizinkan sebuah service meminta tiket atas nama user ke layanan lain. Ada tiga model dengan tingkat risiko berbeda:
| Jenis | Konfigurasi | Cara Kerja | Risiko |
|---|---|---|---|
| Unconstrained | Trust for delegation to any service | Service menerima TGT user dan bisa meniru user ke layanan mana pun | Sangat tinggi |
| Constrained | Trust for delegation to specified services | Service hanya bisa meniru user ke layanan yang terdaftar | Sedang |
| Resource-based | Dikonfigurasi di sisi resource | Resource menentukan akun mana yang boleh mendelegasikan padanya | Terkontrol |
Model tertua: front-end menerima TGT user sebagai bagian dari alur dan menyimpannya di memori. Dengan TGT itu, front-end bisa meminta tiket ke layanan mana pun — selama TGT valid. Karena TGT disimpan, satu machine yang disusupi akan langsung memberikan akses ke seluruh domain. Microsoft menyarankan menghindari model ini kecuali untuk kasus khusus yang sangat terisolasi.
Model kedua membatasi target: front-end hanya bisa mendelegasikan ke daftar layanan tertentu yang diizinkan. Kelebihannya adalah dukungan protocol transition — user yang masuk lewat autentikasi non-Kerberos (misalnya NTLM atau sertifikat) tetap bisa dialihkan ke layanan Kerberos lain. Ini melibatkan dua mekanisme:
Model paling modern: konfigurasi dilakukan di akun resource (backend), bukan di front-end. Resource menyatakan daftar akun yang diizinkan mendelegasikan padanya. Karena disetel pada resource, ini cocok untuk skenario di mana tim pemilik backend ingin mengontrol siapa yang boleh menyambung ke layanannya. Resource-based delegation juga memakai S4U2Self dan S4U2Proxy, tapi arah konfigurasinya terbalik.
Untuk mengaktifkan constrained delegation di AD:
cifs/file01.example.com.Resource-based delegation dikonfigurasi lewat PowerShell pada akun resource:
Set-ADComputer file01 -PrincipalsAllowedToDelegateToAccount web01$Perintah di atas menyatakan: akun computer file01 mengizinkan web01 mendelegasikan padanya. Arah kontrol kini di tangan pemilik resource.
Untuk memastikan delegation bekerja, jalankan klist di sesi front-end dan periksa keberadaan service ticket untuk backend. Saat alur S4U2Proxy berjalan, front-end akan memiliki tiket cifs/file01 yang diperoleh atas nama user. Jika tiket tidak muncul padahal semua konfigurasi sudah benar, periksa kembali apakah SPN backend sudah terdaftar pada akun resource, dan apakah opsi "use any authentication protocol" benar-benar dibutuhkan.
Delegation adalah tambang emas bagi penyerang yang sudah punya akses ke satu service:
krbtgt yang dicuri, penyerang memalsukan TGT untuk akun mana pun, termasuk akun istimewa. Delegation memperluas dampaknya karena tiket palsu itu bisa dipakai untuk meniru user.Mitigasi penting yang bisa langsung kalian terapkan:
Warning
Unconstrained delegation memberikan TGT user langsung kepada service. Jika kalian menemukan akun dengan unconstrained delegation yang tidak dikenal, anggap itu indikator kompromi — segera audit siapa yang melewati service tersebut dan pindahkan ke model constrained atau resource-based.
Episode 20 ini memberi kalian peta lengkap identitas layanan dan delegation: SPN sebagai pengenal unik layanan, pendaftaran via setspn di Windows serta msktutil dan ktpass di Linux, perbandingan tiga jenis delegation, hingga risiko Golden Ticket dan Silver Ticket yang membayangi konfigurasi yang ceroboh.
Inti yang harus dibawa pulang:
service/host@REALM dan wajib unik; gunakan setspn -S dan audit setspn -Q */* secara rutin.msktutil (dari Linux) atau ktpass (dari Windows), dan wajib menggunakan enkripsi AES.Di episode 21 kalian akan mengubah pandangan dari "fitur" ke "senjata": Kerberos Security Best Practices — hardening enkripsi, keamanan KDC, membedah serangan Kerberos seperti Kerberoasting dan Pass-the-Ticket, serta strategi deteksinya. Sampai jumpa!