drupal apache kerberos

Bu blog yazımızda Drupal 8 ile Kerberosun entegrasyonunu anlatacağım.

 

Biz Ne Istiyoruz?

  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 eiş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 kurulumu ve ayarları 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 kimliklerin 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 müşteri-sunucu modelini hedef aldı ve karşılıklı kimlik doğrulama 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 gerektirir, ve isteğe bağlı olarak, belirli kimlik doğrulama aşamalarında ortak anahtar şifrelemesi kullanabilir.[1] Kerberos, varsayılan olarak 88 numaralı UDP bağlantı noktasını kullanır.

Bu sebeplerden dolayı Kerberos, Apache kimlik doğrulaması için uygum 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 birine uyumlu olmalıdır. Bizim durumuzda bu sistemler kullanıcıları barındıran Windows Sunucusu yani LDAP sunusu ve Apache serverin bağrındıran Ubuntu sunsucusunun 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 websitenizin geçerli domain ismine sahip olması gerekir, Kerberos doğrulanması İP 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 servisiniz 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:

1. Varsayılan Kerberos sürüm 5 realm. DRUPAL.LOCAL kullanın (büyük harflerle).
2 .KDC.Active Directory sunucum drupal.drupart.local, kendi sunucunuza göre değiştirin.
3. 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]
    ZIRAATKATILIM.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 hakan@DRUPART.LOCAL

Sizden şifre istenir.

  1. KDC'den aldığımız ilk bileti görmek için terminalde klist yazınız.
$ klist
Default principal: hakan@DRUPART.LOCAL

Valid starting    Expires           Service principal
25/02/2019 13:12  26/02/2019 23:11  krbtgt/apache.drupart.local@DRUPART.LOCAL
        renew until 25/02/2019 13:12
  1. hakan kullanıcısını HTTP/apache.drupart.local@DRUPART.LOCAL princıpal ile aşağıdaki komut ile eşleştirelim:
C:\>ktpass
-prince HTTP/apache.drupart.local@DRUPART.LOCAL
-mapuser hakan@DRUPART.LOCAL
-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/apache.drupart.local@DRUPART.LOCAL
HTTP/apache.drupart.local@DRUPART.LOCAL: kvno = 4

$ klist -e
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: HTTP/apache.drupart.local@DRUPART.LOCAL

Valid starting    Expires           Service principal
25/02/2019 14:53  25/02/2019 00:52  krbtgt/apache.drupart.local@DRUPART.LOCAL
        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/intranet.example.com@EXAMPLE.COM
        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/apache.drupart.local@DRUPART.LOCAL (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/apache.drupart.local@DRUPART.LOCAL
$ klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: HTTP/iapache.drupart.local@DRUPART.LOCAL

Valid starting    Expires           Service principal
25/02/2019 14:11 25/02/2019 00:10  krbtgt/apache.drupart.local@DRUPART.LOCAL
        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 and LDAP SSO modülleriniz ayarlarını sağllanmışsa kullanıcı adı ve şifre sormadan kimliğiniz doğrular.

Drupal LDAP and LDAP SSO Ayarları

Bu blog Kerberos kimlik doğrulaması ile ilgili olduğu için, Drupal LDAP modül ayarları hakkında yazmayacağım ancak internette nasıl ayarlandığına dair makaleler bulabilirsiniz. Diğer tarafta, LDAP SSO ayarları basittir. Bundan sonra Drupal LDAP modülünün uygun şekilde ayarlangığı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.