Shadow (soubor)
Shadow (anglicky shadow password, stínová hesla) je v informatice označení pro způsob ukrytí hašovaných hesel do separátního souboru, který je využíván hlavně v unixových systémech. Zamezuje snadné krádeži zašifrovaných hesel a tím možnosti využít útok hrubou silou nebo duhové tabulky pro získání původní podoby uloženého hesla. Typicky má přístup k hašovaným heslům pouze správce počítače.
Charakteristika
Hesla jsou na unixových systémech uložena v podobě hashe, protože z této podoby není možné přímo odvodit původní heslo v otevřené podobě (čitelné, tj. tak, jak ho zadává uživatel při přihlašování). Pokud má však útočník přístup k hashům, může využít útok hrubou silou nebo využít slovníkový útok, a tak původní hesla získat. Po krádeži hesel v hashované podobě je možné útok na hesla provést mimo napadený počítač, kde má útočník k dispozici dostatečný výpočetní výkon (může například využít duhové tabulky, botnet a podobně).
Jedním řešením je zpřístupnit databázi hesel v souboru /etc/passwd
pouze pro správce. To by ale znemožnilo přístup ostatním uživatelům ke zbytku souboru, například k překladu uživatelského jména na ID uživatele a narušilo by to funkčnost mnoha existujících nástrojů. Jiným řešením je použití stínového souboru, kam jsou hesla uložena odděleně od ostatních veřejně přístupných dat v souboru /etc/passwd
. Stínovým souborem je obvykle /etc/shadow
(na linuxových a unixových systémech) nebo v /etc/master.passwd
(v BSD systémech). Soubor je čitelný pouze správcem počítače. Prakticky všechny současné unixové operační systémy používají stínová hesla.
Stínová hesla neřeší problém s útočníkovým přístupem k hašovaným heslům zcela. Některé síťové autentizační mechanismy přenášejí hašované heslo po síti (někdy v otevřeném textu, například telnet (RFC 2877), čím ho vystavují možnosti zachycení. Kopie systémových dat, jako zálohy na páskách a optických médiích se také mohou stát prostředkem pro získání zašifrovaného hesla. Kromě toho, funkce programů oprávněných ke kontrole hesla musí být napsány tak, aby škodlivý program nemohl provádět velké množství kontrol hesla v krátkém čase.
Formát souboru
Ve starších systémech bez stínových hesel (typicky starší unixové systémy pocházející přibližně z období před rokem 1990) byly informace o každém uživateli uchovávány takto:
- Uživatelské jméno
- Kryptografická sůl kombinovaná s hašem uživatelova hesla (obvykle vytvořenou kryptografickou hašovací funkcí)
- Informace o vypršení platnosti hesla
- ID uživatele
- ID skupiny
- Celé jméno
- Cesta do domovské složky
- Přihlašovací shell
Soubor /etc/passwd
je čitelný pro všechny uživatele, takže funguje jako adresářová služba (například zajišťuje, že jsou vidět jména vlastníků ve vlastnostech složky), ale pouze správce jej může měnit. To znamená, že útočník bez příslušných oprávnění do systému může získat hašovaná hesla každého uživatele. Tyto údaje mohou být použity pro offline útok hrubou silou, testováním možných hesel proti jejich hašům a to poměrně rychle, aniž by bezpečnostní systém zaznamenal nezvykle vysoké číslo neúspěšných pokusů o přihlášení. Uživatelé navíc často volí velmi zranitelná hesla (přezdívky, data narození, apod.).
Pokud se používají stínová hesla, jsou v souboru /etc/passwd
hašovaná hesla nahrazena znakem „*
“ nebo „x
“. Soubor /etc/shadow
obvykle obsahuje následující informace:
- Přihlašovací jméno uživatele
- Kryptografická sůl a hašované heslo nebo hodnotu stavové výjimky, např.:
- "$id$sůl$hašovanéheslo", kde "$id" je použitý algoritmus (Na GNU/Linuxu, "
$1$
" znamená MD5, "$2$
" je Blowfish, "$5$
" je SHA-256 a "$6$
" je SHA-512,[1] ostatní Unix systémy mohou mít jiné hodnoty[2] - "NP" nebo "!" nebo null – žádné heslo, účet je bez hesla
- "LK" nebo "*" – účet je zamknut, uživatel se nemůže přihlásit
- "!!" – platnost hesla vypršela
- "$id$sůl$hašovanéheslo", kde "$id" je použitý algoritmus (Na GNU/Linuxu, "
- Počet dní od počátku unixového času poslední změny hesla
- Počet dní do možnosti změny
- Počet dní před vyžadovanou změnou hesla
- Počet dní varujících před vypršením platnosti hesla
- Počet dní po vypršení hesla než bude účet deaktivován
- Počet dní od počátku unixového času kdy je účet zakázán
- Rezervováno
Formát souboru shadow
je jednoduchý a v podstatě stejný jako v souboru passwd
. Na jednoho uživatele připadá právě jeden řádek. Jednotlivá pole jsou oddělena dvojtečkou a jsou v přesném pořadí. Mnoho systémů požaduje, aby pořadí uživatelů v souboru shadow
bylo stejné jako v souboru passwd
.
Úpravy obsahu souboru shadow
se na většině systému obecně provádějí voláním programu passwd, což záleží na PAM. Například typ použitého hashe je určen konfigurací v modulu pam_unix.so
. Jako výchozí je použit MD5, ale ostatní použitelné algoritmy jako blowfish, SHA-256 a SHA-512 umožňují silnější šifry.
Historie
Stínování hesel se poprvé objevilo v UNIX systémech s vývojem vydání 3.2 Systému V v roce 1988 a BSD 4.3 Reno v roce 1990. Avšak výrobci vyrábějící porty dřívějších verzí ne vždy zahrnovali novou technologii stínových hesel do svých verzí a tak nechávali jejich uživatele vystavené možným útokům na jejich soubor s hesly.
Správci systému také mohou zařídit ukládání hesel do distribuovaných databází jako NIS a LDAP, spíše než na každý připojený systém. V případě NIS je mechanizmus stínových hesel stále často používán na NIS serverech. V ostatních distribuovaných mechanizmech je problém přístupu k různým ověřovacím komponentám řešen bezpečnostními mechanizmy v jiné úrovni.
V roce 1987 zažil Julie Haugh, autor původního Shadow Password Suite vniknutí do počítače a napsal prvotní verzi Shadow Suite obsahující příkazy login
, passwd
a su
.
Původní verze, napsaná pro operační systém SCO Xenix, byla rychle portována na ostatní platformy. Shadow Suite byl portován na Linux v roce 1992, rok po původním oznámení projektu Linux a byl obsažen v mnoha prvotních distribucích a je stále dodáván i do současných distribucí.
Související články
Reference
- ↑ crypt(3) manpage
- ↑ viz např. NetBSD Archivováno 3. 11. 2013 na Wayback Machine.
V tomto článku byl použit překlad textu z článku Shadow (file) na anglické Wikipedii.