Menu:
  :. HomePage
  :. Linux
  :. Solaris
  :. Windows
  :. Programování
  :. Java + Tomcat
  :. HW obecně
  :. VoIP - Asterisk
  :. Cisco - Mikrotik - Síť
  :. O mě
  :. Fotogalerie

 Testovací:
  :. ASP projekt
  :. JSP projekt



 Doporučuji:

Savvy - profesionální webhosting, webdesign a serverhosting
Internetový obchod Stromeček.cz - hardware, software a mobily za super ceny
AirCon Miroslav
Galerie fotek
Notebooky
Webdesign Praha

www.eprdel.cz
www.root.cz
Lumimont

NAVRCHOLU.cz
A



Vaše IP:
54.157.61.68

OpenSSH a ProFTPd - autorizace uživatelů vůči MySQL - pam_mysql

Na serverech si držím o uživatelích přímo v systému minimum informací. Většinu věcí davám do databáze MySQL. Také hesla jednotlivých uživatelů ukladám v šifrované podobě do databáze. Přece jenom se pak lépe s těmito daty pracuje :) A tak jsem začal po webu zhanět informace, ale opravdu moc informací v čestině o tom nenajdete a tak jsem se rozhodl o této problematice napsat tento článek o autorizaci uživatelů pomocí databáze MySQL s využitim autentifikačního modulu pam_mysql.

1. Kratký popis PAM (Pluggable Authentification Modules)

1.1. Úvod

V krátkosti je PAM soubor sdílených knihoven, které umožní zvolit administratorovi jak aplikace autentifikují uživatele. Výhodou této metody je, že můžeme měnit autentifikační mechanismy bez jakéhokoliv zásahu do aplikace.

PAM funguje velmi jednoduše. Program, který potřebuje autentifikovat uživatele si zavolá funkci PAM, která projde s uživatelem autentifikační proces a vrátí programu jednoduchý výsledek - uživatel prošel/neprošel.

Pro konfiguraci PAM autentifikace se převážně používá skupina konfiguračních souboru, kterou nalezneme v /etc/pam.d/ (kazda sluzba ma samostany konfigurační soubor).

1.2. Syntaxe konfiguračních souborů

Konfigurace je v textových souborech, kde jednotlivé řádky mají následující syntaxy.

module-type control-flag module-path arguments

module-type

Jeden z čtyř typů modulu:


  • auth - tento typ modulu poskytuje dva aspekty autentifikace uživatele. Za prvé, potvrdí, že uživatel je ten, kdo tvrdí, že je, instruováním aplikace, aby požádala uživatele o heslo nebo nějakou jinou identifikaci (např. vzorek sítnice). Za druhé, modul může přidělit členství v nějaké skupině (nezávisle na souboru /etc/group) nebo jiná privilegia vyplývající z právě ověřeného pověření.

  • account - tento typ modulu provádí ne-autentizační management účtu. Je typicky používán pro zakázání/povolení přístupu ke službě v závislosti na denním čase, pro omezení odkud se může daný uživatel nalogovat, atd. Také bych si třeba dokázal představit modul tohoto typu, který umožňuje uživateli nalogovat se pouze pokud má ještě dost "peněz na účtě".

  • session - primárně je tento modul určen na provádění věcí, které je potřeba udělat před/po vykonáním dané služby. Takové věci zahrnují logování informací, mountování disků (třeba síťových při nalogování na novell), atd.

  • password - tento poslední modul je nutný pro provedení aktualizace autentifikačního symbolu (nejčastěji hesla) souvisejícího s uživatelem. Typicky existuje jeden password modul pro každý typ autentifikace (jeden pro klasická unixová hesla, jeden pro hesla na novellu, atd.).




control-flag

Kontrolní příznak se používá k tomu, aby se PAMu určilo jak má reagovat na úspěch/selhání daného modulu. Protože moduly se mohou dávat do série (moduly stejného typu se spouštějí v sérii, jeden po druhém), kontrolní příznaky určují relativní důležitost každého modulu. Takové sérii modulů se říká stack. Tento anglický termín budu dále v textu používat, protože jsem nenašel žádný odpovídající český ekvivalent. Aplikaci není oznámeno jak to dopadlo individuálně pro každý modul. Místo toho dostane od knihovny Linux-PAM sumární odpověď úspěch nebo selhání. Pořadí spouštění modulů je dáno jejich seřazením v konfiguračním souboru. Od Linux-PAM v0.60 je možné control-flag specifikovat jednou ze dvou syntaxí.

Jednodušší (a historicky starší) syntaxe pro control-flag je jedno klíčové slovo definované na indikování přísnosti asociované s úspěchem nebo selháním specifikovaného modulu. Jsou čtyři taková klíčová slova: required, requisite, sufficient a optional.

Linux-PAM knihovna je interpretuje následujícím způsobem:


  • required - toto indikuje, že úspěch modulu je nutný pro úspěch celého module-type stacku. Selhání tohoto modulu není uživateli oznámeno, dokud se nespustí všechny zbývající moduly stejného typu.

  • requisite - jako required, ale v případě selhání modulu je okamžitě vrácena kontrola aplikaci. Návratová hodnota je svázána s prvním required nebo requisite modelem, který neuspěl. Poznámka: Tento příznak může být použit pro zabránění poslání hesla přes nebezpečné médium.

  • sufficient - úspěch modulu je brán jako dostatečný pro uspokojení knihovny Linux-PAM a skončí se vykonávání příslušného stacku a aplikaci se vrátí úspěch. Lze to například použít pro autentifikaci uživatelů buď klasicky unixově nebo přes novell. Jako sufficient jsem dal modul pro klasickou unixovou autentifikaci (lokální) a za něj jsem dal modul pro autentifikaci přes novell jako required. Potom pokud je uživatel identifikován pozitivně lokálně, je nalogován (lidé, kteří se autentifikovali přes novell měli v /etc/shadow jako heslo `!'), pokud není, může se ještě identifikovat přes novell. Poznámka: Jednou jsem umazal autentifikaci přes novell a nepřepsal sufficient u autentifikace přes novell na required. A pak jsem byl "mile překvapen", že uživatel se může autentifikovat (napsat správné heslo) a PAM je spokojený, ale také se může nalogovat na kohokoli včetně roota bez hesla, protože žádný modul v autentifikačním stacku není required. Takže na to POZOR!!! Je třeba stack (zvláště auth) uzavírat modulem s příznakem required.

  • optional - tento control-flag označuje modul, který není kritický pro úspěch/selhání stacku. Pokud všechny ostatní sufficient a optional moduly ve stacku nejsou úspěšné, pak závisí návratová hodnota celého stacku na tomto modulu.




Více propracovaná (novější) syntax dává administrátorovi velký potenciál ke konfigurování toho, jak je uživatel autentifikován. Tato forma kontrolního příznaku je vymezena hranatými závorkami a sestává ze série value=action prvků:

[value1=action1 value2=action2 ...]

Kde, valueI je jedna z následujících návratových hodnot: success; open_err; symbol_err; service_err; system_err; buf_err; perm_denied; auth_err; cred_insufficient; authinfo_unavail; user_unknown; maxtries; new_authtok_reqd; acct_expired; session_err; cred_unavail; cred_expired; cred_err; no_module_data; conv_err; authtok_err; authtok_recover_err; authtok_lock_busy; authtok_disable_aging; try_again; ignore; abort; authtok_expired; module_unknown; bad_item; a default. Poslední z nich (default) může být použit na nastavení akce pro návratové hodnoty, které nejsou určeny explicitně.

actionI může být kladné přirozené číslo nebo jedna z následujících hodnot: ignore; ok; done; bad; die; a reset. Kladné číslo, J, pokud je specifikováno jako akce, může být použito k indikování, že příštích J modulů tohoto typu bude přeskočeno. Takto může administrátor vytvořit poměrně sofistikovaný stack modulů s mnoha různými možnostmi provedení. Která možnost bude provedena je dáno reakcí jednotlivých modulů.

module-path

Cesta k dynamicky zaveditelným object souborům; samotný pluggable modul. Pokud je první znak cesty k modulu `/', je brána jako kompletní cesta. Pokud není, modul se hledá implicitně v /usr/lib/security. Ovšem RedHat Linux (který používá PAM již od RedHat Linux 3.0.4) má moduly v /lib/security a v konfiguraci je specifikovaná celá cesta.

arguments

Argumenty tvoří seznam, který je předán modulům při spuštění. Podobně jako argumenty pro typický linuxový příkaz shellu. Obecně jsou argumenty volitelné a jsou specifické pro daný modul. Chybné argumenty jsou ignorovány a od modulu je požadováno, aby nahlásil chybu pomocí funkce syslog(3). O argumentech se bude jednat v další sekci.

1.3. Obecné volitelné argumenty

Následují argumenty, které by měly být srozumitelné každému modulu.

debug - Použij syslog(3) na logování debugovacích informací.

no_warn - Instruuj modul, aby neposílal aplikacím varovné zprávy.

use_first_pass - Modul by se neměl ptát uživatele na heslo. Místo toho, by měl použít předtím zadané heslo (od předchozího auth modulu), a použít ho. Pokud to nefunguje, pak uživatel není autentifikován. (Tato volba je určena pouze pro auth a password moduly).

try_first_pass - Podobné jako předchozí volba. S tou výhradou, že pokud přejaté heslo nefunguje, modul se uživatele zeptá na heslo. (Tato volba je určena pouze pro auth moduly).

2. pam_mysql - krátký popis

Tento modul slouží k ověření hesla pomocí MySQL databáze. Pro správnou fuknci je potřeba modul naisntalovat. V Mandrive můžeme např. pomoci urpmi pam-mysql. Pokud Vaše distribuce tento modul nemá, tak si ho budete muset stáhnout a překompilovat. Zdrojové texty naleznete na domovské stránce projektu pam_mysql.

Přiklad použití pam_mysql:

auth sufficient pam_mysql.so user=system passwd=tajne_pw host=localhost db=system table=shadow usercolumn=login passwdcolumn=passwd crypt=1 sqllog=0

Popis parametru modulu pam_mysql:

user - Uživatelské jméno pro přistup k MySQL
passwd - Heslo pr přistup k MySQL
host - Server na kterém běží MySQL
db - Název databáze
table - Název tabulky, kde máme uložené loginy a hesla
usercolumn - Název sloupce, kde máme uložene unix loginy (uživatelské jména)
passwdcolumn - Název sloupce, kde méme uložené hesla. Doporučuji používat zacryptovaná hesla
crypt - Určuje v jakém tvaru jsou uložene hesla. 0 - plain text, hesla jsou nezakrzptovaná, 1 - heslo zacrzptovano pomoci fukce crypt (velmi doporučuji), 2 - Použité hesla pomoci MySQL fukce PASSWORD(), 3 - plain text, zahešované přes funkci MD5.
where - Poplňujici kryteria SQL dotazu. Lze napriklad použit sloupec pro aktivni a neaktivni hesla (where=Host.name="web" AND User.active=1)
sqllog - zapisuje logovací informace do sql tabulky. Velmi vhodne pro ladění.

3. Připrava MySQL

Jako první si musime zalořit novou databazi a uživatele, který bude mit k databázi přistup.

CREATE DATABASE system;
GRANT ALL PRIVILEGES ON system.* TO 'sytem'@'%' IDENTIFIED BY 'tajne_pw' WITH GRANT OPTION;



Pak si nasledně pripravime tabulku na hesla (shadow) a tabulku na logy:

CREATE TABLE `shadow` (
`id` int(11) NOT NULL auto_increment,
`login` varchar(64) NOT NULL default '',
`passwd` varchar(64) NOT NULL default '',
`aktivni` int(11) NOT NULL default '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;

CREATE TABLE `log` (
`msg` varchar(50) NOT NULL default '',
`user` varchar(50) NOT NULL default '',
`pid` int(11) NOT NULL default '0',
`host` varchar(100) NOT NULL default '',
`time` datetime NOT NULL default '0000-00-00 00:00:00'
) ENGINE=MyISAM DEFAULT CHARSET=latin1;



Příklad s použítí logovaní:

auth sufficient pam_mysql.so user=system passwd=tajne_pw host=localhost db=system table=shadow usercolumn=login passwdcolumn=passwd crypt=1 sqllog=true logtable=log logmsgcolumn=msg logusercolumn=user logpidcolumn=pid loghostcolumn=host logtimecolumn=time

4. Nastaveni OpenSSH

Nejprve si musíme pro OpenSSH povolit používaní PAM autorizace. Toto provedeme v konfiguracnim souboru /etc/ssh/sshd_config, kde musíme odkomentovat nebo přidat řádek

UsePAM yes



další části je samostana konfugurace PAM autorizace přimo pro protokol ssh. Toto provedeme v konfiguračním souboru /etc/pam.d/ssh.

Nastaveni souboru /etc/pam.d/sshd v Mandriva 2006 (červenou barvou uznačim změny nebo přidane řádky)

#%PAM-1.0
auth required pam_listfile.so item=user sense=deny file=/etc/ssh/denyusers
auth sufficient pam_stack.so service=system-auth
auth sufficient pam_mysql.so user=system passwd=tajne_heslo host=localhost db=system table=shadow usercolumn=login passwdcolumn=passwd crypt=1 sqllog=0
auth required pam_deny.so

account optional pam_stack.so service=system-auth
#account required pam_mysql.so user=system passwd=edejso7o host=localhost db=system table=mysql_shadow usercolumn=login passwdcolumn=passwd crypt=0 debug
password required pam_stack.so service=system-auth
session required pam_stack.so service=system-auth



4. Nastaveni ProFTPd

Nejprve je potřeba upravit v souboru /etc/pam.d/ftp nastaveni pro PAM autorizaci pomocí MySQL

#%PAM-1.0
auth       required     pam_listfile.so item=user sense=deny file=/etc/ftpusers onerr=succeed
auth       sufficient   pam_stack.so service=system-auth
auth       sufficient   pam_mysql.so user=system passwd=tajne_hesloj host=localhost db=system table=shadow usercolumn=login passwdcolumn=passwd crypt=1 sqllog=0
auth       required     pam_deny.so

# If this is enabled, anonymous logins will fail because the 'ftp' user does
# not have a "valid" shell, as listed in /etc/shells.
#
# If you enable this, it is recommended that you do *not* give the 'ftp'
# user a real shell. Instead, give the 'ftp' user /bin/false for a shell and
# add /bin/false to /etc/shells.
#auth       required    pam_shells.so

account    required     pam_stack.so service=system-auth
session    required     pam_stack.so service=system-auth



Dále v konfiguračním soubortu proftpd.conf stačí přidat directivu AuthPAM on, pomocí které se budou ověřovat hesla pres PAM modul.

AuthPAM on



Zdroje:

http://www.manualy.sk/seminar/Papers98/Linux-PAM/
http://www.us.kernel.org/pub/linux/libs/pam/Linux-PAM-html/pam-4.html#ss4.1
http://www.zdenda.com/openssh

 
« Zpět na seznam