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):
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.
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.
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.
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/