Linux’te Windows Tarzı SSO — Domain’e Katılmaya Gerek Yok
Domain’e katılmak makineye bir bilgisayar hesabı kazandırır. Meğer bir kullanıcı bileti buna hiç ihtiyaç duymuyormuş.
Domain’e katılmış Windows makinen iç web uygulamalarına sessizce giriş yapar. Kerberos bileti, SPNEGO el sıkışması, bitti — hiçbir zaman bir giriş formu görmezsin. Soru şuydu: AD’nin hiç duymadığı bir Linux makinesi aynı numarayı yapabilir mi?
Yapabiliyor. Domain’e katılmak makine hesapları içindir. Bir kullanıcı biletinin ihtiyacı olan üç şey: bir Kerberos istemcisi, beş satır yapılandırma ve şifren. İşte tüm yolculuk — yüzüstü düştüğüm iki yer dahil.
Kurulum
sudo apt install krb5-user
Sonra /etc/krb5.conf:
[libdefaults]
default_realm = EXAMPLE.COM
dns_lookup_kdc = true
dns_lookup_realm = true
rdns = falseBu kadar. Hiçbir KDC adresi sabit kodlanmadı — AD, domain denetleyicilerini DNS’te yayınlar ve istemci onları kendi başına bulur:
dig +short SRV _kerberos._tcp.example.com # 0 100 88 dc01.example.com. # 0 100 88 dc02.example.com.
(Yalnızca dahili DNS. Genel çözümleyiciler hiçbir şey bilmez. VPN’deyken, Kerberos’u suçlamadan önce resolvectl status’a bak.)
Bonus AD gerçeği: her DC aynı anda hem KDC, hem parola sunucusu, hem de admin/LDAP uç noktasıdır. MIT-Kerberos’un kdc ile admin_server arasında yaptığı ayrım mı? Ortadan kalkıyor. Her DC her şeyi yapar.
Bir bilet almak — ve yüzüstü düşüş #1
İlk deneme:
kinit myuser@example.com
Sonuç: boş bir satır. Ne istem, ne hata, hiçbir şey. Bana bakan bir imleç, o kadar. Enter’a basmak başka bir boş satır üretti. Harika yazılım.
Sorun: @’dan sonraki her şey bir Kerberos realm’idir, ve realm’ler BÜYÜK HARFLE yazılır. example.com domain gibi görünüyor — hatta e-postam gibi bile — ama Kerberos için bu bilinmeyen bir realm, ve bunu söylemek yerine sadece… somurttu.
Çözüm neredeyse hakaret derecesinde basit:
kinit myuser Password:
Realm’i tamamen atla, krb5.conf’taki default_realm devreye girsin. Aniden gerçek, görünür bir Password: istemi belirir — doğru realm’le konuştuğunu böyle anlarsın. Şifreyi yaz (girdi gizli, sudo tarzı), Enter’a bas, ve:
klist # Default principal: myuser@EXAMPLE.COM # krbtgt/EXAMPLE.COM@EXAMPLE.COM valid ~10h
Bir krbtgt girdisi, bir TGT’ye sahip olduğun anlamına gelir. Artık, kriptografik olarak konuşursak, domain’e giriş yapmış durumdasın.
kinit tekrar yaramazlık ederse, işte tam olarak ne yaptığını gösteren şey — DNS aramaları, hangi DC’ye bağlandığı, nerede öldüğü:
KRB5_TRACE=/dev/stdout kinit myuser
Yüzüstü düşüş #2: “Unable to locate package nc”
88 portunun erişilebilir olup olmadığını kontrol etmek istedim. apt install nc — böyle bir paket yok. Debian/Ubuntu’da adı netcat-openbsd. Ya da kurulumu tamamen atla, bash’in ağ desteği zaten dahili:
timeout 3 bash -c 'cat < /dev/null > /dev/tcp/dc01.example.com/88' && echo OPEN || echo CLOSED
Tarayıcıya öğretmek
Windows tarayıcıları otomatik olarak müzakere eder çünkü intranet bölgesine güvenirler. Linux tarayıcıları, aksi söylenmedikçe kimseye güvenmez:
Firefox — about:config → network.negotiate-auth.trusted-uris → .example.com
Chrome/Chromium — /etc/opt/chrome/policies/managed/kerberos.json:
{ "AuthServerAllowlist": "*.example.com" }curl — çünkü tabii ki curl da yapabilir:
curl --negotiate -u : https://internal-app.example.com/
Dahili bir siteyi aç. Seni içeri alıyor. Sessizce. Domain’de olmayan bir makinede.
Son derece tatmin edici.
Küçük puntolar
- Saatler: Kerberos ~5 dakikalık sapmaya izin verir. NTP’yi çalışır tut, yoksa hiçbir şey işlemez ve hatalar sana nedenini söylemez.
- FQDN kullan: sunucu adı, servisin SPN’siyle eşleşmeli. IP’ler ve rastgele takma adlar NTLM’e düşer ya da başarısız olur.
- Biletler süresi dolar (~10sa). Her gün yeniden kinit yap, ya da
k5start, bir keytab, ya da sssd + KCM ile otomatikleştir.
BÜYÜK HARFLİ bir realm içeren krb5.conf → kinit myuser → tarayıcı izin listesi. Üç adım, sıfır domain katılımı, ve Windows’un arkandan bütün bu süre boyunca yaptığı aynı sessiz bilet dansı.
Ve eğer kinit sana Password: yerine boş bir satırla merhaba derse — realm’ini kontrol et. Ya BÜYÜK HARF ya da hiç.