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/smbpasswd), 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/smbpasswd. 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/smbpasswd. Je nutné poznamenat, že aby celá změna hesla proběhla úspěšně, je nutné mít všechny uživatele v /etc/samba/smbpasswd, 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/smbpasswd, 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/smbpasswd. 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_FallThrough 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/smbpasswd.
A zde soubor, který můžete použít jak pro login, tak pro passwd.
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.