Ana içeriğe atla

Drupal 8 Kerberos Entegrasyonu

Bu blog yazımızda Drupal 8 ile Kerberosun entegrasyonunu anlatacağım.
Taşkın Maksim
Taşkın Maksim
10 dakika okuma süresi
drupal-8-kerberos-entegrasyonu

Biz Ne İstiyoruz?

  1. Active Directory (LDAP) kullanıcı, şifresiyle Apache sunucusuyla erişimin sağlanması.
  2. Kullanıcı adı PHP'ye $ _SERVER ['REMOTE_USER'] olarak gönderilen kimliği doğrulanmış kullanıcıyı ve kullanıcı bilgilerini almak için Drupal 8 kimlik doğrulama hizmetleri (bizim durumumuzda LDAP SSO modülü tarafından sağlanan) ile şifreyi kontrol etmeden grup üyeliği ve Drupal 8 sitesine kullanıcı ve şifresi sorulmadan Apache tarafından Kerberos ile yapılan erişimle erişilmesi

Bunun çalışması için aşağıdaki modüllere ve sistemlere ihtiyacımız var:

  • LDAP module
  • LDAP SSO module
  • Apache için Kerberos Kimlik Doğrulama

LDAP kullanıcısı ile web sitemizdeki kullanıcıları kaydetmek için LDAP modülü kullanılacak ve LDAP SSO modülü, Kerberos üzerinden Apache ile kimlik doğrulama için kullanılacaktır.

Kerberos Hakkında

Kerberos, güvenilir bir üçüncü tarafa dayanan bir ağ kimlik doğrulama sistemidir. Diğer iki taraflar ise kullanıcı ve kullanıcının bağlanmak istediği servis. Her servis ve her uygulama Kerberos kullanamaz ama kullanabilen servisler ve uygumalar için Kerberos ağ için tek merkezli (Single Sign On) erişim sağlar.

Bu bölümde Kerberos sunucusunun kurulumunu, ayarlarını ve bazı kullanıcı ayarlarını belirleyeceğiz.

Özet

Eğer Kerberos'a yeni iseniz bazı anlamanız gereken kelimeler var. Bu kelimelerin çoğu başka ortamlardan tanıdık gelebilir.

Principal: Sunucular tarafından sağlanan tüm kullanıcıların, bilgisayarların ve hizmetlerin Kerberos Principals olarak tanımlanması gerekir.

Instances: Hizmet müdürleri ve özel idari admin rolu olanlar için kullanılır.

Realms: Kerberos kurulumu tarafından sağlanan eşsiz kontrol alanı. Ana bilgisayarlarınızın ve kullanıcılarınızın ait olduğu etki alanı veya grup olarak düşünün. Kerberos kurallarına göre realm isimleri büyük harfli olması gerekir.Varsayılan olarak, ubuntu, büyük harfe dönüştürülen DNS alanını (EXAMPLE.COM) bölge olarak kullanacaktır.

Key Distribution Center: (KDC) üç bölümden oluşur, tüm principallerin bir veritabanı, kimlik doğrulama sunucusu ve bilet veren sunucu. Her bölge için en az bir KDC olmalıdır.

Ticket Granting Ticket: Kimlik Doğrulama Sunucusu (AS) tarafından belirlenir, Bilet Verme Bileti (TGT) yalnızca KDC tarafından bilinen kullanıcının şifresiyle şifrelenir.

Ticket Granting Server: (TGS) talep üzerine kullanıcılara servis bileti verir.

Tickets: İki princiapallerin kimliklerini doğrular. Biri principal, diğeri kullanıcı tarafından talep edilen bir servis. Biletler, kimliği doğrulanmış oturum sırasında güvenli iletişim için kullanılan bir şifreleme anahtarı oluşturur.

Keytab Files: Keytab, KDC ana veri tabanından çıkartılan dosyalardır ve bir servis veya host için şifreleme anahtarını içerir.

Özet olarak Realm'de ihtiyaç üzerine en az bir tane Principallerin veritabanını içeren KDC olur. Principal kullanıcı Kerberos erişimli sunucuya bağlanığında KDC, Ticket Granting Ticket (TGT) verir. Kullanıcı tarafından verilen kimlik bilgileri uyuşuyorsa, kimliği doğrulanır ve Kerberos ayarlı servis için Ticket Granting Server (TGS) sunucudan ticketleri ister. Ticket servisleri kullanıcı bir daha kullanıcı adı ve şifresini doğrulamasını istemeden kimliğini doğrular.

Apache için Kerberos Kimlik Doğrulama

Kerberos, güvenli olmayan bir ağ üzerinden iletişim kuran düğümlerin kimliklerini güvenli bir şekilde birbirlerine kanıtlamalarına izin vermek için biletler temelinde çalışan bir bilgisayar ağı kimlik doğrulama protokolüdür. Protokol, Hades'in vahşi üç başlı bekçi köpeği olan Yunan mitolojisinden Kerberos (veya Cerberus) karakterinden sonra seçildi.

Tasarımcıları öncelikle kullanıcı-sunucu modelini hedef aldı ve karşılıklı kimlik doğrulamasını sağlar, hem kullanıcı hem de sunucu birbirinin kimliğini doğrular. Kerberos protokol mesajları, gizli dinleme ve tekrarlama saldırılarına karşı korunur.

Kerberos simetrik anahtar şifrelemesine dayanıyor ve güvenilir bir üçüncü taraf gerektiriyor. İsteğe bağlı olarak, belirli kimlik doğrulama aşamalarında ortak anahtar şifrelemesi kullanabilir. Kerberos, varsayılan olarak 88 numaralı UDP bağlantı noktasını kullanır.

Bu sebeplerden dolayı Kerberos, Apache kimlik doğrulaması için uygun bir seçenektir.

Ayarlar

Apache için Kerberos ayarlarını Ubuntu üzerinden yapacağız.

Ön şartlar

Kerberos realm'e bağlı sunucular ve kullanıcı servislerin sistem saati bir birbine uyumlu olmalıdır. Bizim durumumuzda bu sistemler kullanıcıları barındıran Windows Sunucusu yani LDAP sunusu ve Apache serveri barındıran Ubuntu sunucusunun sistem saatleri senkronize olmalıdır (Kerberosun doğru çalışması için en fazla 5 dakikalık fark olmalıdır). Ayrıca sizin web sitenizin geçerli domain ismine sahip olması gerekir, Kerberos doğrulanması IP adresleriyle çalışmaz. Localhost'ta iseniz /etc/hosts dosyanıza domain ismini tanımlayabilirsiniz. Örneğin: 127.0.0.1 apache.drupart.local

Saat Senkronizasyonu

Ubuntu sunucusunun sistem saatinin LDAP sunucusunun sistem saatiyle senkronize etmek için komut satırında çalışan NTP'yi kullanabilisiniz. NTP'yi kurmak için aşağıdaki komutu çalıştırınız:

sudo apt-get install ntp

NTP servisini restart ediniz:

sudo service ntp restart

Sunucusun sistem saatini aşağıdaki komut ile senkronize ediniz

sudo ntpdate -s drupal.drupart.local

Kerberos Ayarları

Aşağıdaki komutu kullanarak libapache2-mod-auth-curb ve krb5-user kurun:

sudo apt-get install libapache2-mod-auth-kerb krb5-user

libapache2-mod-auth-kerb Apache'yi Kerberos ile bağlantısı için kullanacağız. krb5-user gerçek bir gereksinim değildir, ancak Kerberos için kullanışlı komut satırı araçları sağlar.

Libapache2-mod-auth-curb komutuna ek olarak, krb5-config bağımlılık paketini yükler ve sonra şunu isteyen bir yapılandırma sihirbazı gösterir:

Varsayılan Kerberos sürüm 5 realm. DRUPAL.LOCAL kullanın (büyük harflerle).
KDC.Active Directory sunucum drupal.drupart.local, kendi sunucunuza göre değiştirin.
Yönetim sunucusu. Bu, genellikle LDAP / Active Directory sunucusuyla aynıdır veya birden fazla etki alanı denetleyicisi olması durumunda, normal olarak ana makineye ayarlanmalıdır.

Bu paketleri kurduktan sonra /etc/krb5.conf dosyasının içeriğini ihtiyaçlarınıza göre değiştirin. Bu dosyada Apache için Kerberos bölgesini tanımlarız..

[libdefaults]
   default_realm = DRUPART.LOCAL # Active Directory Domain
# The following krb5.conf variables are only for MIT Kerberos.
   kdc_timesync = 1
   ccache_type = 4
   forwardable = true
   proxiable = true
# The following encryption type specification will be used by MIT Kerberos
# if uncommented.  In general, the defaults in the MIT Kerberos code are
# correct and overriding these specifications only serves to disable new
# encryption types as they are added, creating interoperability problems.
#
# The only time when you might need to uncomment these lines and change
# the enctypes is if you have local software that will break on ticket
# caches containing ticket encryption types it doesn't know about (such as
# old versions of Sun Java).
#   default_tgs_enctypes = des3-hmac-sha1
#   default_tkt_enctypes = des3-hmac-sha1
#   permitted_enctypes = des3-hmac-sha1
# The following libdefaults parameters are only for Heimdal Kerberos.
   fcc-mit-ticketflags = true
[realms]
   DRUPART.LOCAL = {
       kdc = drupal.drupart.local # Active Directory domain controller.
       admin_server = drupal.drupart.local
   }
[domain_realm]
   .drupart.local = DRUPART.LOCAL
   drupart.local = DRUPART.LOCAL
  1. Kerberos'un çalıştığından emin olmak için Windows sunucunuza ping atın. Örneğin; ping drupal.drupart.local.
  2. Windows Domain DRUPART.LOCAL’da bir kullanıcı olmalıdır. Bu örnekte hakan kullanıcı adı olarak kullanılmıştır.
  3. Komut satırında:
kinit [email protected]

Sizden şifre istenir.

  1. KDC'den aldığımız ilk bileti görmek için terminalde klist yazınız.
$ klist
Default principal: [email protected]
Valid starting    Expires           Service principal
25/02/2019 13:12  26/02/2019 23:11  krbtgt/[email protected]
       renew until 25/02/2019 13:12
  1. Hakan kullanıcısını HTTP/[email protected] princıpal ile aşağıdaki komut ile eşleştirelim:
C:\>ktpass
-prince HTTP/[email protected]
-mapuser [email protected]
-crypto RC4-HMAC-NT
-ptype KRB5_NT_PRINCIPAL
-pass 1234567
-out C:\intranetkeytab

Bu komut C: \ 'de intranetkeytab dosyası oluşturur. Bu dosyayı kopyalayın ve Apache sunucusunda http_intranet.keytab olarak /etc/apache2/ klasörüne koyunuz. Her şeyin aşağıdaki komutlarla doğru bir şekilde yapılandırıldığından emin olun:

$ kvno HTTP/[email protected]
HTTP/[email protected]: kvno = 4
$ klist -e
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: HTTP/[email protected]
Valid starting    Expires           Service principal
25/02/2019 14:53  25/02/2019 00:52  krbtgt/[email protected]
       renew until 26/02/2019 14:53, Etype (skey, tkt): aes256-cts-hmac-sha1-96, ...
25/02/20194 15:09  25/02/2019 00:52  HTTP/[email protected]
       renew until 26/02/2019 14:53, Etype (skey, tkt): arcfour-hmac, arcfour-hmac
$ klist -e -k -t /etc/apache2/http_intranet.keytab
Keytab name: FILE:http_intranet.keytab
KVNO Timestamp        Principal
---- ---------------- ---------------------------------------------------------
  4 01/01/1970 01:00 HTTP/[email protected] (aes256-cts-hmac-sha1-96)
  1. Servis principal olarak kimlik doğrulamak için kullanmaya çalışarak, anahtarın anahtar sekmesine doğru şekilde eklendiğini kontrol edin, daha sonra verilen ticketi görüntüleyin:
$ kinit -k -t /etc/apache2/http_intranet.keytab HTTP/[email protected]
$ klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: HTTP/[email protected]
Valid starting    Expires           Service principal
25/02/2019 14:11 25/02/2019 00:10  krbtgt/[email protected]
       renew until 26/02/2019 14:11
Configure Apache for Kerberos Authentication

Apache must be told which parts of which web sites are to use authentication provided by mod_auth_kerb. This is done using the AuthType directive with a value of Kerberos.

In order to specify which Kerberos authentication add following snippet to your virtual host configuration:

<VirtualHost *:80>
   ServerAdmin webmaster@localhost
   DocumentRoot /var/www/html/web
   ServerName apache.drupart.local
   <Location /user/login/sso> # /user/login/sso is required for Drupal LDAP SSO module
       AuthType Kerberos
       AuthName "Kerberos authenticated intranet"
       KrbAuthRealms DRUPART.LOCAL
       Krb5Keytab /etc/apache2/http_intranet.keytab
       KrbServiceName Any
       KrbMethodNegotiate on
   KrbMethodK5Passwd on        
   KrbSaveCredentials on
       KrbVerifyKDC on
       Require valid-user
   </Location>
   ErrorLog ${APACHE_LOG_DIR}/error.log
   CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
  1. Son adım apache ayarlarını yeniden yüklemektir:
sudo service apache2 force-reload

apache.drupal.local/user/login/sso sayfasını ziyaret ettiğinizde eğer LDAP ve LDAP SSO modülleriniz ayarlarını sağlanmışsa kullanıcı adı ve şifre sormadan kimliğiniz doğrulanır.

Drupal LDAP ve LDAP SSO Ayarları

Bu blog Kerberos kimlik doğrulaması ile ilgili olduğu için, Drupal LDAP modül ayarlarına dair makalelere internetten ulaşabilirsiniz. Diğer tarafta, LDAP SSO ayarları basittir. Bundan sonra Drupal LDAP modülünün uygun şekilde ayarlandığını ve çalıştığını varsayacağım.

  1. LDAP SSO modülünü composer ile kurun:
composer require 'drupal/ldap_sso:^1.0'

LDAP SSO modülünü kurduktan sonra /admin/config/people/ldap/sso sayfasına gidin ve aşağıdaki değerleri kontrol edin:

  1. Turn on automated single sign-on (Otomatik tek oturum açmayı aç)

Drupal açıldığında otomatik olarak oturum açar.

  1. Split user name and realm

Kullanıcılarınız user@realm olarak gösteriliyorsa, bunu etkinleştirmeniz gerekir. Bu mod_auth_kerb için varsayılandır ancak mod_auth_sspi değil.

Ayrıca, kullanıcıyı içeren Sunucu değişkeni (Server variable containing the user) için değer 'REMOTE_USER' olmalıdır. Ardından, oturumu kapattığımızda otomatik olarak giriş yapmayı deneyeceğiniz gibi 'Çıkışta kullanıcıları yönlendir' (Redirect users on logout) seçeneğinin işaretini kaldırın.

Her şey yolundaysa, Drupal web sitemize giriş yaptığımızda herhangi bir kullanıcı / şifre sormadan otomatik olarak oturum açacağız.

Ofislerimiz

Drupart Locations

Ofislerimiz

Drupart AR-GE

GOSB Teknopark Hi-Tech Bina 3.Kat B3 Gebze - KOCAELİ

+90 262 678 8872

+90 216 706 12 58 

[email protected]

Londra

151 West Green Road, London, England

+44 203 815 6478

[email protected]

Newark

112 Capitol Trail Suite, A437 Newark DE, 19711

+1 (740) 666 6255

[email protected]

Wiesbaden

Hinterbergstraße 27
65207 Wiesbaden
Deutschland

+49 (0) 6151 – 492 70 23

[email protected]