Aby to fungovalo, potřebujeme následující moduly a systémy:
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.
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 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.
Nastavíme Kerberos pro Apache pomocí Ubuntu.
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
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
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
kinit [email protected]
Budete požádáni o zadání hesla.
$ 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
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)
$ 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>
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.
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.
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:
Automaticky se přihlašuje při otevření Drupalu.
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.