Přejít k hlavnímu obsahu

Drupal 8 Kerberos Integraci

V tomto blogovém příspěvku vysvětlím integraci Kerberosu s Drupal 8.
Burcu Binici
Burcu Binici
10 min. read
drupal-8-kerberos-entegrasyonu

Co chceme?

  1. Uživatel v Active Directory (LDAP), heslo a přístup k serveru Apache.
  2. Autentizační služby Drupalu 8 (v našem případě poskytované modulem LDAP SSO) k získání ověřeného uživatele a informací o uživateli, jejichž uživatelské jméno je odesíláno do PHP jako $ _SERVER ['REMOTE_USER'], členství ve skupině bez ověřování hesla a přístup k webu Drupal 8 s přístupem Kerberos skrze Apache bez žádosti o uživatelské jméno a heslo.

Aby to fungovalo, potřebujeme následující moduly a systémy:

  • LDAP module
  • LDAP SSO module
  • Kerberos ověřování pro Apache

Modul LDAP bude použit k registraci uživatelů na našem webu s uživatelem z LDAP a modul LDAP SSO bude použit k autentizaci s Apache přes Kerberos.
 

O Kerberos

Kerberos je síťový autentizační systém, který spoléhá na důvěryhodnou třetí stranu. Ostatními dvěma stranami jsou uživatel a služba, ke které se uživatel chce připojit. Ne všechny služby a aplikace mohou používat Kerberos, ale pro ty, které mohou, Kerberos poskytuje přístup k síti (single sign-on).

V této části zřídíme a nakonfigurujeme server Kerberos a některá uživatelská nastavení.

Souhrn

Pokud jste noví v oblasti Kerberos, existují některá slova, která je třeba pochopit. Mnoho z těchto slov vám může být známo z jiných prostředí.

Hlavní subjekt (Principal): Všichni uživatelé, počítače a služby poskytované servery musí být identifikovány jako hlavní subjekty Kerberosu.

Instance: Používá se pro správce služeb a ty, kteří mají zvláštní administrativní roli.

Realm: Jedinečná sféra kontroly poskytovaná instalací Kerberosu. Představte si to jako doménu nebo skupinu, ke které patří vaše hosty a uživatelé. Výchozím nastavením je použití velkých písmen DNS domény (EXAMPLE.COM) jako realmu.

Centrum distribuce klíčů (Key Distribution Center - KDC): Skládá se ze tří částí - databáze všech hlavních subjektů, autentizačního serveru a serveru vydávajícího lístky. Každý region musí mít alespoň jedno KDC.

Lístek udělení lístku (Ticket Granting Ticket - TGT): Určen autentizačním serverem (AS), lístek udělení lístku (TGT) je zašifrován heslem uživatele známým pouze KDC.

Server udělení lístku (Ticket Granting Server - TGS): Na žádost vydává uživatelům služební lístky.

Lístky: Autentizuje dvě hlavní subjekty. Jedním z nich je hlavní subjekt, druhým je služba požadovaná uživatelem. Lístky generují šifrovací klíč používaný pro zabezpečenou komunikaci během autentizované relace.

Soubory Keytab: Soubory Keytab jsou extrahovány z hlavní databáze KDC a obsahují šifrovací klíč pro službu nebo hostitele.

Shrnutí: Realm má alespoň jedno KDC obsahující databázi Hlavních subjektů na vyžádání. Když se uživatel připojí k serveru s přístupem Kerberos, KDC vydá lístek udělení lístku (TGT). Pokud se údaje poskytnuté uživatelem shodují, jsou autentizovány a Server udělení lístku (TGS) žádá o lístky od serveru pro službu nakonfigurovanou pro Kerberos. Služby lístků autentizují uživatele bez nutnosti znovu ověřovat uživatelské jméno a heslo.

Kerberos ověřování pro Apache

Kerberos je síťový autentizační protokol fungující na základě lístků, které umožňují uzlům komunikujícím přes nezabezpečenou síť důvěrně prokázat svou identitu. Protokol byl pojmenován po postavě Kerberos (nebo Cerberus) z řecké mytologie, zuřivém tříhlavém strážném psovi podsvětí Hádésa.

Jeho designéři se především zaměřovali na model uživatel-server a poskytují vzájemnou autentizaci, přičemž se uživatel a server vzájemně ověřují. Zprávy protokolu Kerberos jsou chráněny proti odposlechu a útokům opakování. 

Kerberos je založen na šifrování s symetrickým klíčem a vyžaduje důvěryhodnou třetí stranu. Volitelně může v určitých fázích autentizace využívat šifrování s veřejným klíčem. Kerberos používá výchozí UDP port 88. 

Z těchto důvodů je Kerberos životaschopnou možností pro autentizaci Apache.

Nastavení 

Nastavíme Kerberos pro Apache pomocí Ubuntu.

Předpoklady

 Systémové hodiny serverů a uživatelských služeb připojených ke Kerberos realm musí být kompatibilní mezi sebou. V našem případě musí být synchronizovány systémové hodiny Windows serveru, na kterém jsou hostováni uživatelé (tj. LDAP server), a serveru Ubuntu, na kterém je hostován Apache server (pro správnou funkci Kerberose by měl být rozdíl maximálně 5 minut). Také vaše webová stránka musí mít platné doménové jméno; Kerberosové ověřování nefunguje s IP adresami. Pokud používáte localhost, můžete definovat doménové jméno ve svém souboru /etc/hosts. Například: 127.0.0.1 apache.drupart.local

Synchronizace hodin 

Pro synchronizaci systémového času serveru Ubuntu s časem systému serveru LDAP můžete použít NTP, který běží z příkazové řádky. Pro instalaci NTP spusťte následující příkaz:

sudo apt-get install ntp

Restartujte službu NTP: 

sudo service ntp restart

Synchronizujte systémový čas serveru následujícím příkazem. 

sudo ntpdate -s drupal.drupart.local

Kerberos Settings

Nainstalujte libapache2-mod-auth-kerb a krb5-user pomocí následujícího příkazu:

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

Budeme používat libapache2-mod-auth-kerb k propojení Apache s Kerberosem. krb5-user není skutečně nezbytný, ale poskytuje užitečné nástroje pro práci s Kerberosem.

Kromě příkazu libapache2-mod-auth-kerb krb5-config nainstaluje závislý balíček a poté zobrazí konfigurační průvodce, který vám položí následující otázky:

Výchozí realm pro Kerberos verze 5. Použijte DRUPAL.LOCAL (velkými písmeny). KDC. Můj server Active Directory je drupal.drupart.local, změňte ho na svůj vlastní server. Správcovský server. To je obvykle stejné jako server LDAP/Active Directory nebo v případě více řadičů domény by mělo být obvykle nastaveno na hostitele.

[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. Pro zajištění, že Kerberos funguje, spusťte ping na váš Windows server.  Například: ping drupal.drupart.local. 
  2. Musí existovat uživatel ve Windows doméně DRUPART.LOCAL. V tomto příkladu je jako uživatelské jméno použito "hakan". 
  3. Na příkazové řádce:
kinit [email protected]

Budete požádáni o zadání hesla. 

  1. Napište do terminálu příkaz klist, abyste viděli první lístek, který jsme obdrželi od KDC.
$ 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. Zamapujme uživatele Hakan na principál HTTP/[email protected] následujícím příkazem:
C:\>ktpass
-prince HTTP/[email protected]
-mapuser [email protected]
-crypto RC4-HMAC-NT
-ptype KRB5_NT_PRINCIPAL
-pass 1234567
-out C:\intranetkeytab

Tento příkaz vytvoří soubor intranetkeytab v C: \. Zkopírujte tento soubor a umístěte ho do složky /etc/apache2/ jako http_intranet.keytab na serveru Apache. Ujistěte se, že je vše správně nakonfigurováno následujícími příkazy:

$ 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. Při pokusu o použití služby k autentizaci jako principála zkontrolujte, zda je klíč správně přidán do klíčové tabulky. Poté zobrazte poskytnutý lístek (ticket):
$ 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 musí být informován, které části kterých webových stránek mají používat autentizaci poskytovanou mod_auth_kerb. To se provádí pomocí direktivy AuthType s hodnotou Kerberos.

Aby bylo možné určit, které části mají využívat Kerberosové ověřování, přidejte následující úryvek do konfigurace virtuálního hosta:

<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. Posledním krokem je znovu načíst nastavení Apacha:
sudo service apache2 force-reload

Pokud navštívíte apache.drupal.local/user/login/sso a máte nakonfigurovány moduly LDAP a LDAP SSO, budete autentizováni bez nutnosti zadávat uživatelské jméno a heslo. 

Nastavení Drupal LDAP a LDAP SSO

 Protože tento blog se zabývá Kerberosovým ověřováním, návody k nastavení modulu Drupal LDAP lze najít online. Na druhou stranu, nastavení LDAP SSO je jednoduché. Od tohoto okamžiku budu předpokládat, že je modul Drupal LDAP správně nastaven a funguje. 

  1. Nainstalujte modul LDAP SSO pomocí composeru:
composer require 'drupal/ldap_sso:^1.0'

Po instalaci modulu LDAP SSO přejděte na /admin/config/people/ldap/sso a zkontrolujte následující hodnoty:

  1. Zapněte automatické jednotné přihlášení (Single Sign-On).

Automaticky se přihlašuje při otevření Drupalu. 

  1. Rozdělte uživatelské jméno a realm

Pokud se vaši uživatelé zobrazují jako user@realm, je nutné toto povolit. To je výchozí nastavení pro mod_auth_kerb, ale ne pro mod_auth_sspi.

Také hodnota pro serverovou proměnnou obsahující uživatele musí být 'REMOTE_USER'. Poté zrušte zaškrtnutí možnosti 'Přesměrovat uživatele při odhlášení', protože se budeme snažit automaticky přihlásit při odhlášení. 

Pokud je vše v pořádku, při přihlášení do našeho webu Drupalu budeme automaticky přihlášeni bez nutnosti zadávat jakékoliv uživatelské jméno/heslo.

Naše Kanceláře

Drupart Locations

Naše oddělení

London

151 West Green Road, London, England

442038156478

[email protected]

Drupart R&D

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

+90 262 678 8872

[email protected]

Newark

112 Capitol Trail Suite, A437 Newark DE, 19711

+17406666255

[email protected]

Wiesbaden

Hinterbergstraße 27
65207 Wiesbaden
Deutschland

+49 (0) 6151 – 492 70 23

[email protected]