Nj, tatar kterej netusi jak funguje cache a navic neumi cesky, takze nemilej tatare, pokud si dns ulozi neco do cache, tak to dela proto, aby pri dalsim dotazu nemusel cekat na odpovedi autoritativnich dns serveru a tudiz se jich vubec nepta, kdyz v cache odpovidajici zaznam najde.
Člověk by řekl, že když se na téma DNSSEC někdo jednou pořádně historicky znemožní, že si to pak aspoň do příště nastuduje. Jenomže to by pak nezbyl čas urážet ostatní, že?
To právě nejde. To by byl downgrade attack a tomu se musí návrh bezpečnostní technologie vyhnout.
Pokud není zóna podepsaná, musí to nadřazená zóna deklarovat v podepsané zprávě. Tedy CZ.NIC řekne buď:
a) zónu spravuje server ns.nekde.cz a všechny odpovědi musí být podepsány tímto klíčem
b) zóna není podepsaná
Ale obě zprávy jsou podepsané klíči CZ.NIC. Taky se to podvrhnout nedá.
Asi budu muset napsat nějaký hodně zjednodušující článek (blogpost) o tom, jak funguje DNSSEC.
Tohle ale stavi na tom, ze se mi nikdy nepodari vlozit do cache zaznam, klidne i totozny, ale bez podpisu.
Mne by jen zajimalo, kdyz uz tedy lze vlozit do cache obecne podvrzeny zaznam, proc toto nelze kdyz to na prvni pohled vypada uplne stejne (a zaroven stavim na tom, ze co uz mam v cache, na to se ven neptam).
Protože cache se obvykle otráví tak, že se k odpovědi přidá GLUE záznam s matoucí informací. Je to jako přílepek k zákonu, prostě útočník odpoví a k tomu dodá: „Jo a o doménu Google.cz se stará falesnyserver.cz“. Ovšem pokud je Google.cz podepsaná zóna, musela by být i tahle informace podepsaná. Pokud není, pak se má zahodit.
Samozřejmě je možné, že některé rekurzivní servery jsou špatně implementované a podaří se jim tam tu informaci nějak propašovat, ale to je jednoznačně bezpečnostní chyba a je třeba ji opravit. Ovšem není to principiální problém v návrhu DNSSEC.
Kořenová zóna už nějaký ten pátek podepsaná je. Zóny nepodepsané DNSSECem samozřejmě DNSSECem chráněné nejsou. Ale zóny podepsané jím chráněné jsou a uživatel má možnost je ověřit, i když bude cache vracet libovolné podvržené nepodepsané záznamy. Protože kořenovou zónu se cache podvrhnout nepodaří.
Celou dobu se bavíme o případu, kdy klient ověřuje. Nikdo jiný, než klient, pak ověřovat nemusí - klient si ty záznamy ověří sám. Pokud by cache dostala podvržený záznam, neověřila ho a poslala dál, klient, který ověřuje, ten podvrh stejně zjistí.
Při ověřování DNSSEC se každý záznam ověřuje oproti údajům v nadřízeném záznamu. Kde případně musí být i uvedeno, že ten podřízený záznam není podepsaný. cache vám sice může podvrhnout i nepodepsaný ten nadřízený záznam, ale tímhle způsobem se jednou dostanete ke kořenové zóně, ale každý, kdo ověřuje DNSSEC, ví, že kořenová zóna je podepsaná a ví, jakým klíčem. Takže tenhle údaj už DNS cache ověřujícímu klientovi podvrhnout nedokáže, a nejpozději v tomhle okamžiku ověřovatel zjistí, že je něco špatně, a prohlásí tu celou strukturu pod tím za neověřenou.
Zjednodusene receno: do cache lze vlozit pouze odpoved na dotaz. Pokud mam validujici nameserver, tak do cache vlozi jen odpoved, ktera projde validaci. To znamena, ze pokud chces vlozit zaznam "a.b.c.d.e" tak mas 3 moznosti:
1. Validujici nameserver ma v cache, ze "a.b.c.d" je nepodepsane, pak muzes vlozit cokoli.
2. Validujici anemserver ma v cache, ze "a.b.c.d" rika, ze "a.b.c.d.e" neni podepsano. Pak muzes vlozit jiny zaznam (nesmi byt podpesany).
3. Validujici nameserver ma v cache, ze "a.b.c.d" rika, ze "a.b.c.d.e" je podepsano tak a tak. Pak muzes vlozit pouze takovy zaznam, ktery je podepsany tim podpisem, ktery uvedl "a.b.c.d".
Takze pokud chces podvrhnout "a.b.c.d.e" a nejses schopen zaznam spravne podepsat, tak musis podvrhnout i "a.b.c.d", "a.b.c", "a.b", "a" a nakonec i root zaznamy a jejich podpisy (ktere jsou nejspis nekde nainstalovane v systemu).
Pokud zóna není podepsaná, pak samozřejmě je možné měnit si ve vzduchu informace libovolně a rekurzivní server uživatele nemá jak ověřit, zda jsou změněné nebo ne. Je to jako s nepodepsaným mailem. Nepodepsáno = nechráněno.
Ovšem pokud už zóna podepsaná je, je o tom záznam v nadřazené zóně (třeba v .cz) a jsou tam i klíče, se kterými musí přijít odpovědi od autoritativního serveru té zóny. Nelze pak prohlásit, že zóna není podepsaná, protože to by musel udělat nadřazený server.
Příklad: Když se zeptám autoritativního serveru pro doménu .cz na doménu Root.cz, dostanu odpověď, že se mám dál ptát na autoritativních serverech ns.iinfo.cz a ns6.adminit.cz a je mi předán veřejný klíč, který pasuje k privátnímu klíči, kterým musí být odpovědi od těch dvou serverů podepsané.
to mi je jasne, ale skor otazka plynula smerom - ked uz niekto moze ovplyvnit a podvrhnut zaznam o domena.cz, ci nemoze podvrhnut aj TLD zonu cz a prehlasit ju za normalnu - nepodporujucu dns sec.
Priklad - deravy router prevadzkujuci dns cache, za nim siet uzivatelov. Uzivatelia maju system ktory podporuje dns sec, ale o tom ze zona cz ju podporuje sa nikdy nedozvedia.
Tak ještě jednou a o úroveň výš. Pokud by chtěl někdo prohlásit TLD zónu cz za nepodepsanou, musel by do kořenové zóny umístit podespanou informaci, že TLD cz je nepodepsaná, tedy musel by nějak získat privátní klíč kořenové zóny.
Abych předešel další iteraci dotazu, tak prohlásit kořenovou zónu za nepodepsanou není možné, protože validátor DNSSEC si s sebou nese informaci o tom, že kořenová zóna je podepsaná a také otisk jejího klíče. Takže neuvěří žádné informaci, která by naznačovala, že kořenová zóna podepsaná není.
V současné době se používá RSA/SHA-256 s 2048bitovým klíčem. Když se to ukáže jako nedostatečné, neměl by být problém klíč vyměnit. Výměna je vymyšlena tak, že validátory by si jí samy měly všimnout a aktualizovat si pevný bod důvěry (informace o něm bude podepsána starým klíčem). Samozřejmě ale systémy, které budou během výměny klíče dlouhodobě vypnuté, nebo nebudou mít zapisovatelné uložiště, změnu kořenového klíče bez ručního zásahu nepřežijí. To je taky důvod, proč se do výměny klíče kořenové zóny nikomu moc nechce :)
Asi budu fakt otravny, ale stejne.
Takze pokud se do cache validujiciho resolveru dostane zaznam "legalni" cestou (pricemz se bere ze otraveni cache resolveru je legalni cestou, t.j. v odpovedi od tazaneho*), tak nez si jej resolver ulozi do cache, tak si vzdy (duraz na "vzdy") probehne cely retez podpisů od korenove zony az po podepsany zaznam nebo podepsanou informaci ze zona, klidne i jedna z nadrazenejsich, neni podepsana a to cele bez ohledu na to jestli zaznam podepsany je ci neni (duraz na to "neni")? Pokud ano, tak uz to dava vetsi smysl.
Ono se mozna lehce kouli ocima, ale bud byva popis DNSSEC tak strucny ze tam tahle informace neni, nebo naopak tak podrobny, ze se tam ztrati. Nebo tam take neni (nemuzu dolozit zda skutecne neni nebo jsem to vzdycky prehledl v kazdem clanku o DNSSEC, ktery jsem kdy cetl), protoze se obvykle probiraji pouze zony ktera jsou podepsany (at uz validne nebo nevalidne).
*) kde tazany muze byt podvrzeny.
Pakliže je cache validátoru prázdná, pak se skutečně ověřuje celý řetěz až ke kořenové zóně. Ověřené informace se samozřejmě kešují, takže přijde-li později dotaz například na jinou doménu ve stejné TLD, už není třeba znovu ověřovat jestli ta TLD má nebo nemá být podepsaná a ověřuje se pouze ta část stromu, která dosud v cache není.
Tak jeste jednou, nebot se nam do toho plete kesovani, o kterem jsem se ani moc bavit nechtel.
Mam DNS zaznam, ktery _neni_ podepsany (resp. to v tu chvili ani nevim). Jde validujici cache resolver pres cely retez podpisu, pocinaje korenovym (a dopredu znamym), az po _podepsanou_ informaci ze zaznam skutecne neni podepsany?
Můžete si to vyzkoušet i sám pomocí utility unbound-host (dodává se s unboundem). Nejdřív se provede vlastní resolving, a pak se jede znovu od kořene a validuje se DNSSEC podpis.
Nepodepsaný je například google.cz:
$ unbound-host -d -f /etc/unbound/root.key google.cz … [1410876360] libunbound[26360:0] info: response for google.cz. A IN [1410876360] libunbound[26360:0] info: reply from <google.cz.> 216.239.32.10#53 [1410876360] libunbound[26360:0] info: query response was ANSWER [1410876360] libunbound[26360:0] info: prime trust anchor [1410876360] libunbound[26360:0] info: resolving . DNSKEY IN … 1410876360] libunbound[26360:0] info: validate keys with anchor(DS): sec_status_secure [1410876360] libunbound[26360:0] info: Successfully primed trust anchor . DNSKEY IN [1410876360] libunbound[26360:0] info: validated DS cz. DS IN [1410876360] libunbound[26360:0] info: resolving cz. DNSKEY IN … [1410876360] libunbound[26360:0] info: validated DNSKEY cz. DNSKEY IN [1410876360] libunbound[26360:0] info: NSEC3s for the referral proved no DS. [1410876360] libunbound[26360:0] info: Verified that unsigned response is INSECURE …
Pokud je ten DNS overujici a klient neoveruje tak to muze byt mozne (server muze cachovat i informaci, ze a.b.c.d uz zvalidoval a pouzit ji pri validovani a.b.c.d.e). Nicmene jak jiz nekdo psal, takovy zapis by byl mozny jen v dusledku bezpecnostni diry v programu nebo systemu (nebo zvolenim nevhodne sifry v protokolu, ale v navrhu postupu jak overovat DNSSEC chyba neni).
Pokud klient overuje, tak zjisti nesrovnalost pro domenu CZ (protoze zaznam pro domenu CZ musi byt podepsany klicem k root domene) a mel by zakazat pristup (nebo zobrazit varovani) pro vsechno v domene CZ.
Ano, validující klient (klidně cache resolver) bude postupovat od kořene. Ten ověří podle klíče, který zná. TLD ověří podle klíče z kořenové zóny atd. Takhle postupně postupuje k doménám vyššího a vyššího řádu. Buď takhle dojde až k záznamu, který potřeboval získat, pak ví, že je ten záznam platný. Nebo skončí někde dřív, protože pro podřízenou doménu není v nadřazené doméně klíč. Tak věrohodně zjistí, že daná doména není podepsaná a dál nevaliduje. Pokud by někde během té validační cesty narazil na záznam s neplatným podpisem, vyhodnotí celý řetězec jako neplatný a tomu, kdo DNS dotaz vyvolal, vrátí informaci, že požadovaný záznam neexistuje.
Diky moc.
Tahle informace mi celou dobu chybela.
Vzdycky se totiz v popisech o DNSSEC resi jestli podpis sedi, ale o nepodepsanych zonach (a jejich zaznamech) se moc nepise coz mne vzdy privadelo k zaveru, ze u nepodepsanych zon se resolver chova tak jako v situaci bez DNSSEC (a tedy k zaveru, ze DNSSEC toho zase tak moc neresi).
A jak asi tak ten srv zjisti, ze (ne)komunikuje s nicem ... uplne vpohode muzu nahradit cely DNS strom, a libovolny DNS resolver to naprosto v klidu akceptuje.
Nehlede na to, ze sem jeste nevidel resolver, kterej by zkoumal, jestli nahodou domena ma nebo nema byt podepsana, kdyz dostane nepodepsanou odpoved.
Vubec nemluve o tom, ze znam i dns, ktery maji podepsany svoje zaznamy, ale nemaji vydistribuovane klice ... trebas proto, ze jejich registrator to proste neumi. A taky jim to kupodivu funguje.
Nehlede na to, ze sem jeste nevidel resolver, kterej by zkoumal, jestli nahodou domena ma nebo nema byt podepsana, kdyz dostane nepodepsanou odpoved.
Doporučuji podívat se po nějakých validujících resolverech, jako třeba BIND nebo Unbound. Pokud u nich validaci zapnete, rozhodně to zkoumat budou.
Vubec nemluve o tom, ze znam i dns, ktery maji podepsany svoje zaznamy, ale nemaji vydistribuovane klice ... trebas proto, ze jejich registrator to proste neumi. A taky jim to kupodivu funguje.
Na tom není nic zvláštního, nedůvěryhodně podepsaná zóna není o nic méně bezpečnější než nepodepsaná zóna.
aka potom plynie vyhode pre koncoveho uzivatela? Dozvie sa niekedy pri pouzivani sluzieb ako pop3/imap/smtp/http/https o tom ze server ku ktoremu sa pripaja je podpisany dns sec klucom ale tento nesedi? Ak nesedi tak asi len kvoli dvom veciam:
1. niekto to pokaslal a mal by to opravit asap
2. zaznam je podvrhnuty a uzivatela zamerne smeruje inde nez uzivatel mysli ze smeruje (bezpecnostna hrozba)
Logicky by som predpokladal ze ak je domena podpisana a neprejde validacia dnssec tak ten zaznam ako keby neexistoval - a nie ze ho len spravne nastavene dns servery nebudu kesovat
Současný stav je takový, že pokud podpis nesedí, validující DNS server vrátí stavový kód SERVFAIL, což stub resolver vyhodnotí jako že doména neexistuje, takže uživatel nemá možnost rozlišit mezi stavem, kdy doména opravdu neexistuje a stavem kdy existuje, ale nevaliduje. To je ale spíš rychlý způsob, jak pomocí DNSSEC rychle ochránit co největší množství služeb, ale přitom je nemuset nijak upravovat.
V ideálním finálním případě DNSSEC validaci bude podporovat přímo koncová aplikace typu WWW prohlížeče a namísto informace „server nenalezen“, rovnou předá informaci „server byl podvržen“.
Člověk by řekl, že když se na téma DNSSEC někdo jednou pořádně historicky znemožní, že si to pak aspoň do příště nastuduje. Jenomže to by pak nezbyl čas urážet ostatní, že?
Takže vy úplně v pohodě nahradíte celý DNS strom, a kořen podepíšete privátním klíčem, k němuž příslušný veřejný klíč má každý klient ověřující DNSSEC uložený u sebe a proti němuž kontroluje podpis kořenové zóny. Zapomněl jste uvést jenom jeden takový nepatrný detail - jak se k tomu pravému privátnímu klíči dostanete?
To, že jste ještě neviděl resolver validující DNSSEC, je z vašich komentářů patrné.
To, že má někdo podepsanou zónu, ale nemá v nadřazené doméně zveřejněné klíče, ničemu nevadí. Akorát tu jeho zónu nelze validovat DNSSECem, pokud klient nemá u téhle domény klíče speciálně uložené. Tak se validovalo dříve, když ještě nebyla podepsaná kořenová doména - klient měl u sebe poznamenané, že třeba TLD .cz používá ten a ten klíč, a nepotřeboval tedy tuhle informaci získávat z DNS stromu.
Nezapomínejme že "validace DNSSEC na straně uživatele" je věc která výborně funguje v laboratořích ale naprosto selhává v praxi, rozhodně to dělá mnohem méně než 1% reálných uživatelů.
Jako mnohem praktičtější řešení vidím standardní aplikaci bezpečnostních patchů na DNS servery které znemožní otravování cache, to je mnohem jednodušší řešení než implementace striktně validujícího DNSSEC.
To, že to nefunguje teď, ještě neznamená, že to nemůže fungovat nikdy. S postupnou aktualizací se procento zařízení, která DNSSEC kazí, snižuje a objevují se první projekty, jak dostat validaci až k uživateli, aniž by uživatel musel něco konfigurovat. Největší problém paradoxně tak je, že někteří uživatelé naopak DNSSEC validaci aktivně odmítají, protože jim rozbíjí různé hacky typu privátní doména nebo captive portal, na jejichž funkčnost byli zvyklí.
Já na to nezapomínám. V článku je ale výslovně uvedena validace na straně uživatele. O validaci na straně uživatele "j" napsal, že ničemu nepomůže, což není pravda.
Navíc pokud někdo chce být chráně před tím, aby kdokoli mohl podvrhnout DNS záznam, musí dělat validaci na svém zařízení. Pokud někomu stačí, že DNS záznam není podvržen někde mezi rekurzivním serverem (mimo) a autoritativním serverem (včetně), a důvěřuje tomu, že jím používaný rekurzivní server DNSSEC validuje, ať se klidně spoléhá na validaci prováděnou rekurzivním serverem.
Navíc od uživatelů to nevyžaduje zas až takové úsilí, ono by dost pomohlo, kdyby DNSSEC validovaly SOHO routery. Ne že by tomu pak uživatelé měli věřit, ale aspoň by to eliminovalo plošné útoky.
Navíc od uživatelů to nevyžaduje zas až takové úsilí, ono by dost pomohlo, kdyby DNSSEC validovaly SOHO routery.
Problém je, že tohle v současné době vůbec není jednoduché implementovat. Stačí se podívat na Turris, který to má implementované celkem dobře, je ho jen 1000 kusů, a přesto je jeho fórum plné nářků uživatelů, kterým DNS nefunguje. Pokud by takový produkt prodával masově SOHO výrobce, koleduje si o bankrot.
Na druhou stranu, situace se postupně zlepšuje, a ISP se obvykle daří přesvědčovat k tomu, že zasahovat do DNS provozu není správné, i když si dosud nikdo nestěžoval.