SQL Server Altyapısında gMSA Dönüşümü Nasıl Yapılır

Group Managed Service Accounts (gMSA), Windows Server 2012 ile tanıtılan, domain düzeyinde yönetilen özel bir hesap türüdür. Standart servis hesaplarının aksine, gMSA’nın en büyük özelliği parola yönetiminin tamamen Active Directory (AD) tarafından yapılmasıdır.

Avantajları

  • 30 günde bir (varsayılan) karmaşık parolalar AD tarafından otomatik değiştirilir. SQL servisinin kesilmesine neden olan “expired password” sorunları ortadan kalkar.
  • Parola hiçbir zaman bir insan tarafından bilinmez; bu da “Brute Force” veya “Social Engineering” risklerini minimize eder.
  • SQL Server servis hesabı değiştiğinde Kerberos kimlik doğrulaması için gerekli olan SPN (Service Principal Name) kayıtları, doğru yetkilendirme ile otomatik yönetilebilir.
  • Always On gibi cluster yapılarında birden fazla sunucunun (S1, S2) aynı hesabı aynı anda kullanmasına olanak tanır.

Dezavantajları / Kısıtlamaları

  • İnternet/Dış Bağlantı: gMSA hesapları interaktif olarak oturum açamaz (Interactive Login).
  • OS Desteği: En az Windows Server 2012 ve sonrası işletim sistemi gerektirir.

SQL Server servis hesabının (ister standart kullanıcı ister gMSA olsun) Local Administrator grubunda olması Microsoft tarafından önerilmez. gMSA hesabına sadece SQL Server’ın ihtiyaç duyduğu özel izinleri (Perform Volume Maintenance Tasks, Lock Pages in Memory vb.) ve veritabanı dosyalarının bulunduğu klasörler üzerinde “Full Control” yetkisi vermektir. Ancak, geçiş sürecinde mevcut yapınızda SqlUser local admin ise, servislerin ayağa kalkmasında sorun yaşamamak adına gMSA’ya önce bu yetkiyi verip, sistem stabil olduktan sonra yetkileri kısıtlamanız (Hardening) daha profesyonel bir yaklaşımdır.

S1 ve S2 node’larımız, SQLOU altında bir Security Group (Örn: SecurityGroup) ve bu gruba delegasyon verilmiş bir yapı mevcuttur.

Mevcutta bulunan Sql server service account’larımız:

KDS Root Key Oluşturulması (Domain Controller’da Bir Kez Yapılır)

AD’nin parola üretmeye başlaması için bu anahtar gereklidir. (Not: Yeni bir yapıda oluşturulduktan sonra 10 saat beklenmesi önerilir; test ortamında hemen kullanmak için -EffectiveTime parametresi kullanılır.)

PowerShell yönetici olarak çalıştırılır.

Add-KDSRootKey –EffectiveImmediately

Eğer lab ortamında çalışıyorsanız aşağıdaki komutu çalıştırarak hemen efektif hale gelmesini sağlayabilirsiniz.

Add-KdsRootKey -EffectiveTime ((Get-Date).AddHours(-10))

Test ortamında yapıldığı için aşağıdaki yapıda oluşturdum.

Security Group Hazırlığı

S1 ve S2 sunucularının bu gMSA hesabını “okuyabilmesi” için aynı grupta olmaları gerekir.

  1. AD üzerinde SecurityGroup adında bir Global Security Group oluşturulur. Mevcut yapımızda vardı.
  2. S1$ ve S2$ bilgisayar hesaplarını bu gruba üye yapın.
  3. Sunucuların grup üyeliğini algılaması için S1 ve S2’yi bir kez restart etmeniz veya oturumu yenilemeniz gerekebilir.

S1 ve S2 sunucularınızın sql_gMSA hesabının parolasını AD’den çekebilmesi için bu sunucuları bir gruba topluyoruz.

Aşağıdaki komut ile gMSA hesaabımız oluşturulur:

New-ADServiceAccount -Name "sql_gMSA" `
-DNSHostName "sql_gMSA.yunusyucel.com" `
-PrincipalsAllowedToRetrieveManagedPassword "SecurityGroup" `
-ManagedPasswordIntervalInDays 30 `
-KerberosEncryptionType AES128,AES256

gMSA’nın çalışma mantığı şöyledir:

  • SQL Server (S1 veya S2 üzerinde) çalışmaya başladığında şifreye ihtiyaç duyar.
  • İşletim sistemi AD’ye gider ve der ki: “Ben S1 sunucusuyum, sql_gMSA hesabının şifresini ver.”
  • AD, sql_gMSA hesabının özelliklerine bakar. Eğer şifreyi isteyen sunucu (S1), sizin belirttiğiniz SecurityGroup içerisinde yoksa, şifreyi vermez ve servis başlamaz. Bu sebeple oluşturulan security group çok önemlidir.

Eğer active directory modülü yüklü değilse eklenmesi gerekmektedir. Genellikle modülü yükleme ihtiyacı duymayız.

Import-Module ActiveDirectory

gMSA’nın Sunuculara Yüklenmesi (S1 ve S2 üzerinde)

Her iki SQL node’unda PowerShell’i yönetici olarak açın ve hesabın bu sunucu tarafından kullanılabilir olduğunu doğrulayıp yükleyin:

# Modülü yükle
Import-Module ActiveDirectory

# Hesabı sunucuya tanıt
Install-ADServiceAccount -Identity "sql_gMSA"

# Test et (True dönmelidir)
Test-ADServiceAccount -Identity "sql_gMSA"

İlk olarak modülü yüklerken aşağıdaki hata mesajıyla karşılaşırsak ilgili modülün yüklenmesi gerekmektedir. Çoğu windows sürümünde bu modül yüklüdür.

Aşağıdaki komut ile ilgili modül yüklemesi yapılmaktadır. Sunucuda PowerShell’i Yönetici (Run as Administrator) olarak aç ve şu komutu yapıştır:

Install-WindowsFeature RSAT-AD-PowerShell

Bu işlem Active Directory PowerShell modülünü yüklemektedir. İlgili yüklemeden sonra restart gerektirmez. Dönen sonuçta da restart gerektirmediği yazılmaktadır.

Yukarıdaki resimde PowerShell modülünü yüklendiğini görmekteyiz. Sunucuyu yeniden başlatmanıza gerek kalmaz. Yükleme bittikten sonra tekrar Import-Module ActiveDirectory komutunu tekrar deniyoruz. İlgili modülün başarılı bir şekilde yüklendiği görülmektedir.

Oluşturulan Group Managed Service Accounts hesabını mevcutta bulunan sunucularımızın üzerinde sunucuya tanıtma işlemi yapılmaktadır.

Install-ADServiceAccount -Identity "sql_gMSA"

S1 sunucusuna başarılı bir şekilde gMSA hesabı tanıtılır.

Yukarıdaki işlemlerden sonra test işlemi yapılmaktadır. True ifadesinin gelmesi işlemimizin başarılı olduğu sonucunu vermektedir.

Test-ADServiceAccount -Identity "sql_gMSA"

Aynı işlemler S2 sunucu içinde yapılmaktadır.

Yukarıda gMSA için tüm işlemlerimiz yaptıktan sonra şimdi sql server üzerinde sql_gMSA hesabımızı ekleyelim. Mevcutta bulunan sql server servis hesabımız:

Browse dedikten sonra başında NETBIOS adıyla birlikte oluşturduğumuz Group Managed Service Accounts‘ın yazılması gerekmektedir. İkinci dikkat edilmesi gereken ise aşağıdaki resimde Object Types.. kısmında Service Account or Group eklenmesi gerekmektedir.

Şifre kısmının boş bırakılması gerekmektedir. Yapı gereği kendisi almaktadır.

Apply dedikten sonra sql server üzerinde Restart işlemi istemektedir.

Log on sekmesine girildiğinde şifresinin active directory tarafından aktarıldığı görülmektedir.

Oluşturulan gMSA hesabının herhangi bir sorun yaşamaması için active directory tarafında ilgili OU altında delageted yapılması gerekmektedir. Yada mevcut oluşturulan hepsinin birbirlerinin üzerinde yetkili Security group’a üye edilmesi gerekmektedir.

Bu yapıya geçildikten sonra kontrol edilmesi gereken diğer işlem SPN kayıtlarıdır. Eski kullanıcılar üzerindeki SPN’leri silin ve gMSA için manuel atanması gerekmektedir.

gMSA yapılarında yukarıda girilen spn kayıtları gMSA için girilmesi gerekmektedir.

# SQL Server Availability Group için SPN-Listener Port
setspn -S MSSQLSvc/AG_Listener.yunusyucel.com:1453 YCL2026\sql_gMSA
setspn -S MSSQLSvc/AG_Listener.yunusyucel.com:INSTANCE_NAME YCL2026\sql_gMSA

# Sunucu ilgili port için SPN-Sql Servis Port
setspn -S MSSQLSvc/Server1.yunusyucel.com:1433 YCL2026\sql_gMSA
setspn -S MSSQLSvc/Server2.yunusyucel.com:1433 YCL2026\sql_gMSA

# Sql Server Instance için SPN
setspn -S MSSQLSvc/Server1.yunusyucel.com:INSTANCE_NAME YCL2026\sql_gMSA
setspn -S MSSQLSvc/Server2.yunusyucel.com:INSTANCE_NAME YCL2026\sql_gMSA

Sistem üzerinde veya sql server üzerinde önceden sql server servis hesabı yönetici olarak eklenmişse gmsa hesabınıda sql server sysadmin ve windows üzerinde local admin yetkisinin verilmesi gerekmektedir.

Always On Endpoint’leri için eski kullanıcıya verilen CONNECT yetkisini gMSA hesabına verin:

GRANT CONNECT ON ENDPOINT::Hadr_endpoint TO [YCL2026\sql_gMSA$];

Not: Always on yapılarında AG altında kaç sunucu varsa ilgili gMSA hesabının yetkilendirilmesi gerekmektedir.

Aşağıdaki komut ile hangi kullanıcı üzerinde hangi servis hesabının yetkili olduğunu görebiliriz.

SELECT 
    e.name AS EndpointName, 
    p.name AS GranteeName, 
    p.type_desc AS GranteeType, 
    perm.permission_name, 
    perm.state_desc
FROM sys.endpoints e
JOIN sys.server_permissions perm ON perm.major_id = e.endpoint_id
JOIN sys.server_principals p ON p.principal_id = perm.grantee_principal_id
WHERE e.type = 4; -- 4 = Database Mirroring / Always On Endpoint

Yetkilendirmeden önce sql_gMSA hesabının sql server üzerine login olarak eklenmesi gerekmektedir. Herhangi bir sorun ile karşılaşmamak için Server Roles kısmından sysadmin yetkisi veriyorum.

Kullanıcı oluşturulduktan sonra tekrardan aynı sorgu çalıştırıldığında başarılı sonucu almış oluruz.

Yukarıda komutla yapılan işlem SSMS arayüzünden de yapılmaktadır.

Tekrar yukarıdaki komut ile baktığımızda artık sql_gMSA hesabının hadr enpoint üzerinde yetkili olduğu görülmektedir.

Önceden yetkili sql server servis hesabını kaldırmak için ssms arayüzünden connect yetkisi elinden alınır.

İlgili işlemin scripti:

use [master]
GO
REVOKE CONNECT ON ENDPOINT::[Hadr_endpoint] TO [YCL2026\SqlUser] AS [S1\Administrator]
GO

İlgili sonucun güncellendiği görülmektedir.

Hadr_endpoint üzerinde farkı hesapların olmasının ne gibi sakıncaları vardır.

SQL Server Always On yapısında Hadr_endpoint, sunucular arasındaki “iletişim kapısıdır.” Eğer SQL Server servis hesabı (yeni oluşturduğumuz sql_gMSA$) bu kapı üzerinde yetkili olmazsa, sistemin tüm “Always On” işlemleri felç olur.

Availability Group (AG) içindeki veritabanları birbirine veri gönderemez. Birincil sunucuda (Primary) yaptığınız işlemler, İkincil sunucuya (Secondary) iletilemez. Veritabanı durumları “Not Synchronizing” veya “Disconnected” olarak görünür.

SQL Server Error Log kayıtlarında sürekli olarak şu tip hatalar döner:

Database Mirroring login attempt by user ‘YCL2026\sql_gMSA$’ failed with error: ‘Connection refused’.

Bu hata, S1 sunucusunun S2’ye bağlanmaya çalıştığını ama S2’nin “Seni tanımıyorum, bu kapıdan (endpoint) geçme yetkin yok” diyerek bağlantıyı reddettiğini gösterir.

Otomatik failover (Automatic Failover) mekanizması çalışmaz. Çünkü sunucular birbirlerinin “sağlık durumunu” (Health Check) bu endpoint üzerinden denetleyemez. Bir kriz anında sistem diğer node’a otomatik olarak geçiş yapamaz.

Her ne kadar Listener IP üzerinden bağlansanız da, arka planda node’lar arası trafik akmadığı için Listener üzerinden gelen talepler zaman aşımına (Time-out) uğrayabilir veya sadece Primary node üzerinden kısıtlı bir erişim alabilirsiniz.

Bu makalede aktif olan bir sql server sistemi üzerinde tek kullanıcı hesabından Group Managed Service Accounts (gMSA) hesabına nasıl dönüşüm yapılır konusunu görmüş olduk. Başka makalede görüşmek dileğiyle..

“Şüphesiz, Rabbin sana verecek ve sen de hoşnut olacaksın.”. Duha Süresi-5 Ayet

Author: Yunus YÜCEL

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir