Service Principal Name (SPN) nedir?
Bu yazımızda Service Principal Name (SPN) hakkında konuşacağız. Active Directory ve SQL Server arasında Kerberos kimlik doğrulaması için kullanılan benzersiz bir tanımlayıcıdır. SQL Server instance’ının hangi Windows hesabı altında çalıştığını belirlemek için kullanılır. Kerberos kimlik doğrulaması, istemci ve sunucunun aynı Windows etki alanında veya güvenilen etki alanlarında olmasını ve SPN’nin Active Directory ile kaydedilmiş olmasını gerektirir. SPN kaydedilmediğinde veya kayıt başarısız olduğunda, Windows güvenlik katmanı hesabı SPN ile ilişkilendiremez ve Kerberos kimlik doğrulaması kullanılmaz.
Kerberos nedir dediğimizde ise, Windows 2000’den itibaren Active directory etki alanları için varsayılan kimlik doğrulama protokolüdür. Simetrik şifreleme tekniği kullandığından dolayı NTLM’den daha güvenilir ve daha hızlıdır.
Kerberos Authentiction’ın bize faydalarına bakarsak eğer,
- Client ve server arasında doğrulama yaparak güvenli bir şekilde doğrulama yapmaktadır. Biz buna Mutual Authentication diyoruz.
- Doğrulama yaparken server ve client arasında ticket alışverişi yapar ve bu alışveriş kriptoludur bu şekilde daha güvenli hale getirir. Bu durumu Secure Authentication olarak adlandırıyoruz.
- Bir kullanıcı oturum açtığında ticket’ın süresi dolmadığı sürece tekrardan loglama gereği duymaz ve entegre olarak çalışır. Buna Integrated Authentication olarak adlandırıyoruz.
Kerberos, güvenli bir network bağlantısı kurmadan önce client ve server arasında karşılıklı bir mekanizma oluşturur. Bu mekanizmanın yönetiminde trusted third party olan Key Distributed Center (KDC) kullanır.
SQL Server, Windows Authentication kullanırken, Windows Security Support Provider Interface (SSPI) aracılığı ile kerberos’u dolaylı olarak destekler. Eğer kerberos kullanılmıyorsa, Windows NT Challenge/Response (NTLM) authentication yöntemine geri döner ve SPN bağlantının kimliğini doğrulamak için Key Distributed Center (KDC)’a gönderilir.
Görsel – 1: NTLM Connect
Görsel – 2: Kerberos Connection
SQL Server aşağıdaki kimlik doğrulamalarını destekler;
- TCP/IP
- Named pipes
- Shared memory
Service Principal Name (SPN) Active Directory’ye kayıtlı olmalıdır. Windows, domainde Key Distributed Center (KDC) rolünü üstlenir. SPN, kaydolduktan sonra SQL Server Instance service’ini başlatan servis hesabı ile Windows hesabı eşleşir. SPN kaydı gerçekleştirilmediyse veya başarısız olursa, Windows güvenlik katmanı SPN ile ilişkili hesabı belirleyemez ve Kerberos kimlik doğrulaması kullanılmaz.
Eğer SPN otomatik olarak oluşmazsa manuel olarak eklenmesi gerekmektedir. DAC kullanıcısı için yeni bir SPN kaydı oluşturmamız gerek yoktur DAC kullanıcısı NTLM bağlantısınıı kullanarak connect yapmaktadır.
Aşağıdaki sorgu ile bağlantıların nasıl yapıldığını görebiliriz.
SELECT auth_scheme FROM sys.dm_exec_connections WHERE session_id = @@spid
Aşağıdaki sorgu ile hangi bağlantıdan kaç kere yapıldığını görebiliriz.
SELECT COUNT(auth_scheme) as sessions_count, net_transport, auth_scheme FROM sys.dm_exec_connections GROUP BY net_transport, auth_scheme
Aşağıdaki sorgu ile hangi Client ve program üzerinden atılan bağlantılar görebiliriz.
SELECT DISTINCT DB_NAME(database_id), auth_scheme, net_transport, client_net_address, local_tcp_port, [host_name], [program_name], login_name FROM sys.dm_exec_connections c JOIN sys.dm_exec_sessions s ON c.session_id = s.session_id WHERE [host_name] = SUBSTRING(@@SERVERNAME, 1, LEN(@@SERVERNAME) - CHARINDEX('\', REVERSE(@@SERVERNAME)));
SPN kayıtlarının otomatik olarak yapılmasını istiyorsanız SQL Server Service hesabına;
- Read servicePrincipalName
- Write servicePrincipalName
yetkilerinin verilmesi gerekmektedir.
Konu hakkında daha detaylı bilgi almak için aşağıdaki linki okuyabilirsiniz.
SPN benzersiz bir tanımlayıcı olduğu için Active directory katmanında tek olması gerekmektedir. Duplicate olması durumunda hangi SPN’leri duplicate olduğu bulunup kaldırılması gerekmektedir. Bu işlemlerin hepsi Powershell üzerinden Run as Administrator olarak çalıştırılarak dikkatli bir şekilde yapılmalıdır.
İlgili sunucuda eksik olan SPN’leri bulmak için “Microsoft Kerberos Configuration Manager for SQL Server” uygulamasını indirip kurduktan sonra size eksik olan SPN kayıtlarını gösterecektir. Exe’ye aşağıdan ulaşabilirsiniz.
https://www.microsoft.com/en-us/download/details.aspx?id=39046
Exe’nin kurulumunu gerçekleştirdikten sonra aşağıdaki path’e dosyalar gelecektir.
C:\Program Files\Microsoft\Kerberos Configuration Manager for SQL Server
Görsel – 3
İlgili sunucuda KerberosConfigMgr.exe dosyasını yönetici olarak çalıştırdıktan sonra, Connect sekmesine tıklayıp, ServerName kısmına (.) koyduktan sonra Connect diyoruz.
Kerberos uygulaması bize eksik olanları listeleyecektir. AD katmanında yönetici tarafından error olarak gelen sonuçlar fixlenerek SPN kayıtları güncellenir.
Görsel – 4
Görsel – 5
Görsel – 6
1-) SPN Kayıtlarını kontrol etmek için;
Kullanici ve Bilgisayar Adına Göre SPN kaydı Listelemek için;
setspn -L <Kullanici> setspn -L <ServerName>
SPN kaydını eklemek için;
SetSPN -s "MSSQLSvc/server.domain.com:port" "domain\serviceuser" or SetSPN -s "MSSQLSvc/ server.domain.com:InstanceName" "domain\serviceuser"
SPN kaydını silmek için;
SetSPN -d "MSSQLSvc/ server.domain.com:port" "domain\serviceuser"
Dublicate SPN kaydını bulmak için;
setspn -F -X
0 Yorum