čtvrtek 25. února 2010

Jak na jednorázová hesla v Linuxu

Zabezpečení serverů, se mnohokrát bohužel neobejde bez různých kompromisů, které mnohdy mohou vést až k docela nepříjemným bezpečnostním dírám. Například v situaci, kdy potřebujete mít k serveru v podstatě nepřetržitý přístup odkudkoli je situace dosti obtížná. Samozřejmostí je zakázat přihlašování pomocí hesel a přihlašovat se pouze pomocí klíčů. Ovšem co dělat v případě, kdy se potřebujete připojit z nedůvěryhodného stroje, kde je možnost odposlechu klíče vcelku velká, nebo prostě sebou své privátní klíče netaháte po kapsách?

Vcelku elegantním řešením v tomto případě můžou být jednorázová hesla (OTP). Jelikož je každé takové heslo vždy pouze na jedno použití je nebezpečí plynoucí z odposlechu hesla naprosto irelevantní. V tomto článku bych se pokusil popsat postup jak zprovoznit přihlašování na vzdálený server přes ssh pomocí jednorázových hesel. Veškerý uvedený postup byl prováděn na Debian linuxu, ovšem bude s drobnými obměnami platný i na jiných distribucích, dost možná i na jiných systémech, pro které byl program portován.

Instalace

Pro plnou funkčnost, tedy generování i ověřování klíčů budeme potřebovat tyto 3 balíčky :

  • libpam-opie - modul pro PAM
  • opie-client - programy pro generování sady hesel
  • opie-server - programy pro vytvoření master hesla a poskytování informací o OTP
Vše nainstalujeme pomocí :

aptitude install libpam-opie opie-client opie-server

Nastavení

Za předpokladu, že budeme jednorázová hesla používat pro autentizaci přes ssh, budeme muset správně nastavit ssh démona. V souboru /etc/ssh/sshd_config upravíme následující:

ChallengeResponseAuthentication yes
PasswordAuthentication yes

Jelikož v linuxu používáme PAM, musíme nastavi soubor, který používá ssh server. Nejspíše jej najdeme zde /etc/pam.d/ssh. V této chvíli je ovšem potřeba se zamyslet a to hlavně v případě, že jsme na daný stroj připojeni vzdáleně. Hrozí totiž, že si odřízneme k serveru přístup úplně. Pro testování prozatím doporučuji odkomentovat druhý řádek, aby nám zůstala možnost přihlásit se heslem v případě, že se něco nepovede.

# @include common-auth
# auth    sufficient      pam_unix.so
auth    sufficient      pam_opie.so
auth    required        pam_deny.so
Všimněte si, že include je zakomentovaný. Nyní je třeba restartovat ssh server.

Vygenerování hesel

Nejdříve inicializujeme sekvenci hesel a zavedeme master heslo.

opiepasswd -c

Toto bychom měli provádět v ideálním případě přímo na daném stroji, aby nedošlo k odposlechu master hesla. Pokud i přesto toužíte vygenerovat hesla vzdáleně použijte parametr -f. Master heslo by mělo být dostatečně bezpečné a dostatečně dlouhé (10 - 127 znaků). Heslo si po absolvování celého návodu není třeba pamatovat!

V souboru /etc/opiekeys si můžeme ověřit že heslo již na serveru opravdu je. Pomocí nástroje opieinfo se můžeme podívat, jaké heslo bude vyžadováno při dalším přihlášení.

Nyní přichází na řadu ta nejpodstatnější část a to je vygenerování sady jednorázových hesel pomocí příkazu :

opiekey -n 10 'opieinfo', nebo například opiekey -n 10 498 as2776

Při zadávání master hesla se musíme mít napozoru, jelikož se nekontroluje jeho správnost (není k tomu důvod, ani to není žádoucí). Mohlo by se tedy lehce stát, že vygenerujete sadu hesel, která ovšem nebude korespondovat s heslem uloženým na serveru a bude tedy nepoužitelná. Po vygenerování sady hesel můžeme master heslo zapomenout, pak ale budeme muset v případě potřeby dalších hesel znovu inicializovat sekvenci hesel pomocí opiepasswd.

A jak to funguje ?

Jednorázová hesla fungují na velmi jednoduché principu, je ovšem potřeba ten princip nejprve pochopit. V návodu jsme nejdříve inicializovali sekvenci hesel. Předali jsme programu naše tajné master heslo a ten na něj aplikoval 499-krát hashovací funkci ƒ a výsledek si zapamatoval. Hashovací funkce musí být zvolena takové, o které se ví, že pro ní neexistuje reverzní algoritmus.

Dále jsme si nechali vygenerovat sadu jednorázových hesel. Opět jsme programu předali naše tajné master heslo a ten na něj aplikoval funkci ƒ tolikrát kolik bylo potřeba podle parametru -n. Příslušné mezivýsledky nám vytiskl. Aby byla hesla čitelnější jsou překládána pomocí slovníku vybraných anglických slovíček, ale to pro funkci není podstatné.

A nyní přichází ta vtipná část. Při přihlášení po nás bude server vyžadovat vždy heslo s indexem o jedna nižším než to, které je uloženo na serveru. Jako příklad vezměme první přihlášení po vygenerování hesel. Na serveru je heslo s indexem 499, na master heslo byla tedy hashovaci funkce ƒ aplikována 499-krát. Server po nás bude chtít heslo s indexem 498. Na něj aplikuje hashovací funkci ƒ a získá heslo s indexem 499. Pokud se hash shoduje s heslem na serveru je vše v pořádku a server zapomene heslo 499 a zapamatuje si námi předané heslo 498. A tak to pokračuje dále až to vyčerpání sady. Geniálně jednoduché a jednoduše geniální.

Žádné komentáře:

Okomentovat