Пользователь
0,0
рейтинг
22 февраля 2012 в 12:55

Администрирование → Авторизующий прокси под Windows (+ нормальная работа Opera с NTLM как бонус) из песочницы

На написание данного топика меня сподвигли следующие особенности моего жизненного пути:
  • Пару лет назад я устроился на работу в достаточно крупную компанию, где познакомился с прокси в целом и прокси с авторизацией в частности и узнал о косяках Opera в такой среде
  • Админы заставляют нас менять пароль в домене\на прокси достаточно часто
  • Похожей статьи на Хабре не нашлось:) — надеюсь, что кому-то эта инфа будет полезна

Предыстория


Раскидав свои вещи по новому рабочему месту и получив в свое распоряжение комп, я сразу же начал замусоривать его привычным набором софта, в который, естественно, входила и Opera.

Не успев нарадоваться новому и мощному компу, который мне выдал начальник, я обнаружил, что Opera заставляет меня вводить логин\пароль от прокси для каждой из открытых вкладок...

Сначала меня это просто удивило, а когда я заметил, что всеми уважаемый и горячо любимый официально поддерживаемый IT-департаментом нашей компании Internet Explorer такой бедой не страдает.

Дядя Гугл рассказал мне много интересных и новых тогда для меня вещей на эту тему… и про то, как давно на это жалуются юзеры Opera, и как это элементарно чиниться установкой какого-то «лиса»:)
Кроме того я уяснил, что существует NTLM-аутентификация, и что Opera с ней не особо-то и дружит.

Новоиспеченные коллеги радостно посоветовали мне не выпендриваться и выкинуть свой «не сильно популярный браузер».
НО. Такое положение вещей меня не устроило, и желания менять привычный мне браузер как-то не возникло. Поэтому я решил попробовать найти решение этой досадной проблемы (естественно, в свободное от работы время).

Поиски решения


Большинство рекомендаций сводилось к тому, что надо подергать флажок EnableNTLM в Opera (opera:config -> Network -> EnableNTLM).

К сожалению, в моем случае опция не принесла мне искомого единения с браузером:
  • EnableNTLM=1 -> получаем по одному запросу пароля на каждую вкладку
  • EnableNTLM=0 -> всего один запрос, но зато отваливаются все внутренние ресурсы, требующие доменной авторизации:

Больше ничего дельного найти не удалось, поэтому пришлось попробовать более кардинальное решение — собственный прокси, который будет авторизовываться на корпоративном прокси.
Тогда я нашел лишь NTLMAPS.
Некоторое время я пользовался этим прокси — в целом он свою функцию выполняет, но были некоторые неприятные моменты:
  • приличное падение скорости работы в сети, особенно при большом количестве одновременных запросов
  • достаточно заметная нагрузка на CPU
  • отсутствие штатной возможности работы в качестве службы (приходилось дополнительно использовать srvany)
  • необходимость хранить пароль в открытом виде в конфиг-файле
  • невозможность использовать в пароле спецсимволы и т.п.

Результат и плюшки


Все уже наверняка догадались, что есть-таки достойная и более удобная замена NTLMAPS, о которой я и хочу рассказать. И имя ей — CNTLM.
Именно этот прокси я использую на работе последние несколько лет (работающие под Linux коллеги также остановили свой выбор на CNTLM). С тех прошло уже много времени… Сначала выяснилось, что у нас используется squid, ISA и что-то еще… Затем появился секретный прозрачный прокси вообще без авторизации. Но я по-прежнему использую CNTLM.

Итак, для начала я приведу плюсы CNTLM по сравнению с NTLMAPS:
  • практически (боюсь писать «абсолютно») незаметное падение скорости (см. конец статьи)
  • отстутствие заметной нагрузки на CPU и малое потребление памяти (см. конец статьи)
  • работа в режиме службы
  • возможность хранить в конфиге хэш вместо самого пароля
  • возможность указать сразу несколько родительских проксей
  • возможность включить режим шлюза и т.п.
  • возможность задания NoProxy ресурсов (т.е. тех, для которых не надо использовать прокси вообще — e.g. локальные ресурсы)
  • ...

Чем может быть полезно такое решение:
  1. Opera теперь ВООБЩЕ не спрашивает логин\пароль — mission accomplished:)
  2. Весь софт ходит в инет через CNTLM. Когда наступает судный день день смены пароля -достаточно поменять его лишь в конфиге CNTLM.
    Ранее мне приходилось это делать в куче мест… Возьмем для примера комп сферического айтишника в вакууме: 3 браузера, dropbox, hamachi, teamviewer, miranda, skype, DM, антивирус, kitty и т.п. + многие приложения, которым просто нужен инет для проверки обновлений.
    Кроме того, после смены пароля весь софт продолжает долбиться в инет со старым паролем, что приводит к временному бану на прокси… Я надеюсь уже понятно — мне и коллегам было не очень комфортно).
  3. Как оказалось, не все современные программы умеют ходить в инет через прокси с авторизацией. CNTLM очень выручает в этой ситуации
  4. Все виртуалки и нужные машины в локалке можно также пустить в инет через CNTLM (включив в конфиге режим шлюза)
  5. Допустим, основной корпоративный прокси имеет привычку регулярно падать. Вбиваем в конфиг все доступные прокси и CNTLM будет сам прозрачно для нас перебирать их по списку в случае отвала основного прокси.

Это лишь перечень тех применений, которые пришли мне в голову. Уверен, что многие смогут придумать что-то еще.

Getting started


Под Windows нам предлагается инсталлер, который сам сделает всё хорошо: создаст службу и распакует файлики в нужное место.
Тем не менее, руками поработать все-таки придется.
  1. Вбиваем наши данные в %PROGRAMFILES%\Cntlm\cntlm.ini.

    В общем случае нас интересуют следующие параметры:

    Username -> наш логин на прокси или доменный логин
    Domain -> имя домена
    Proxy -> IP-адрес\имя родительского прокси + порт
    Listen -> локальный порт, на котором CNTLM будет нас ждать с распростертыми объятьями

    Указываем нужные данные и перезапускаем службу CNTLM.
  2. Узнать детали «диалекта» корпоративного прокси и вбить пароль\хэш в нужный параметр конфига.

    Эту инфу можно вытянуть у админов, но можно попробовать решить этот вопрос и средствами CNTLM. Для этого запускаем CNTLM с ключами -I и -M и адресом любого внешнего сайта:

    cntlm.exe -I -M ya.ru

    , вбиваем пароль руками и видим примерно такой аутпут:

    Auth NTLMv2
    PassNTLMv2 4AC6525378DF8C69CF6B6234532943AC


    Отсюда видно, что используется NTLMv2. Кроме того CNTLM сразу показывает нам хэш от введенного пароля.
    Вот мы и получили последний недостающий параметр PassNTLMv2.
    Вставляем его в конфиг CNTLM и перезапускаем службу.
  3. Вбиваем в браузере\аське\… прокси localhost: Х, где Х — наш локальный порт, указанный в конфиге.

Ложка дегтя


Поскольку CNTLM использует Cygwin, который по дефолту сыпет события в eventlog, мы имеем бешеное количество мусора в Application-логе (по ивенту на каждый HTTP запрос — Event ID 0 Source Cygwin):

The description for Event ID 0 from source Cygwin cannot be found. Either the component that raises this event is not installed on your local computer or the installation is corrupted. You can install or repair the component on the local computer.
If the event originated on another computer, the display information had to be saved with the event.
The following information was included with the event:
127.0.0.1 GET s.4pda.ru/forum/style_emoticons/default/thank_you.gif


C этим, конечно, можно жить, но зато найти что-то реально полезное в логе достаточно сложно.
Если кто-то подскажет элегантное решение — буду благодарен.
Единственное, что пока пришло мне в голову — убрать в исходниках все вызовы syslog().

P.S.

Привожу обещанное выше сравнение перформанса с NTLMAPS (эти данные ранее были указаны на сайте CNTLM, но недавно были убраны).

Рис. 1. Проверяем время выполнения запроса wget-ом. Обращаем внимание, что время 1го и последующего запроса при использовании NTLMAPS практически одинаково (~2 сек). В случае с CNTLM — 1ый запрос выполняется в 5 раз быстрее, последующий — уже в 15 раз — налицо кэширование соединений.


Рис.2. Смотрим потребление CPU и RAM при 50 параллельных соединениях.
Антон @molann
карма
7,2
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Администрирование

Комментарии (31)

  • 0
    У меня на работе такая же проблема с Safari. Попробую решить по этому рецепту.
  • 0
    Буду благодарен, если отпишешься о результатах. И если что — помогу чем смогу)
  • 0
    Кстати, про аутентификацию по Kerberos этот чудесный браузер тоже ничего не знает?
    • 0
      Судя по всему нет. Где-то августе 2011 они заявляли что поддержка будет, но сроков нет.
  • +1
    У нас прокся с NTLM-аутентификацией. Opera 11.61. Все прекрасно работает, авторизоваться на прокси требует лишь один раз, а не на каждой вкладке. Чтобы при этом были доступны доменные ресурсы — в настройках прокси Оперы заполняем список исключений, добавив в него, например, доменный постфикс: hq.somethingelse.ourdomain.com — и для этих ресурсов будет использована виндовая доменная авторизация, а не прокси.

    Прокси мапперы — это хорошо, конечно. Но у нас за них ругают сильно)
    • 0
      Я что-то похожее пробовал наколдовать — корпоративный портал так и не заработал в итоге.
      К тому же при таком раскладе один раз все-таки надо будет ввести лог\пасс (или просто подтвердить, если они сохранены) — не комильфо).
      А как обоснованы наезды за локальную проксю? Она же работает в рамках моей машины, кушать не просит и никому не мешает. Это ж не DHCP на интерфейсе локалки…
      • 0
        Просто: «политикой безопасности нельзя», и все)…
        А 1 раз нажать энтер для подтверждения логина-пароля — это вполне нормально.
        • 0
          возможно и у нас такое есть… Но вроде как после подписывания бумаги о получении админских прав на машину и взятие ответственности на себя админы успокаиваются)
    • 0
      Squid?
      Это конечно хорошо, допиливать руками… а если пользователей дофига?
      И директор нервный?
      • 0
        Пользователей до фига, директору пофиг — у него своих дел хватает. И для допиливания есть целый департамент)
  • 0
    Кстати лет 6 назад пришлось для belltv сделать интранет программу, они хотели чтобы у пользователей работал NTLM, хотя программа на Java. Пользовательский интерфейс — браузер. Здесь проблема не столько в браузере, сколько в том, чтобы Java программа, бегущая на сервере знала если пользователь имеет запись в domain контроллере и чтобы их пароль насквозь из браузера туда уходил. Использовал JCIFS (CIFS/SMB), загрузил этот jar, фильтр jcifs.http.NtlmHttpFilter вставляется в web.xml

    <filter-name>NtlmHttpFilter</filter-name>
    <filter-class>jcifs.http.NtlmHttpFilter</filter-class>
    <init-param>
    <param-name>jcifs.smb.client.domain</param-name>
    <param-value>BELL</param-value>
    </init-param>
    <init-param>
    <param-name>jcifs.netbios.wins</param-name>
    <param-value>xxx.xxx.xxx.xxx,yyy.yyy.yyy.yyy</param-value> (primary,secondary domain controller)
    </init-param>

    потом свой фильтр:
    <filter-name>BlahАuthenticationFilter</filter-name>
    <filter-class>com.blah.blah.BlahAuthenticationFilter</filter-class>

    <filter-mapping>
    <filter-name>BlahAuthenticationFilter</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>

    В своем фильтре немного кода нужно касающегося если httpRequest.getRemoteUser() null или нет. Правда уже несколько лет этого не трогал, не знаю если есть новые изменения в JCIFS, но в общем работало.

  • +1
    Насколько я помню, Cntlm не поддерживает HTTPS, так что npm или Git через Cntlm не ходит, например.
    • 0
      я еще пока ни разу не столкнулся ни с одной прогой, с которой бы не справился CNTLM… В любом случае, всегда можно прокинуть тоннель — опция -L (аналог corkscrew).
      Ни одной из перечисленных прог я не пользуюсь, к сожалению. Но опера и миранда успешно юзают SSL.
    • 0
      да, где-то в 2004 году была такая проблема
  • 0
    В этой компании довольно интересный ИТ отдел, с одной стороны "Админы заставляют нас менять пароль в домене\на прокси достаточно часто" и "официально поддерживаемый IT-департаментом нашей компании Internet Explorer", с другой стороны судя по "замусоривать его привычным набором софта" вам дали полные права над вашей рабочей машиной. На всем моем опыте исходя из первых двух цитат от такого отдела не выбить ничего больше компа под виндой с юзеровской учеткой и определенным им набором софта.
    • 0
      Я не вижу противоречий:
      — Основная рабочая машина в домене (в принципе можно было бы сидеть и под локальной учеткой, но так удобнее);
      — Сервисы компании затачиваются лишь под IE. Все остальное — как повезет;
      — Тут вы правы: доменная учетка добавлена в локальные админы. В комментах выше я уже писал, что, будучи на технической должности, можно взять ответственность за комп на себя и получить админские права на него. Обычные пользователи как раз и сидят под ограниченной учеткой и конкретным набором софта под занимаемую должность.

      • +2
        А роль прокси случайно не isa исполняет? Сталкивался с таким, от всяких проблем избавлял microsoft firewall client, но естественно под windows.
        • 0
          ISA в том числе. Кроме нее еще есть тачка со squid и еще одна железная прокся. По моим наблюдениям squid пашет побыстрее (видимо, просто меньше юзеров через него ходит) — поэтому он у меня в списке проксей стоит 1ым. Но за идею спасибо — я ставил как то ISA-клиент давно, но не осознал его смысл и снёс по-быстрому, поэтому не знал, что он в этой ситуации может как-то помочь.
  • 0
    По всей вероятности cygwin регистрирует свой источник событий, который и заваливает Application Log мусором. Попробуйте найти его тут и удалить: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\Application
    • 0
      Реестр я уже в поисках упоминаний cygwin прошерстил — ничего дельного не нашлось. В том числе и в списке источников event-лога.
      Надо будет внимательно посмотреть на сам cygwin и осознать, как можно поправить его дефолтное поведение: запись в app log при вызове syslogd()
  • +3
    И все ради оперы? И логи в цигвине и неудобные авторизации?
    • 0
      Первопричина — опера. Из-за ее не совсем удобного поведения всё и началось (хотя как подсказали в комментах — можно было поставить ISA-клиент). Но затем всплыли и другие плюшки.
      А мусор от cywgwin — это лишь мелкое неудобство. Ну привык я к Opera как к основному браузеру). Тем не менее по работе часто есть необходимость использовать все браузеры.
  • 0
    Спасибо за инструкцию для Оперы. Год назад мучил нашего админа из-за этого — он проблему решить не смогу, хотя тоже пользуется Оперой. В результате, остановились на одном вводе логина/пароля при запуске браузера.
    Я даже ребятам из Оперы высылал два видео www.screenr.com/Gnq и www.screenr.com/Gmu [Opera Link stop working]. На видео вообще Ад с проки в Opera. Незнаю насколько проблема сейчас актуальна, сейчас сижу без прокси.
    Кстати, в вас Opera Link работает через прокси?
    • 0
      * у вас
      • 0
        да, все ок. И без CNTLM насколько я помню тоже.
    • 0
      Им бесполезно что-то слать. Отсутствие нормального прозрачного NTLM принципиальная позиция норвежцев.
  • 0
    Также в Google Chrome 7.0.517.8 dev была эта проблема с прокси, но там её быстро пофиксили.

    Можно было бы ещё добавить ссылок на Оперовский форум
    my.opera.com/community/forums/topic.dml?id=693732 [When Opera uses an authenticated proxy, it asks for username/password for every website I visit.]
    my.opera.com/community/forums/topic.dml?id=224281 [Proxy Authentication spreading across tabs]
    my.opera.com/community/forums/topic.dml?id=696252 [Opera with proxy gives a lot of problems]
    Может быть pepelsbey'ю станет стыдно и он форсирует решение проблемы.
  • 0
    Единственный прокси корректно работающий с Microsoft TMG 2010 на linux серверах.
  • 0
    понятно, что ограничивают инет и следят за потреблением трафика менеджеров

    но зачем напрягать сисадминов, программеров и т.п.?
    • 0
      Ну, как видишь, зато технические специалисты учатся искать решения самостоятельно… а это полезно)
      В теории было бы неплохо применять разные политики к разным позициям внутри компании, но в любом руководству хочется понимать общую температуру по больнице: трафик, поп. сайты, иметь возможность лочить посещение нежелательных\зловредных сайтов и т.п.
      • 0
        трафик щас анлим (где не так?)

        поп.сайты, нежелательные, зловредные можно лочить и без прокси

        зачем прокси? зачем этот ненужный посредник?

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.