David Cimbůrek



Přihlášení


Nové obrázky

Kluci si to samozřejmě rozdělili a spí na střídačku. Ten je ale malinkej! Táta na plný úvazek. Kubík se prokopává rád, narozdíl od Matyáše v jeho věku. Naše dvě miminka. Zívanec po svačině.

Počasí v Brně

In-počasí

Citát

Jsou okraje lavóru přes které skořápka se svíčkou nemůže.
Jsou okovy vzpomínek přes které duše dál klopýtat nemůže.
Jsou brány a dvířka a zdi přes které může se tam – zpátky se nemůže.
Jsou okovy vzpomínek přes které duše dál klopýtat nemůže.

— Mňága a Žďorp

Secure netrw

1. září 2011, 11:09 | IT | Dave

DownloadReadmeChangelog – Detailní popis


Secure-netrw je jednoduchý (ale mocný) nástroj pro přenos dat přes Internet podporující autentizaci uživatelů i přenášených dat. Je založený na nástroji netrw, do kterého byla doplněna podpora autentizace. Jeho hlavní účel je zjednodušit a urychlit přenos souborů na stroje bez FTP serveru. Lze ho též použít pro poslání dat jinému uživateli se zárukou pravosti dat i obou komunikujících stran. Tento popis je z větší části převzatý z mé diplomové práce, v jejímž rámci jsem systém systém secure-netrw vyvíjel.

Detailní popis

Původní netrw

Balík netrw slouží pro jednoduchý a rychlý přenos dat přes Internet bez použití dalších podpůrných nástrojů jako například ftp. Umožňuje také spočítat hash zasílaných dat pomocí několika hashovacích algoritmů (MD5, SHA-1 a RIPEMD-160). netrw je možné provozovat na unixových operačních systémech (Linux, Solaris, IRIX, OpenBSD) a na systémech Windows (95/98/NT/2000/XP). Celý je napsaný v programovacím jazyce C pod licencí GNU GPL.

Balík se skládá ze dvou programů – klientů: netwrite slouží pro zasílání dat a netread pro přijímání těchto dat.

Typické použití netrw vypadá následovně. Pro přenesení například souboru data.tar.bz2 z počítače host1.somewhere.net na počítač host2.somewhere.net stačí zadat příkazy:

  • Na počítači host2.somewhere.net:
    $ netread -o data.tar.bz2 50000 nebo
    $ netread 50000 >data.tar.bz2
    Po tomto příkazu bude netread čekat na portu 50000 na spojení a na příchozí data, která po obdržení uloží do souboru data.tar.bz2.
  • Na počítači host1.somewhere.net:
    netwrite -i data.tar.bz2 host2.somewhere.net 50000 nebo
    netwrite host2.somewhere.net 50000 <data.tar.bz2

Tento příkaz ustanoví spojení s počítačem host2.somewhere.net na portu 50000 (kde již musí být spuštěn netread očekávající spojení na tomto portu) a pošle mu soubor data.tar.bz2.

Po ukončení přenosu si obě strany vzájemně zašlou hash přenesených dat pro kontrolu jejich integrity během přenosu. Jsou takto informovány, zda byla data doručena v pořádku a bez chyb.

Data je možné přenášet protokoly TCP a UDP (přičemž druhý z nich slouží spíše pro testovací účely).

Za normálních okolností navazuje spojení netwrite. Pokud je ovšem na straně klienta netread v jeho lokální síti aplikován překlad adres nebo zakázáno navazování spojení zvenku lokální sítě, spojení takto nelze ustanovit. Proto obsahuje netrw přepínač -f, který zapne tzv. firewall mód. Ten způsobí, že spojení naváže netread.

Přenos dat potom vypadá následovně:

  • Na počítači host1.somewhere.net se zadá příkaz
    netwrite -i data.tar.bz2 -f 50000 nebo
    netwrite -f 50000 <data.tar.bz2
  • Na počítači host2.somewhere.net se zadá
    netread -o data.tar.bz2 -f host1.somewhere.net 50000 nebo
    netread -f host1.somewhere.net 50000 >data.tar.bz2

Pokud je potřeba přenést více souborů najednou, na unixových strojích se to dá provést například pomocí příkazů

netread 50000 | tar xf -
na straně přijímající a příkazů

tar cf - file1 file2 | netwrite host2.somewhere.net 50000
na straně odesílající.

Na systémech Windows je nutné více souborů sdružit do jednoho pomocí nějakého jiného nástroje (například WinZip, WinRar, přenést tento jeden soubor a na přijímající straně z tohoto archívu vyextrahovat původní soubory.

Data se během přenosu žádným způsobem nešifrují. Proto je jejich přenos velmi rychlý. U velkého množství datových přenosů šifrování dat ani není třeba. A pokud je, pro šifrovaný přenos souborů existují jiné nástroje (například SCP).

U obdržených dat zaslaných pomocí netrw však také neexistuje ani žádná záruka, že jejich odesílatel je skutečně ten, koho příjemce na druhé straně spojení očekává. Data mohou být podvržena nějakým útočníkem, a naopak, data se ke správnému příjemci nemusí vůbec dostat, protože je může přijmout útočník.

Úkolem praktické části mé diplomové práce bylo upravit systém netrw tak, aby si zachoval svou dosavadní funkčnost, a navíc implementoval systém autentizace dat a autentizace jednotlivých komunikujících stran.

Před vlastním přenosem obě strany zjistí, zda komunikující partner je skutečně tím, za koho se vydává (aby se data zbytečně neposílala nějakému útočníkovi, nebo naopak od útočníka nepřijímala). Poté se provede vlastní přenos dat a pomocí výměny autentizačního kódu těchto dat (spočítaného pomocí sdíleného klíče) se ověří jejich autenticita. Přijetím autentizačního kódu si zároveň odesílatel ověří, že data dorazila ke správnému příjemci.

Secure-netrw screenshot.

Autentizace komunikujících stran

Proces autentizace mezi dvěmi komunikujícími stranami zajišťuje jedné nebo oběma stranám určitou (samozřejmě pokud možno co největší) dávku jistoty o skutečné identitě druhé strany.

Pro autentizaci přes síť je nutné použít nějaký autentizační protokol. Nejčastěji používané autentizační protokoly jsou protokoly typu výzva-odpověď.

Na autentizační protokoly typu výzva-odpověď jsou kladeny tyto podmínky:

  • Odposlech zasílaných zpráv útočníkovi nepomůže v podvodné autentizaci.
  • Po odeslání a přijetí všech zpráv má jedna nebo obě strany jistotu o identitě druhého komunikujícího partnera.

Autentizační protokoly jsou založeny na několika různých technikách. Některé protokoly používají symetrickou kryptografii, jiné zase asymetrickou. Existují i tzv. „zero knowledge“ protokoly (protokoly s nulovým rozšířením znalostí), které umožňují demonstrovat znalost nějakého tajemství bez odhalení jakékoliv informace vedoucí k získání tohoto tajemství útočníkem.

V systému Sesure-netrw je použit pro autentizaci obou stran před začátkem přenosu dat autentizační protokol založený na symetrické kryptografii. Symetrická kryptografie je rychlá, nevyžaduje spoluúčast třetí strany a pokud se zvolí vhodný algoritmus, pak je i bezpečná.

Co bývá obsahem zasílaných zpráv? Většinou se jedná o obdobu jedné z následujících variant:

  • Náhodná čísla – Pokud se autentizuje Alice Bobovi, zašle nejprve Bob Alici nějaké náhodné číslo r. Alice pak Bobovi zašle zpět toto náhodné číslo zašifrované pomocí sdíleného symetrického klíče nebo jeho autentizační kód. Bob si takto může snadno ověřit, že Alice skutečně zná sdílené tajemství. Ve skutečnosti se většinou nepoužívají přímo náhodná čísla (jejich generování je obtížné, vyžaduje speciální hardware), ale čísla pseudonáhodná.
  • Sekvence – Místo náhodných čísel se používá monotónně rostoucí sekvence čísel. Takto se zajistí jednoznačná identifikace zpráv. Zajišťuje se tak i zabránění útokům přehráním předchozí komunikace.
  • Časová razítka – Obě strany musí mít spolu synchronizované hodiny. Každá zpráva pak obsahuje své časové razítko. Tak je zajištěna jedinečnost zpráv a časová přesnost.

Při použití sekvencí a časových razítek musí být obě strany nějakým způsobem sesynchronizované. Tato skutečnost vyžaduje jejich další dodatečnou komunikaci, která nemusí být triviální. Při použití těchto mechanismů by musel být návrh Secure-netrw zbytečně složitý. Proto bude autentizace prováděna pomocí pseudonáhodných čísel.

Zprávy budou navíc obsahovat časový údaj, aby nemohly být použity pro nějakou variantu útoku přehráním. Časový údaj zde neplní úlohu časového razítka (komunikující strany nemají synchronizované hodiny). Navíc je možné, že jedna strana (případně obě) má hodiny nastavené úplně špatně. To je bohužel skutečnost, se kterou se bez sofistikované časové synchronizace nedá nic dělat. Na tyto časové údaje se tedy nedá spoléhat, plní zde spíše jakousi informativní funkci (pokud se například posunou hodiny komunikujícího partnera o větší časový úsek nazpět oproti předchozí komunikaci, může se jednat o nějaký útok přehráním atp.).

Autentizace jedné strany

Pokud se před začátkem přenosu autentizuje pouze Bob Alici, komunikace vypadá následovně:

  • A -> B: tA, rA, nameA@machineA, nameB@machineB
  • B -> A: tB, Hk(tA, tB, rA, nameB@machineB, nameA@machineA)

Použité symboly mají následující významy:

  • tA – Časový údaj strany A. Údaj tvoří jedno číslo, které má podobu unix_time.qqqqqq, kde první část tvoří unixový čas (tedy počet vteřin od 1. ledna 1970) a qqqqqq udává počet mikrosekund.
  • rA – Pseudonáhodné číslo strany A délky 8 bajtů (tj. číslo v rozmezí 0 až 264-1).
  • nameA@machineA – Označení komunikující strany. nameA může být například login nebo plné jméno (ve formátu například Jmeno_Prijmeni bez mezery mezi slovy). Vzhledem k tomu, že jména budou používána jak v unixových systémech tak i v systémech Windows, je lepší se vyvarovat znaků z národních abeced a vystačit si se standardními ASCII znaky. machineA je jméno stroje v podobě například host1.somewhere.net.
  • Hk – Autentizační kód s klíčem k. V systému bude použit autentizační kód typu HMAC. Klíč je symetrický a obě strany jej sdílejí.

Autentizace obou stran

Pokud se před začátkem přenosu autentizují vzájemně obě strany, jejich komunikace pak bude vypadat následovně:

  • A -> B: tA, rA, nameA@machineA, nameB@machineB
  • B -> A: tB, rB, nameB@machineB, nameA@machineA, Hk(tB, tA, rB, rA, nameB@machineB, nameA@machineA)
  • A -> B: Hk(tA, tB, rA, rB, nameA@machineA, nameB@machineB)

Autentizace dat po dokončení jejich přenosu

Vlastní protokol autentizace dat po dokončení jejich přenosu vypadá podobně, jako protokol zajišťující autentizaci komunikujících stran. Pouze jsou v autentizačním kódu započítávána i přenášená data.

Jednostranná autentizace dat

Při provádění jednostranné autentizace dat provádí výpočet autentizačního kódu jenom jedna strana a po dokončení výpočtu tento kód zašle straně druhé.

Protože se při autentizaci dat bude jednat o stále stejné TCP spojení jako při autentizaci uživatelů a hodnoty náhodných čísel a časových údajů použitých při autentizaci uživatelů nebyly v žádné předchozí komunikaci použity pro autentizaci dat, je možné je zde použít. Ušetří se tím režie potřebná pro jejich zasílání.

  • B -> A: tB, Hk(data, tA, tB, rA, nameB@machineB, nameA@machineA)

Oboustranná autentizace dat

Protokol oboustranné autentizace dat po dokončení jejich přenosu je prováděn analogicky jako při jednostranné autentizaci. Autentizační kód ovšem počítají obě strany a po přenosu dat si své kódy vymění.

  • B -> A: Hk(data, tB, tA, rB, rA, nameB@machineB, nameA@machineA)
  • A -> B: Hk(data, tA, tB, rA, rB, nameA@machineA, nameB@machineB)

Pomocné soubory

Secure-netrw bude ke své činnosti využívat některé pomocné soubory. Soubory budou uloženy v adresáři $HOME/.netrw každého uživatele. Tento adresář musí mít nastavena práva čtení, přístupu a zápisu pouze pro jejich vlastníka, aby citlivý obsah souborů v něm obsažených nemohl číst (či dokonce modifikovat) někdo nepovolaný. Stejně tak samotné tyto soubory musí mít nastavena práva pro čtení a zápis pouze pro vlastníka.

Musí být také nějakým způsobem omezena maximální velikost těchto souborů (to se netýká souboru keys, viz dále). Po přesáhnutí této velikosti se ze souborů budou automaticky vymazávat nejstarší položky.

U pomocných souborů rand a prev by se mohlo stát, že v případě, kdy by nějaký útočník získal právo zápisu do těchto souborů, mohl by je naplnit falešnými údaji nebo případně ze souboru prev odstranit údaje o předchozí komunikaci a využít toho k nějaké variantě útoku přehráním předchozí komunikace (viz popis obsahu souboru prev v dalším textu). Proto budou tyto dva soubory obsahovat autentizační kód, který bude počítán z jejich obsahu. Jako klíč bude použito globální heslo uživatele. Při každém čtení údajů z těchto souborů bude prováděna kontrola jejich integrity a při každém zápisu bude jejich autentizační kód přepočítáván.

Soubor rand

Tento soubor obsahuje u Alice položky ve tvaru

<autentizační kód>
rA1
rA2
rA3

kde rAi jsou pseudonáhodná čísla, která uživatel během předchozí činnosti používal. Každé nově vygenerované pseudonáhodné číslo je porovnáváno s čísly v tomto souboru. Pokud již bylo toto číslo použito dříve, vygeneruje se nové.

Soubor prev

V tomto souboru jsou ukládány položky ve tvaru

<autentizační kód>
rA1 jmenoB@strojB tB1 rB1
rA2 jmenoC@strojC tC1 rC1
rA3 jmenoB@strojB tB2 rB2
rA4 jmenoD@strojD tD1 rD1

Tento soubor obsahuje historii dřívější komunikace (autentizace).

Při komunikaci s Bobem provádí Alice následující testy:

  • Pokud je hodnota přijatého tB menší nebo rovna hodnotě největšího tBn uloženého v souboru, odmítni spojení, protože se může jednat o útok.
  • Pokud je hodnota přijatého rB stejná, jako hodnota některého rBi, rCi, v souboru, vyžádej si nové rB.

Samozřejmě se může stát, že Bob si od doby poslední komunikace s Alicí přenastavil na svém počítači hodiny o nějaký čas nazpátek. Od tohoto okamžiku jej však bude při každém pokusu o spojení s ním považovat Alice za útočníka. Tomu lze zabránit buď smazáním Bobových záznamů z Alicina souboru prev nebo přepínačem, který Secure-netrw obsahuje a který způsobuje, že informace ze souboru prev nebudou brány v potaz.

Soubor keys

Aby si nemusel uživatel pamatovat všechna hesla pro komunikaci se svými partnery, je vhodné uložit je do nějakého souboru. Zároveň je možné uložit do tohoto souboru „základní“ port, tj. port, přes který bude probíhat komunikace, pokud nebude explicitně zadán port jiný. Položka portu je volitelná.

Tento způsob je ale velmi nebezpečný. Pokud by dokázal útočník získat tento soubor, získá tím zároveň i všechna hesla v otevřené podobě. Proto musí být tato hesla uložena v zašifrované podobě.

Velmi vhodná pro tento účel je symetrická šifra AES. Platí dnes prakticky za standard symetrického šifrování. Je založena na algoritmu Rijndael.

Ten pracuje s bloky délky 128 bitů, tj. 16 bajtů. Nabízí se tedy omezit maximální délku šifrovaného hesla na tuto hodnotu, aby stačilo pro jeho zašifrování zpracovat pouze jeden blok. AES dovoluje pro šifrování používat klíče délky 128, 192 a 256 bitů. Protože šifrovaná data budou mít délku 128 bitů, budou mít tuto délku i klíče.

Heslo však bývá většinou kratší (délka hesla se typicky pohybuje okolo 8 znaků, tedy 64 bitů). Je tedy nutné expandovat toto heslo na klíč požadované délky. K tomu slouží expanzní funkce. Ty „roztáhnou“ heslo tak, že jeho efektivní délka se zvětší na požadovaný počet bitů. Je důležité, aby expanzní funkce fungovala správně a neměla žádné slabiny, kterých by mohl útočník využít při pokusu o prolomení klíče (tj. slabiny, pomocí kterých je možno snížit efektivní délku takto vytvořeného klíče).

Globální heslo, pomocí kterého se budou šifrovat ostatní, sdílená hesla, musí být také nějak uloženo, aby bylo možné kontrolovat, zda uživatelem zadané heslo je správné. Z výše uvedených důvodů nemůže být heslo uloženo v souboru přímo. Protože samotné heslo uživatel při každé komunikaci zadává ručně, pro kontrolu jeho správnosti postačí, když bude uložena pouze jeho hash. Pro její výpočet se bude používat algoritmus SHA-1, který je v dnešní době považován za bezpečný. Hash bude uložena vždy na prvním řádku souboru keys (samozřejmě pouze v případě, že heslo již bylo uživatelem zadáno).

Další hodnotou, kterou je potřeba uložit v nějakém souboru, je jméno, pod kterým bude klient vystupovat při komunikaci. Vytvářet kvůli němu zvláštní soubor by znamenalo zbytečnou režii (otevírání a zavírání souboru). Proto bude hodnota jména uložena taktéž v souboru keys. Bude vždy v 1. řádku tohoto souboru. Jméno bude tvořit posloupnost znaků bez mezer, která neobsahuje znak @. Při prvním spuštění programu bude do souboru uložen aktuální login uživatele a bude používán jako jeho jméno do té doby, než si své jméno uživatel nastaví sám.

Konečná podoba souboru keys tedy vypadá následovně:

jméno hash(globální heslo)
jménoB@strojB šifra(hesloAB) port_1
jménoC@strojC šifra(hesloAC)
jménoD@strojD šifra(hesloAD) port_2

Použité nástroje

Secure-netrw používá následující externí knihovny a nástroje:

  • mhash – Knihovna poskytující hashovací funkce, autentizační kódy a funkce pro expanzi hesel na klíče. Z této knihovny budou využity funkce implementující autentizační kódy založené na hashovacích funkcích SHA-1, SHA-256, RIPEMD-160 a TIGER-160. Dále bude využita funkce pro expanzi hesla na klíč. Pro běh Secure-netrw je nutné, aby byla tato knihovna nainstalována v systému.
  • AES – Knihovna implementující algoritmus symetrického šifrování. Zdrojové texty této knihovny jsou vloženy do zdrojových textů Secure-netrw, takže se tato knihovna nemusí instalovat do systému.

Parametry Secure-netrw

netread a stejně tak i netwrite obsahuje všechny funkce a přepínače obsažené v původním programu Netrw. Nově obsažené přepínače jsou následující:

netread -a name@machine [-A mode] [-x] [-m hmac] [-f] [port]
netread -n name@machine [port]
netread -d name@machine
netread -t machine
netread -k
netread -e name
netread -E
netread -g

Všechny výše vypsané přepínače akceptuje i netwrite. Následuje popis těchto přepínačů:

  • -a name@machine – Při spojení s uživatelem označeným name na počítači machine bude vyžadována oboustranná autentizace uživatelů před začátkem přenosu. Po přenesení dat bude provedena oboustranná autentizace těchto dat. Způsob autentizace lze změnit pomocí následujícího (nepovinného) přepínače:
  • -A mode – Při spojení s druhou stranou bude, v závislosti na hodnotě mode, použit následující způsob autentizace uživatelů před začátkem přenosu dat a vlastních dat po dokončení jejich přenosu:
    • -A none – zakáže jakoukoliv autentizaci;
    • -A allowed – nevyžaduje žádnou autentizaci, ale umožňuje provést autentizaci druhé straně, pokud o autentizaci požádá;
    • -A you_only – požaduje autentizaci druhé strany a od druhé strany vyžaduje po přenosu dat jejich autentizační kód, ale zakazuje autentizaci sama sebe a zasílání vlastního MACu;
    • -A you – požaduje autentizaci druhé strany a autentizační kód od druhé strany a umožňuje druhé straně ověřit svou autenticitu;
    • -A both – chová se stejně, jako by nebyl přepínač -A vůbec použit, tj. požaduje oboustrannou autentizaci.

    Nejbezpečnější je samozřejmě oboustranná autentizace uživatelů i dat. Po provedení autentizace uživatelů se nepřenášejí zbytečně data podvržená útočníkem. Po výměně autentizačních kódů má příjemce jistotu, že data jsou autentická a odesílatel se zase ujistí, že data obdržel správný příjemce.

    V následující tabulce je uvedeno, které autentizační módy jsou vzájemně kompatibilní.

    × none allowed you_only you both
    none ano ano ne ne ne
    allowed ano ano ano ano ne
    you_only ne ano ne ne ne
    you ne ano ne ano ne
    both ne ne ne ne ano
  • -x – Tento přepínač způsobí, že budou ignorovány záznamy v souboru prev. Tak je možné komunikovat i s partnerem, který si pozměnil čas na svém počítači směrem dozadu a kvůli záznamu předchozí komunikace je považován za útočníka. Rovněž není prováděna kontrola integrity autentizačních kódů u souborů prev a rand. Této volby by mělo být používáno uvážlivě.
  • -m hmac_alg – Určuje algoritmus, který bude použit při počítání autentizačního kódu. Vybírat je možno mezi následujícími autentizačními kódy: sha1, sha256, ripemd160 a tiger160. Standardně je použit algoritmus sha1. Pokud se požadavky obou stran liší, je použita volba požadovaná klientem netread.
  • -f – Tato volba spouští tzv. firewall mód, který způsobí, že spojení nenavazuje netwrite, ale netread.
  • port – Tato položka určuje, na jakém portu bude navázáno spojení.
  • -n name@machine – Přidá záznam o uživateli označeném name na počítači machine do souboru keys. Uživatel je poté interaktivně dotázán na heslo pro komunikaci s tímto uživatelem, které se poté zašifruje (pomocí hesla globálního, na které je uživatel opět dotázán). Pokud je zadán port, je číslo portu uloženo a bude používáno jako výchozí.
  • -d name@machine – Odebere zadanou položku ze souboru keys.
  • -t machine – Odebere ze souboru prev všechny záznamy příslušící počítači machine. Tato volba slouží pro případ, kdy se na tomto počítači změní čas směrem zpět a z tohoto důvodu s ním klienti mající uloženy soubory s předchozí komunikací odmítají ustanovit spojení kvůli špatnému časovému údaji.
  • -k – Tato volba vypíše všechny položky ze souboru keys spolu s případným výchozím portem.
  • -e name – Nastaví jméno aktuálního uživatele, pod kterým bude komunikovat s ostatními stranami a uloží ho do souboru keys.
  • -E – Vypíše nastavené jméno aktuálního uživatele uložené v souboru keys.
  • -g – Pomocí této volby se zadává hodnota globálního hesla. Pokud bylo globální heslo zadáno již dříve, je uživatel nejprve dotázán na starou hodnotu. Poté zadá hodnotu nového globálního hesla (dvakrát, pro potvrzení). Potom je nová hodnota hesla uložena v zahashované podobě do souboru keys. Následně se provede překódování všech položek v tomto souboru pomocí nového hesla. Zároveň se přepočítají i autentizační kódy v souborech rand a prev.

Implementace

Spojení s druhou stranou navazuje standardně netwrite. Pouze pokud je zapnut firewall mód, navazuje spojení netread. Jak ale vypadá situace dále, když je spojení navázáno? Zde je jeden konkrétní příklad, jak komunikace může vypadat:

  1. netread -> netwrite : netrw control protocol
    netread -> netwrite : requested params: checksum
    netread -> netwrite : checksum: rmd160, md5, sha1
    netwrite -> netread : netrw control protocol
    netwrite -> netread : checksum: sha1
  2. přenos dat
  3. netwrite -> netread : netrw control protocol
    netwrite -> netread : checksum(sha1) : c2f7ce0398c69a167b35e839ceb2084cc167eb57
  4. netread -> netwrite : netrw control protocol
    netread -> netwrite : checksum(sha1): c2f7ce0398c69a167b35e839ceb2084cc167eb57

V původní verzi Netrw zasílá jako první svá pomocná data vždy netread. netwrite tato data zpracuje a zašle svou odpověď. Proto je i protokol pro autentizaci koncipován tak, aby zachovával toto uspořádání.

Komunikace je uvozena frází netrw control protocol. Poté zašle netread frázi requested params:, která uvozuje seznam parametrů, jež netread požaduje od druhé strany. Dále jsou zaslány hodnoty parametrů, které netread posílá druhé straně. Odpověď druhé strany má stejnou strukturu. Ve stávající podobě je do protokolu implementována pouze výměna informací o tom, které hashovací algoritmy má která strana k dispozici a po skončení přenosu dat se provede výměna hodnot hashí.

Použitý protokol je navržen natolik obecně, že je možné jej v principu využít dále a pouze do něj doplnit nové vlastnosti, tj. dohodu obou stran na použitém algoritmu pro výpočet autentizačního kódu, dohodu o způsobu autentizace uživatelů před samotným přenosem dat a výměnu autentizačních kódů po skončení přenosu dat.

Komunikace pomocí komunikačního protokolu pak bude vypadat podobně jako v následující ukázce:

  1. netread -> netwrite : netrw control protocol
    netread -> netwrite : auth_type: you
    netread -> netwrite : hmac_alg: sha1 sha256 ripemd160 tiger160
    netread -> netwrite : time: 1094834140.866685
    netread -> netwrite : rand: 15464947654308140132
    netread -> netwrite : name_nw: host2.somewhere.net
    netread -> netwrite : name_nr: host1.somewhere.net
  2. netwrite -> netread : netrw control protocol
  3. Možná (několikanánobná) výměna nového náhodného čísla:
    • netwrite -> netread : requested_params: rand
    • netread -> netwrite : rand: 10923986926823690823
  4. netwrite -> netread : auth_type: allowed
    netwrite -> netread : hmac_alg: sha1
    netwrite -> netread : time: 1094834141.258439
    netwrite -> netread : hmac: ce02cceb2081673e8398edf655c569ab5fdcaf2b

V tomto případě netread požaduje autentizaci druhé strany a umožňuje druhé straně svou autentizaci. netwrite autentizaci nepožaduje, pouze poskytuje svou.

Obě strany se domluví na použitém algoritmu pro výpočet autentizačního kódu a vymění si potřebné informace jako aktuální čas, náhodné číslo atd. Po obdržení nevyhovujícího náhodného čísla (tj. náhodného čísla použitého již při některé předchozí autentizaci) od komunikujícího partnera si může klient vyžádat (i několikrát po sobě) zaslání nového náhodného čísla. Poté se provede (jednostranné nebo vzájemné) zaslání spočítaného autentizačního kódu. Pokud proběhne ověření zaslaných kódů bez chyby, je možné přikročit k vlastnímu datovému přenosu. Po dokončení přenosu dat se provede jejich autentizace a informace o ní se opět přenesou pomocí autentizačního protokolu.

Podrobný popis komunikačního protokolu (obsahující popis komunikace při autentizaci uživatelů i při autentizaci dat včetně popisu všech zasílaných zpráv) je obsažen v mé diplomové práci.

Příklady použití Secure-netrw

V této části práce bude uvedeno několik typických příkladů použití Secure-netrw s různými typy autentizace.

Přenos dat bez autentizace

Tento příklad ukazuje základní použití Secure-netrw: přenos souboru z jednoho počítače na druhý bez použití autentizace uživatelů i dat. Pro přenos je použit port 50000. Tento způsob je možné použít jak na unixových systémech, tak i na systémech Windows:

Netread:
netread 50000 -o data.zip
 
Netwrite:
netwrite -i data.zip machine2.somewhere.net 50000

Spojení standardně navazuje netwrite. Pokud je z nějakého důvodu potřeba, aby spojení navázal netread, použije se parametr -f:

Netread:
netread -f -o data.zip machine1.somewhere.net 50000
 
Netwrite:
netwrite -f -i data.zip 50000

Pokud je potřeba přenést více souborů najednou, je možné (pouze na unixových systémech) použít program tar:

Netread:
netread 50000 | tar xf -
 
Netwrite:
tar cf - | netwrite machine2.somewhere.net 50000

Přenos dat za použití autentizace

Před prvním použitím autentizace musí každý uživatel nejdříve nastavit své globální heslo a případně i své jméno. Poté může uložit do konfiguračního souboru údaje o svém komunikačním partnerovi: jeho jméno, jméno jeho stroje a případně i port, na kterém bude standardně navazováno spojení. Zároveň s těmito údaji se do konfiguračního souboru uloží i heslo pro provádění autentizace s tímto uživatelem. Heslo je zašifrované pomocí globálního hesla, takže později při provádění autentizace u kteréhokoliv uživatele stačí zadávat pouze jedno globální heslo. Poté se již může provést například oboustranná autentizace uživatelů a dat:

Netread (Bob):
netread -g
netread -e bob
netread -n alice@machine1.somewhere.net 50000
netread -a alice@machine1.somewhere.net -o data.zip
 
Netwrite (Alice):
netwrite -g
netwrite -e alice
netwrite -n bob@machine2.somewhere.net 50000
netwrite -a bob@machine2.somewhere.net -i data.zip

Stejně jako v případě bez použití autentizace je možné použít firewall mód:

Netread (Bob):
netread -a alice@machine1.somewhere.net -f -o data.zip
 
Netwrite (Alice):
netwrite -a bob@machine2.somewhere.net -f -i data.zip

Pokud chceme použít pro výpočet autentizačního kódu jiný algoritmus než výchozí SHA-1, například RIPEMD-160, provede se to takto (algoritmus vybírá uživatel na straně netread):

Netread (Bob):
netread -a alice@machine1.somewhere.net -m ripemd160 -o data.zip
 
Netwrite (Alice):
netwrite -a bob@machine2.somewhere.net -i data.zip

Pokud Alice na straně odesílatele požaduje Bobovu autentizaci a svou autentizaci si přeje zakázat, dá se to zařídit takto:

Netread (Bob):
netread -a alice@machine1.somewhere.net -A allowed -o data.zip
 
Netwrite (Alice):
netwrite -a bob@machine2.somewhere.net -A you_only -i data.zip

I při použití autentizace je samozřejmě možné přenést na unixových systémech více souborů (nebo i adresářů s jejich obsahem) za pomoci nástroje tar:

Netread (Bob):
netread -a alice@machine1.somewhere.net | tar xf -
 
Netwrite (Alice):
tar cf - | netwrite -a bob@machine2.somewhere.net

Pokud při testování autentizačních vlastností Secure-netrw použije uživatel pro spouštění netread i netwrite stejný účet na jednom počítači, může se stát, že se oba programy „zaseknou“. Toto chování spočívá ve výměně náhodných čísel. Jeden klient vygeneruje své náhodné číslo, zapíše jej do pomocného konfiguračního souboru rand a zašle druhé straně. Druhý klient ovšem obdržené číslo porovnává s náhodnými čísly zapsanými ve svém souboru rand. Pokud je ovšem tento soubor pro oba klienty společný, příjemce vždy obdržené číslo v souboru nalezne, a tudíž bude stále od svého partnera vyžadovat nová a nová náhodná čísla.


DownloadReadmeChangelog – Detailní popis

Žádné komentáře »

No comments yet.

Leave a comment



Copyright © 2009–2015 David Cimbůrek, david.cimburek (at) gmail.com