Sistem/DevOps•8 dk okuma

Kerberos Service Principal Name (SPN) Hataları ve Web/SQL Sistemlerinde Double-Hop Yetki Sorunları

Kullanıcının web uygulamasına bağlanıp oradan arkadaki SQL sunucusuna erişmek istediğinde kimlik bilgilerinin kaybolması (Double-Hop), setspn komutu ve Kerberos Constrained Delegation (KCD) yapılandırması.

AE

Ahmet Ertekin

08 July 2022

Kerberos Service Principal Name (SPN) Hataları ve Web/SQL Sistemlerinde Double-Hop Yetki Sorunları

Kerberos Service Principal Name (SPN) Hataları ve Web/SQL Sistemlerinde Double-Hop Yetki Sorunları

Bir yazılımcı veya sistem mühendisinin en çok saç baş yolduğu hata şudur: "Web sunucusu üzerinde oturum açtığımda veritabanına bağlanabiliyorum; ama kullanıcı kendi bilgisayarından tarayıcıyla web sunucusuna bağlanıp bir rapor çekmek istediğinde 'NT AUTHORITY\ANONYMOUS LOGON' hatası alıyor!" Bu klasik bir Kerberos Çift Atlama (Double-Hop Problem) krizidir. Kullanıcının kimlik bilgileri istemciden web sunucusuna (1. Atlama) geçer; ancak web sunucusu güvenlik gereği bu bileti arkadaki SQL sunucusuna (2. Atlama) aktaramaz.

1. Kerberos Service Principal Name (SPN) Nedir?

Kerberos'un bir servis hesabını (örneğin SQL Server servis hesabını) tanıyabilmesi için o servisin ağdaki adına bir etiket yapıştırılması gerekir. Buna SPN (Service Principal Name) denir.

Eğer SPN tanımlanmamışsa veya mükerrer (duplicate) tanımlanmışsa, Kerberos devreden çıkar ve sistem güvensiz NTLM'e düşer. NTLM ise çift atlamayı kesinlikle desteklemez!

# SQL Server için SPN kaydı oluşturma
setspn -S MSSQLSvc/sql-prod.holding.local:1433 HOLDING\svc_sql

# IIS Web Sunucusu için SPN kaydı oluşturma
setspn -S HTTP/erp.holding.local HOLDING\svc_iis

# Ağdaki mükerrer (çakışan) SPN kayıtlarını arama
setspn -X

2. Kerberos Constrained Delegation (KCD) ile Çift Atlamayı Çözme

Web sunucusunun kullanıcının kimliğini arkadaki SQL sunucusuna güvenle aktarabilmesi için Kısıtlı Yetki Devri (Constrained Delegation) tanımlanmalıdır:

  1. Active Directory Users and Computers açılır.
  2. Web sunucusunun servis hesabına (svc_iis) sağ tıklanır -> Properties -> Delegation sekmesine gelinir.
  3. "Trust this user for delegation to specified services only" seçilir.
  4. "Use Kerberos only" veya protokol geçişi için "Use any authentication protocol" işaretlenir.
  5. "Add" butonuna basılarak arkadaki SQL sunucusunun MSSQLSvc servisi listeye eklenir.

Artık web sunucusu kullanıcının adına yalnızca ve yalnızca o SQL sunucusuna bilet isteyebilir!

3. İstemci Tarafında Kerberos Biletlerini İnceleme

Sorun yaşandığında kullanıcının bilgisayarında Kerberos biletinin alınıp alınmadığı kontrol edilir:

# İstemci üzerindeki aktif Kerberos biletlerini listeleme
klist

# Eski veya bozuk biletleri temizleme
klist purge

Karşılaşılan Kritik Hatalar ve Çözüm İpuçları

  • Duplicate SPN (Mükerrer SPN Felaketi): Aynı SPN kazara hem bir bilgisayar hesabına hem de bir kullanıcı hesabına tanımlanmışsa, etki alanındaki tüm Kerberos kimlik doğrulamaları kilitlenir. setspn -X çıktısında görülen mükerrer kayıt derhal setspn -D ile silinmelidir.
  • Account is sensitive and cannot be delegated: Eğer bir kullanıcı hesabının (özellikle Domain Admin'lerin) özelliklerinde "Bu hesap hassastır ve devredilemez" kutucuğu işaretliyse, o kullanıcı web uygulaması üzerinden SQL'e çift atlama yapamaz.

Mühendis Notu

Kurumsal web ve raporlama sistemlerinde NTLM kullanımına izin vermeyin. IIS üzerinde "Windows Authentication" sağlayıcılarında (Providers) Negotiate'i en üste koyun ve SPN kayıtlarını eksiksiz tanımlayarak tüm trafiği saf Kerberos'a zorlayın.