Hlavní navigace

Centrální autorizace služeb

17. 3. 2003
Doba čtení: 9 minut

Sdílet

Pokud vám na vašem serveru vadí několik oddělených databází hesel a chcete tomuto předejít, přečtěte si tento článek. Podíváme se na varianty, které se nabízejí: plain text, encrypted passwords a synchronizace s PAM a encrypted passwords s autentifikací PAM oproti sambě.

Pro naše účely jsme potřebovali zprovoznit tyto služby: přihlášení do systému (ať konzole či přes ssh), samba a apache.

Problémy

Při výběru řešení narazíme na několik problémů

  • SUID – V dnešních systémech jsou hesla v systému uložena v souboru /etc/shadow. Aby mohl program provádět autentifikaci oproti tomuto souboru (i přes PAM – je to pouze knihovna a program musí být SUID), musí mít právo jej číst. Což ovšem není povoleno všem uživatelům, ale pouze uživateli root a členům skupiny shadow. Zde narážíme na problém u webové autentifikace. Není vhodné, aby uživatel, pod kterým pracuje webový server, měl právo ke čtení tohoto souboru, protože pak by bylo možné číst jej i z PHP skriptů (běží pod uživatelem webového serveru). Tomu by se dalo zabránit použitím safe-mode (dovolí číst jen soubory, které mají stejného vlastníka jako běžící skript). Stejný problém ovšem hrozí i u CGI skriptů a Perl modulů, které však již safe-mode nemají.
    Abychom tento problém obešli, musíme použít externí program, který toto právo má a se kterým budeme komunikovat po síti. Takovým programem může být např. samba nebo kerberos.
  • Nekompatibilita šifer – V /etc/shadow je obvykle používána šifra MD5. Pro sambu je používána DES šifra. Při této tzv. encrypted komunikaci s klientem je předávána jen část tohoto klíče. Tato komunikace je nyní výchozí (od Windows 98 a NT 4.0 SP3). Pro povolení nešifrované komunikace (a umožnění autentifikace oproti /etc/shadow) je nutné do všech přistupujících stanic nahrát klíč do registrů, který tuto možnost zapne (je součástí samby). Výhodou šifrované komunikace je, že po síti není posláno skutečné heslo, a proto i když pošlete heslo nesprávnému serveru, nemůže tuto znalost nijak zneužít. Nevýhodou tohoto systému naopak je, že pokud útočník získá zašifrované heslo (např. přečtením ze souboru /etc/samba/smbpas­swd), může jej použít k autentifikaci, jako by znal heslo přímo.

Jednotlivé varianty

Plain text

Jednou z možností, jak bylo výše uvedeno, je vypnout v sambě encrypted passwords a provádět autentifikaci oproti PAM. Je nutné pak ve všech přistupujících stanic nastavit registry.

  • PAM – Vše zůstane při starém.
  • SAMBA – Je nutné nastavit v smb.conf `encrypt passwords = no''. Doporučuji také nastavit ` pam password change = yes'' pro umožnění změny hesla přes PAM. Nutnou položkou je také ``password sync = yes''. V případě změny hesla přes sambu bude změněno i heslo v systému.
  • APACHE – abychom obešli problém s /etc/shadow a SUID, budeme provádět autentifikaci oproti sambě s využitím PAM modulů (více viz kapitola Apache a PAM se sambou).

Toto je nejjednodušší a nejméně bezpečné řešení. Jeho velkou nevýhodou je, že je nutné přesvědčovat jednotlivé stanice změnou registrů, aby byly schopné se připojit.

Encrypted passwords a synchronizace s PAM

Tato varianta bude využívat dvě databáze hesel a uživatelů – /etc/shadow a /etc/samba/smbpas­swd. Při změně hesla bude provedena synchronizace s druhou databází. Samozřejmě také platí, že databáze musí být na stejném stroji.

  • PAM – Je nutné upravit některé soubory v /etc/pam.d/. Pro všechny programy, které chceme autentifikovat proti sambě, musíme upravit jejich odpovídající soubor.

    Do všech těch modulů, kde provádíme autentifikaci (login, kdm, gdm, ssh, xscreensaver, pop3, …), přidáme něco takového:

    auth   requisite    pam_nologin.so
    auth   requisite    pam_unix.so
    auth   optional     pam_smbpass.so migrate

    pam_smbpass je zavoláno. pokud pam_unix uspěje. Přidá heslo, kterým se uživatel úspěšně přihlásil i do samby.

    Do /etc/pam.d/passwd přidáme toto:

    password  requisite  pam_cracklib.so retry=3
    password  required   pam_unix.so shadow md5 use_authtok try_first_pass
    password  required   pam_smbpass.so nullok use_authtok try_first_pass

    Pro správnou funkčnost musíte mít nainstalován modul cracklib. Ve výchozí konfiguraci provádí ověření síly hesla přímo modul pam_unix.so. Protože ale před ním použijeme smb_auth, který ověření síly hesla nemá, je nutné používat i cracklib.

    Nejdříve se tedy ověří, zda je heslo dostatečně silné (první řádek). Pak se změní heslo v /etc/shadow a posléze i v /etc/samba/smbpas­swd. Je nutné poznamenat, že aby celá změna hesla proběhla úspěšně, je nutné mít všechny uživatele v /etc/samba/smbpas­swd, jinak změna selže (i když se heslo v /etc/shadow změní).
  • SAMBA – Je nutné nastavit v smb.conf ``encrypt passwords = yes. Také je třeba nastavit ``pam password change = yes pro umožnění změny hesla přes PAM. V žádném případě nepoužívejte passwd chat a program /bin/passwd. Protože budeme synchronizovat také v opačném směru, nastalo by zacyklení a dead-lock.
  • APACHE – abychom obešli problém s /etc/shadow a SUID, budeme provádět autentifikaci oproti sambě.

Pozor! Po přidání uživatele jej musíte také přidat do /etc/samba/smbpas­swd, nebo nebude možné měnit mu heslo.

Encrypted passwords a autentifikaci PAM oproti sambě

V tomto případě budeme mít hesla pouze v sambě a autorizovat systém oproti ní. Pro důležitá konta (root) budeme mít hesla i v /etc/shadow, abychom byli schopni se autorizovat i při vypnuté sambě.

  • PAM – Toto bude větší oříšek. Je nutné přidat toto do /etc/pam.d/login a všech dalších, které budete používat pro přihlašování (např. kdm, gdm, ssh, pop3, …).
    auth  optional  pam_unix.so  nullok
    auth  required  pam_smb_auth.so  debug use_first_pass

    První řádek určuje, že se bude systém autorizovat oproti /etc/shadow. V případě, že se autorizace povede, se již nevolá pam_smb_auth.so. V případě, že se autorizace nepovede, přijde na řadu autorizace sambou, která použije heslo zadané pro předchozí modul. Žádná další položka „auth“ již není potřeba.

    Je také nutné nastavit do /etc/pam.d/passwd toto:

    password requisite  pam_cracklib.so retry=3
    password required   pam_smbpass.so nullok use_authtok try_first_pass

    Pro správnou funkčnost musíte mít opět nainstalován modul cracklib. Ve výchozí konfiguraci provádí ověření síly hesla přímo modul pam_unix.so. Protože ale použijeme smb_auth, který ověření síly hesla nemá, je nutné používat i cracklib.

    Nejdříve se tedy ověří, zda je heslo dostatečně silné (první řádek). Pak se změní heslo v sambě.

  • SAMBA – Je nutné nastavit v smb.conf ``encrypt passwords = yes. Nastavte také položku ``password sync = no, aby systém nenastavil heslo v systému při změně v sambě.
  • APACHE – opět stejné jako u předchozích bodů.

Pozor! Pokud přidáte nového uživatele musíte jej také přidat do /etc/samba/smbpas­swd. Jinak se nebude moci uživatel přihlásit.

Apache a PAM se sambou

PAM v Apache

Pro umožnění autentifikace s PAM je nutné doinstalovat balíček libapache-mod-auth-pam.

Pro jeho zaktivování je nutné zapnout v /etc/apache/httpd­.conf

LoadModule pam_auth_module /usr/lib/apache/1.3/mod_auth_pam.so

Pak je možné nastavit přístupová práva na adresář např. takto:

<Directory /var/www/secure>
AuthPAM_Enabled on
AuthType Basic
AuthName "Realm"
require valid-user
</Directory>

Je možné také použít jako sekundární autentifikaci (v případě, že selže PAM) textový soubor:

AuthPAM_Enabled on
AuthPAM_FallThrough on
AuthUserFile /path/to/.htpasswd
AuthType Basic
AuthName "Realm"

Ověřte si ovšem, že auth_pam_module je první autentifikační modul v apachi (pak se vyzkouší další) a že EnablePAM_FallThrou­gh je nastavena na on.

Pokud chcete autentifikovat až jako druhý oproti PAM, použijte toto:

AuthAuthoritative on
AuthUserFile /path/to/.htpasswd
AuthPAM_Enabled on
AuthType Basic
AuthName "Realm"

Opět ověřte, že auth_pam_module je načten až jako druhý autentifikační modul v apachi a AuthAutoritative je nastavena na on.

Nevýhodou tohoto modulu je, že můžete definovat, které PAM moduly použít, jen v rámci celého apache. Nelze tedy část autentifikovat oproti sambě a část proti LDAP serveru.

Konfigurace PAM

Ve výchozí konfiguraci používá PAM modul pro apache soubor /etc/pam.d/httpd. Jeho obsah by mohl vypadat takto:

#%PAM-1.0
auth    required    pam_unix.so

V tomto případě se k autentifikaci použije standardní /etc/shadow a /etc/passwd. Samozřejmě autorizace oproti /etc/shadow se povede jen v tom případě, že jej může webový server číst. Což ve výchozím nastavení neplatí. A není dobré to povolovat.

Proto potřebujeme autentifikaci oproti sambě.

#%PAM-1.0
auth     required  pam_smb_auth.so debug
account  required  pam_permit.so

Pokud pro PAM neuvedete pracovní konfigurační řádek, použije výchozí hodnotu (myslím, že je to pam_unix.so). Ten ovšem nebude mít právo čtení z /etc/shadow a selže. Proto musíme mít uveden i druhý řádek – automaticky povolí přístup na tento stroj (ovšem jen pro apache).

pam_smb

Tento modul umožňuje autentifikaci proti samba doméně. Používá konfigurační soubor /etc/pam_smb.conf, který má následující tvar:

DOMENA
SERVER1
SERVER2

SERVER1 a SERVER2 nemusí být samba nebo NT/2000/XP servery. Stačí, pokud jsou to jen stanice, které jsou schopné se do domény přihlásit.

  • debug zapne ladící výpisy
  • use_first_pass neptej se uživatele na heslo, ale použij záznam ve strukturách PAM_ modulu. Tyto struktury jsou naplněny z předchozích modulů (např. ověření hesla oproti /etc/shadow). Použitelné, pokud chcete zařídit, aby uživatel, nemá-li heslo v /etc/shadow, použil autentifikaci oproti sambě.
  • try_first_pass opět jako předchozí krok, ale pokud se nepodaří využít informace z předchozího modulu, zeptá se uživatele.

pam_smbpass

Tento modul neumí autorizovat oproti doméně, ale oproti smbpasswd souboru. Bohužel nedokáže zatím zpracovat nový způsob ukládání hesel (.tdb), který bude použit ve verzi samba 3.0. Jeho výhodou je, že umí oproti tomuto souboru nejen autentifikovat, ale také synchronizovat. Umožňuje, že po přihlášení uživatele (když je ještě známé heslo) jej uloží do smbpasswd. Umožňuje Vám přemigrovat nebo synchronizovat systém z /etc/shadow nenásilnou formou jen tak, že se uživatelé přihlásí.

Má tyto parametry:

  • debug zapne ladící výpisy
  • use_first_pass neptej se uživatele na heslo, ale použij záznam ve strukturách PAM_ modulu. Tyto struktury jsou naplněny z předchozích modulů (např. ověření hesla oproti /etc/shadow). Použitelné pokud chcete zařídit, aby uživatel, nemá-li heslo v /etc/shadow, použil autorizaci oproti sambě.
  • try_first_pass opět jako předchozí krok, ale pokud se nepodaří využít informace z předchozího modulu, zeptá se uživatele.
  • not_set_pass nenastavuj struktury v PAM_ pro použití dalšími moduly.
  • nodelay nečekej v případě špatného zadání hesla
  • migrate použitelné jen jako ``auth''; používá se k aktualizaci smbpasswd

Takto může vypadat PAM soubor pro password synchronizaci obou databází:

auth      requisite  pam_nologin.so
auth      required   pam_unix.so
account   required   pam_unix.so
password  requisite  pam_cracklib.so retry=3
password  requisite  pam_unix.so shadow md5 use_authtok try_first_pass
password  required   pam_smbpass.so nullok use_authtok try_first_pass
session   required   pam_unix.so

Jen pro vysvětlení: jako první se na heslo zeptá modul cracklib. Ten ověří, že heslo není ve slovníku ani není příliš jednoduché. Dále pokračuje modul unix, který zaktualizuje databáze /etc/shadow. Heslo bere z předchozího modulu. Pak pokračuje smbpass a provede totéž s /etc/samba/smbpas­swd.

A zde soubor, který můžete použít jak pro login, tak pro passwd.

root_podpora

auth      requisite  pam_nologin.so
# pam_smbpass je zavoláno, pokud pam_unix uspěje.
auth      requisite  pam_unix.so
auth      optional   pam_smbpass.so migrate
account   required   pam_unix.so
password  requisite  pam_cracklib.so retry=3
password  requisite  pam_unix.so shadow md5 use_authtok try_first_pass
password  optional   pam_smbpass.so nullok use_authtok try_first_pass
session   required   pam_unix.so

Pokud budete častěji používat pam, jistě oceníte služby nového modulu pam_stack, který bohužel v mé oblíbené distribuci debian není.

Závěr

Bylo zde představeno několik způsobů, jak vyřešit nastíněný problém. Jejich výčet není kompletní. Dalším řešením je použít službu kerberos. Její velkou výhodou je, že se heslo pokaždé neposílá znovu a znovu, což jistě oceníte zvlášť díky objevené chybě v ssl (použití postranního kanálu). Její použití bych doporučil zvlášť ve větších počítačových sítích.

Byl pro vás článek přínosný?

Autor článku

Jednatel a spoluzakladatel ABRA FlexiBee, nadšenec ve vývoji online ekonomických systémů. Od roku 2008 se věnuje vývoji cloudového ekonomického systému FlexiBee. Vystudoval softwarové inženýrství na FAV Západočeské univerzity v Plzni.