Internet z Linuxu přes proxy Windows 2000 NTLM autorizácia na proxy Jedného dňa som si vo firme nainštaloval Red Hat 7.1. Pretože pre Linux je internet živná pôda, prvé, čo som sa snažil urobiť, bolo zabezpečiť spojenie na internet. Po nastavení všetkých dôležitých sieťových konfiguračných súborov som si spustil browser a nastavil proxy server. Po zadaní stránky som však s prekvapením zistil, že niečo nie je v poriadku. Browser ako by zostal v nekonečnom cykle, stále sa snažil kontaktovať zadanú webovú stránku. Aj vám sa prihodila podobná situácia? Prečo je tomu tak, sa vám pokúsim objasniť v tomto článku. Jadro problému spočíva v tom, že váš proxy server beží na MS Windows 2000. Microsoft proxy server trvá na NTLM autorizácii. Pochybujem o tom, že tento proprietárny protokol zvláda akýkoľvek browser rôzny od MS Internet Exploreru. Pán Dmitry A. Rozmanov napísal v programovacom jazyku Python program NTLM Authorization Proxy Server. Jeho cieľom je realizovať autorizáciu na proxy pomocou proprietárneho protokolu NTLM. Program funguje ako proxy server, to znamená, že nie je potrebné sa obmedzovať na nejaký konkrétny browser, a naviac každá požiadavka je upravená tak, aby sa tvárila rovnako, ako keby bola zaslaná z MS Internet Exploreru. Keď sa klient potrebuje autorizovať na proxy alebo serveri, ktorý používa NTLM autorizáciu, musí dodržať určitý postup pre nadviazanie spojenia. Táto komunikácia prebieha nasledovne (C = klient, S = server): 1: C -> S GET ... 2: S -> C 401 Unauthorized WWW-Authenticate: NTLM 3: C -> S GET ... Authorization: NTLM 4: S -> C 401 Unauthorized WWW-Authenticate: NTLM 5: C -> S GET ... Authorization: NTLM 6: S -> C 200 Ok Všetky tri správy poslané pri nadväzovaní spojenia majú binárnu štruktúru. Každá jedna je nižšie popísaná pseudo-C štruktúrou a v pamäti - načrtnutým diagramom; byte je 8bitové pole; short je 16bitové pole. Všetky polia sú unsigned, teda bez znamienka. Pole štruktúry s názvom zero obsahuje nuly. Pole dĺžky * indikuje premenlivú dĺžku poľa. Znaky a hexadecimálne čísla v komentároch štruktúry indikujú nemenné hodnoty pre dané pole. Pole flags pravdepodobne obsahuje príznaky, ktorých význam je neznámy. Type - 1 - message Táto správa obsahuje host name a NT domain name klienta. Reťazce host a domain sú zložené z ASCII (alebo možno ISO-8859-1) znakov. Reťazce sú zložené z veľkých písmen a nie sú zakončené nulou. Host name sa zadáva v tvare napríklad GOOFY, a nie GOOFY.DISNEY.COM. struct { byte protocol[8]; // 'N', 'T', 'L', 'M', 'S', 'S', 'P', '\0' byte type; // 0x01 byte zero[3]; short flags; // 0xb203 byte zero[2]; short dom_len; // domain string length short dom_len; // domain string length short dom_off // domain string offset byte zero[2]; short host_len; // host string length short host_len; // host string length short host_off; // host string offset (always 0x20) byte zero[2]; byte host[*]; // host string (ASCII) byte dom[*]; // domain string (ASCII) } type-1-message Type - 2 - message Táto správa obsahuje výzvu NTLM servera. Priestor nonce je používaný klientom na vytvorenie odpovedí NT a Lan Managera. Pole message lenght obsahuje dĺžku kompletnej správy, ktorá v tomto prípade je vždy 40. struct { byte protocol[8]; // 'N', 'T', 'L', 'M', 'S', 'S', 'P', '\0' byte type; // 0x02 byte zero[7]; short msg_len; // 0x28 byte zero[2]; short flags; // 0x8201 byte zero[2]; byte nonce[8]; // nonce byte zero[8]; } type-2-message Type - 3 - message Táto správa obsahuje meno užívateľa (user name), meno servera (host name), meno NT domény (NT domain name) a dve odpovede. Reťazce server (host), doména (domain) a meno užívateľa (user name) sú v Unicode a nie sú zakončené nulou; meno servera a domény musí byť zložené z veľkých písmen. struct { byte protocol[8]; // 'N', 'T', 'L', 'M', 'S', 'S', 'P', '\0' byte type // 0x03 byte zero[3]; short lm_resp_len; // LanManager response length (always 0x18) short lm_resp_len; // LanManager response length (always 0x18) short lm_resp_off; // LanManager response offset byte zero[2]; short nt_resp_len; // NT response length (always 0x18) short nt_resp_len; // NT response length (always 0x18) short nt_resp_off; // NT response offset byte zero[2]; short dom_len; // domain string length short dom_len; // domain string length short dom_off; // domain string offset (always 0x40) byte zero[2]; short user_len; // username string length short user_len; // username string length short user_off; // username string offset byte zero[2]; short host_len; // host string length short host_len; // host string length short host_off; // host string offset byte zero[6]; short msg_len; // message length byte zero[2]; short flags; // 0x8201 byte zero[2]; byte dom[*]; // domain string (unicode) byte user[*]; // username string (unicode) byte host[*]; // host string (unicode) byte lm_resp[*]; // LanManager response byte nt_resp[*]; // NT response } type-3-message Proxy server - inštalácia Najskôr si stiahnite z adresy www.geocities.com/rozmanov/ntlm/ súbor s názvom ntlmaps091.zip. Ďalej budete potrebovať Python 1.5.2 alebo vyššiu verziu http://www.python.org/. Skôr ako spustíte váš proxy server, je potrebné nastaviť súbor server.cfg. Na nasledujúcich riadkoch opíšem konfiguráciu tohto súboru. V danom súbore sa nachádzajú dve sekcie [GENERAL] a [CLIENT_HEADER]. V sekcii [GENERAL] možno nastaviť tieto parametre: LISTEN_PORT:5865 Na tomto porte pobeží váš proxy server, ktorý bude prekladať všetky adresy do tvaru, akoby ich posielal sám Internet Explorer. Tento port musíte nastaviť v browseri, ktorý budete používať (napr. Mozilla, Opera, Konqueror). Keďže váš proxy beží lokálne, IP adresa vášho servera bude 127.0.0.1, resp. localhost.localdomain. PARENT_PROXY: PARENT_PROXY_PORT: IP adresa a port nadradeného proxy win2k servera. DOMAIN: Názov Windows domény, v ktorej máte vytvorený účet. USER: Meno užívateľa, ktorý má oprávnenie pristupovať do Windows domény. PASSWORD: Heslo užívateľa. Tento parameter nemusíte vypĺňať, po spustení vás proxy server vyzve na zadanie hesla pre prístup do Windows domény. ALLOW_EXTERNAL_CLIENTS: Ak tento parameter nastavíte na 1 (ALLOW_EXTERNAL_CLIENTS:1), umožníte používať váš autorizačný proxy server klientom iných počítačov. FRIENDLY_IPS: Ak vám nevyhovuje, že pomocou ALLOW_EXTERNAL_CLIENTS:1 majú prístup cez váš účet všetky počítače, nastavte ALLOW_EXTERNAL_CLIENTS: na nulu a do FRIENDLY_IPS: zadajte IP adresu počítača, ktorému prístup cez váš autorizačný proxy server povoľujete. Napríklad: FRIENDLY_IPS: 192.168.3.0 DEBUG:0 Nastavením tejto hodnoty na 1 sa začnú vytvárať log súbory. Za každú connection sa vytvorí jeden súbor. BIN_DEBUG:0 Nastavením tejto hodnoty na 1 získate podrobnejšie debug informácie. Zápis sa vykonáva do súborov 127.0.0.1-32769.bin.client a 127.0.0.1-32769.bin.proxy (číslo v strede sa mení). URL_LOG:0 Nastavením tejto hodnoty na 1 sa začnú všetky vaše požiadavky URL zapisovať do súboru url.log. Môže vám byť osožný. [CLIENT_HEADER] Táto sekcia popisuje, čo a ako má server zmeniť v záhlaviach klientov (clients headers). Záver Uvedený program pracuje bez problémov ako v Linuxe, tak i vo Windows. Bol testovaný na distribúcii Red Hat 7.1 (Cartman) s verziou jadra 2.4.2-2. Peter Gašparovič Infotipy: NTLM Authorization Proxy Server http://www.geocities.com/rozmanov/ntlm/ NTLM authentication module for Apache/Unix http://modntlm.sourceforge.net/