Jadro problému spočíva v tom, že váš proxy server beží na Microsoft win2k.
Microsoft proxy server trvá na NTLM autorizácii. Pochybujem o tom, že tento proprietárni protokol zvláda akýkoľvek browser rôzny od Microsoft 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 Microsoft 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 <base64-encoded type-1-message> 4: S -> C 401 Unauthorized WWW-Authenticate: NTLM <base64-encoded type-2-message> 5: C -> S GET ... Authorization: NTLM <base64-encoded type-3-message> 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úrov a v pamäti – načrtnutým diagramom. byte je 8-bitové pole; short je 16-bitové 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é 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;
Obr. 1 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 kompletnéj 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;
Obr. 2 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;
Obr. 3 Type – 3 – message
Proxy server – inštalácia
Najskôr si stiahnite z adresy http://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. Pre zaujímavosť uvádzam log súbor adresy www.google.com.
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).
Web Linky
NTLM Authorization Proxy Server
http://www.geocities.com/rozmanov/ntlm/
NTLM authentication module for Apache/Unix
http://modntlm.sourceforge.net/
Záver
Uvedený program pracuje bez problemov ako v Linuxe tak i vo Windows. Bol testovaný na distribúcii RedHat 7.1 (Cartman) s verziou jadra 2.4.2–2.