Безопасность через маскировкуАндрей Матвеев / andrushock@real.xakep.ru / Интернет — это опасная и враждебная территория. Сотни злоумышленников могут проверять и испытывать твою сеть 24 часа в сутки, 7 дней в неделю. Не стоит полагаться только на брандмауэр. Применяй комплексный подход к защите — с привлечением нестандартных приемов обеспечения безопасности. В авангарде сетевого мостостроенияВсего лишь несколькими командами можно превратить обычный компьютер класса Pentium-1 с двумя сетевыми картами на борту в интеллектуальный коммутатор, соединяющий различные сети между собой. Так, что компьютер из одной сети будет общаться с компьютером из другой без участия маршрутизатора! Причем, подобный сетевой мост позволит фильтровать входящий и исходящий трафик, выполнять нормализацию и дефрагментацию IPv4-пакетов, нарезать канал, организовать привязку IP-адресов к MAC’ам, противодействовать DOS-атакам, попыткам сканирования и спуфинга. Что интересно, мост можно сделать прозрачным (транспарентным; когда ни одному из сетевых интерфейсов не назначается IP-адрес) либо полупрозрачным (внешний интерфейс наделен сетевым адресом, а внутренний — нет). Стоит отметить: вне зависимости от типа моста задействованные сетевые интерфейсы будут автоматически переведены в режим приема всех пакетов, что может вызвать недовольство со стороны провайдера. С теоретической частью закончили, переходим к практике. Чтобы создать прозрачный сетевой мост, первым делом нужно поднять интерфейсы vr0 и vr1 (это карточки на чипсете VIA RhineII), не указывая их сетевые настройки, и выставить корректные права доступа к файлам конфигурации
Примечание: здесь и далее предполагается, что мы работаем в OpenBSD 4.4. Настроим мост так, чтобы он своими силами блокировал трафик, отличный от IP, например, соединения по протоколам IPX или NETBEUI (опция blocknonip), и запрещал перенаправление широковещательных пакетов (опция link0):
Теперь достаточно перезагрузиться либо набрать команды «ifconfig bridge0 create; brconfig bridge0 `cat /etc/ bridgename.bridge0`», и прозрачный мост начнет пропускать через себя проходящий трафик. Поскольку бридж самостоятельно перенаправляет пакетики с одного сетевого интерфейса на другой, нет необходимости в файле /etc/sysctl.conf устанавливать значение переменной net.inet.ip.forwarding равным единице. Есть один момент, о котором нельзя не упомянуть. При использовании pf сетевой пакет, проходящий через мост, попадает под проверку фильтра дважды: при входе на одном интерфейсе и при выходе — на другом. Поэтому при составлении правил файрвола нужно разрешать прохождение пакетов на внешнем интерфейсе, а фильтрацию производить только на внутреннем. Либо наоборот: фильтровать на внешнем и разрешать все на внутреннем.
Кстати! Так как наш транспарентный бридж не имеет ни одного IP-адреса, нам не удастся воспользоваться его сетевыми службами, в частности, удалено зайти на него по telnet/ssh (что с точки зрения безопасности — огромный плюс). Для изменения настроек нужно будет сесть непосредственно за компьютер либо, если он работает в режиме headless (нет монитора и клавиатуры), воспользоваться нуль-модемным кабелем и терминальной программой типа SecureCRT. Настройка полупрозрачного моста аналогична. Просто нужно одному из сетевых интерфейсов назначить IP-адрес. Чтобы пример сделать интереснее, объединим проводной и беспроводной участки локальной сети. Первым делом сконфигурируем LAN-интерфейс:
Далее следует сгенерировать 256-битный ключ WPA-PSK, который будет использоваться для авторизации беспроводных клиентов на точке
доступа. Формат команды таков: «wpa-psk
В моем случае беспроводная карточка Gigabyte GN-WPKG 802.11 b/g обеспечивает работу по спецификации 802.11g (mode 11g) на 11-ом частотном канале (chan 11) в режиме точки доступа (mediaopt hostap) с уникальным идентификатором сети (nwid wlan) и поддержкой WPA/ WPA2:
Если по какой-то причине в /etc/hostname.ral0 ты хочешь держать не ключ, а незашифрованный пароль, то последняя строчка конфига будет выглядеть так:
Мы же не хотим, чтобы любой залогинившийся в систему пользователь мог узнать наш ключ/пароль?
Дальнейшая процедура полностью аналогична описанной выше: создаем /etc/bridgename.bridge0 (в предыдущем примере все вхождения vr1 нужно заменить на ral0) и перезагружаемся. Для проверки состояния помещенных в мост сетевых интерфейсов запускаем штатную утилиту brconfig(8):
Сокрушительный удар по спамерамПочтовый сервер в режиме greylisting способен отфильтровывать до 98% спама, при этом не затрачивая время и ресурсы на трафик и обработку «грязных» писем. Суть идеи «серых списков» заключается в следующем. Корректно сконфигурированный SMTP-сервер отправителя, получив определенный ответ от сервера получателя, обязан повторить попытку доставки письма через некоторый промежуток времени (обычно — от 5 до 60 минут). Зная это, в качестве ответа на соединение от неизвестного почтового сервера мы можем (с помощью фейкового SMTP-демона) возвращать не стандартное SMTP-сообщение «OK» или «Rejected», а ошибку с кодом 450, 451 или 550 («Временно не доступен»). Когда почтовый сервер отправителя повторит доставку письма (а по RFC он обязан это сделать), мы примем к сведению, что данный сервер в течение небольшого промежутка времени уже несколько раз пытался отправить нам письмо, а значит, он не спамер. И тогда мы примем корреспонденцию. Вообще говоря, greylisting настраивается без особых проблем. Сложность возникнет, когда ты решишь поднять защиту от спама на (полу)прозрачном мосте. Ведь ввиду специфики сетевой модели (разные уровни OSI) пакеты, которые форвардятся с одного интерфейса на другой, просто не дойдут до IP-стека операционной системы. Соответственно, правила перенаправления (rdr) не будут работать для пакетов, не адресованных бриджу. В данном случае одного редиректа недостаточно, нужно роутить (route-to) входящие SMTP-подключения на интерфейс обратной петли. Если перейти на язык конфигов, ларчик открывается следующим образом:
Вот так на прозрачном мосте, не имеющем ни одного IPадреса, можно поднять надежную защиту от спама. Мыльное шоу с переодеваниемВ продолжение разговора о почте хочу поделиться еще парочкой камуфляжных приемов. Используя средства маскировки, встроенные в почтмейстер Sendmail, можно сделать так, что все исходящие письма будут выглядеть как отправленные с одного компьютера. Достигается это путем включения макроса MASQUERADE_AS.
Существуют разные способы почтового маскарадинга, однако директивы allmasquerade и masquerade_envelope рекомендуется использовать вместе — тогда все адреса в заголовках и конвертах писем будут маскироваться одинаково. Если один домен обслуживают несколько почтовых концентраторов, то чтобы впоследствии легче было выяснить, с какого из них получено сообщение об ошибке, имеет смысл с помощью макроса EXPOSED_USER исключить из процесса маскировки пользователей root и Mailer-Daemon. Чтобы изменения вступили в силу, пересобираем mc-файл и даем указание демону перечитать свой конфиг:
Теперь почтовый адрес отправителя user@host.mydomain. ru будет переписываться на user@mydomain.ru. Но так мы только создали видимость, что почта поступает с одного компьютера. По умолчанию Sendmail всем честно рассказывает, с какого внутреннего IP-адреса было отправлено письмо. Это можно проверить, просто посмотрев в любом MUA (Mail User Agent: The Bat!, Outlook, Thunderbird) на заголовок почтового сообщения:
Чтобы скрыть эту информацию, нужно генерировать собственные заголовки:
Прелести прозрачного проксированияЛюбой современный браузер можно сконфигурировать для работы через прокси. Но если у сервера, на котором висит Squid, изменится адрес или порт, то на всех клиентских компьютерах придется менять настройки (а если рабочих станций несколько сотен или тысяч?). При использовании прозрачного проксирования все пакеты, в адресах назначения которых содержится порт 80/tcp, автоматически перенаправляются на порт прокси-сервера. Такой механизм работы заметно упрощает администрирование и открывает поистине бескрайний простор для деятельности и фантазии! Проксю можно подвесить на другой порт, перенести на другой сервер или подключить к каскаду прокси-серверов. Контент можно проверять на вирусы (Squid + HAVP + Clamav), www-запросы подвергать жесткой фильтрации (Squid + squidGuard), а баннеры и всплывающие окна нещадно блокировать (Squid + Adzapper + Bfilter). Клиенты даже не поймут, что весь www-трафик проходит сквозь кэш, фильтры и медные трубы. Для работы в этом режиме Squid необходимо собрать с поддержкой штатного файрвола ('--enable-pftransparent'), назначить ограниченные права доступа для псевдоустройства /dev/pf (команды «chgrp _squid /dev/pf» и «chmod g+r /dev/pf») и в /etc/squid/squid.conf добавить следующие записи:
Не лишним будет настроить директивы forwarded_for и anonymize_ headers, чтобы перевести кальмара в режим работы анонимного проксика:
Для экономии журнального места приведу только те правила файрвола, которые затрагивают систему NAT и редирект http-трафика:
Шлюзование с секретомС помощью связки pf + authpf можно контролировать доступ к службам, хостам и закрытым сегментам сети, основываясь на правах зарегистрировавшегося по ssh пользователя. Другими словами, в зависимости от введенных юзером логина и пароля на шлюзе будут вступать в силу персональные правила файрвола. Разве не сказка? Допустим, нам из дома нужно получить доступ к институтскому серверу терминалов (192.168.1.100), расположенному за шлюзом (81.211.11.11). Настраиваем псевдооболочку authpf (о том, как это сделать, рассказывалось в статье «Деликатное проникновение в частную сеть», опубликованной в X_02_2008) и создаем нового пользователя rdp:
Определяем для него специальный набор правил файрвола:
Для получения доступа «извне» к серверу терминалов вводим следующую команду:
Теперь для клиента 79.167.22.22 на шлюзе 81.211.11.11 порт 3389/tcp будет открыт до тех пор, пока пользователь rdp в окне ssh-клиента не нажмет комбинацию <Ctrl+C>. Все, запускаем TS Client:
Расщепление пространства доменных именВ BIND 9 появились виды (views) — мощный механизм, позволяющий хранить несколько наборов настроек и данных в пределах одной копии демона named. На основании списка соответствия адресов демон выясняет, какие данные нужны тому или иному клиенту. Для примера затеним пространство имен на DNS-сервере, получающем запросы как от внутренних узлов, так и от интернет-узлов.
Чтобы объявить внешнему миру совсем не те зональные данные, что доступны внутренним узлам, осталось лишь создать файлы зонных данных (db.int.mydomain.ru, db.ext.mydomain.ru) и перезапустить демон named командой «rndc reload». WWW
|