Наши партнеры

UnixForum






Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

Лопатин Виталий Борисович

Горящие стены

Писано для журнала "Хакер-Спец". Лексика оригинала сохранена.

Привет, дружок. Ну что... я готов поверить в то, что ты таки поставил себе такую офигенную штуку под названием Linux. Я готов поверить в то, что ты ничего не напортачил сразу. Я даже готов поверить в то, что настроил соединение со своим провайдером и вышел в Сеть.

И я готов поверить в то, что однажды ты заметил, что с твоей системой что-то происходит. Тебе кажется, что кто-то вмешивается в твой мир и имеет тебя вместе с твоей системой.

И вот ты, неоперившийся орёл, препираешься ко мне с бутылью пива и просишь, чтобы я тебя научил что к чему. ОК. Слушай и внимай. Ибо если ты нихрена не поймешь из того, о чем я тебе сейчас расскажу, то ты ни черта не стоишь в этом жестоком цифровом мире.

Что произошло?

Ничего особенного. Твою систему сожрали суровые парни, шаряшие по просторам Сети. И тебя вместе с ней. Какой-то славный парень просканировал диапазон IP адресов в Сети (ты хочешь знать как и зачем это делается я тебе об этом как-нибуть потом расскажу), набрел на твой работающий комп. Потом он его просканировал. Что значит просканировал? Грубо говоря, он провел разведку твоей системы. С помошью специальных программ он как рентгеном просветил твой комп и посмотрел какие программы у тебя работаю. А потом он подумал...(да да, подумал, головой парень работает) и провел какую-нибудь умную атаку. Все! Приплыли. Твоя система находится под управлением совершенно чужого человека.

Почему?

Запомни! На каждой вновь установленной системе работают десятки программ, которые обслуживают тебя или другие программы. Они называются демонами, другое, более правильное название - системный сервис или системный сервер.

Если ты еще настолько туп, чтобы не купить толстучую книжку по администрированию Linux (или вообще unix систем), то немедленно беги в магазин и купи.

Итак, каждый такой демонюга для общения с другими программами открывает для прослушивания специальную штуку - порт. Почтовый сервер открывает порт 25, www сервер - 80, и так далее. Таким макаром, каждая программа на работающем в Инете компе может быть опознана по сочетанию IP-адрес:порт (пример: 192.168.0.1:80).

На рисунке показан вид открытых портов на отсканированной системе, в данном случае открыт всего один порт за номером 6000. Его открывает программа Х сервера. Это нужно, чтобы удаленное или локальное приложение могло использовать видеокарту. Так вот, эта штука содержит очень много дырок и ее просто необходимо защитить от нежелательного вторжения из внешнего мира.

Существует аксиома (что такое аксиома посмотри в Толковом словаре Даля): в любой программе есть ошибки. Наш славный хацкер, где-то вычитал об ошибках в каких-нибуть программах, крутящихся на твоем компе. Потом он гте-то в Сети нашел эксплоит и кракнул твою несчастную систему. "Вот такая история. Шекспир и племянники." (с) ДМБ.

Что делать?

Прикрывать свою задницу. Точнее задницу своей системы. Для этого есть несколько способов. Простой и самый эффективный - нафиг отрубить все сервисы, которыми ты не пользуешься. В принципе, я тебе только что процитровал первое правило хорошего системного администратора. На вопрос, "а я не знаю что это за сервис", я могу сказать только одно: "Бегом, мать твою, за книжкой в магазин! Ты еще здесь??? (тебе поможет Эви Немет и компания. "Руководство администратора Unix", издательство Питер-Пресс)".

А что делать если сервисы нельзя отключать? Ну допустим, что ты решил изучить программирование на php, а для этого нужен www-сервер apache, работающий на 80-м порту. Вот тут тебе, маленькому засранцу, и поможет такая хрень как firewall, другими словами - брандмауэр, иначе говоря - межсетевой экран.

Что это такое?

Сейчас я начну вещать страшные вещи. Плесни-ка кофейку и попытайся напрячь мозги.

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

Есть три основных типа межсетевых экранов - пакетный фильтр (packet filtering), шлюз на сеансовом уровне (circuit-level gateway) и шлюз на прикладном уровне (application-level gateway).

Обычно это коммерческие программные продукты. Но ты, дружок не огорчайся, у меня для тебя есть сюрприз. Фишка в том, что в твоем Linux у же есть firewall. Относится он к пакетным фильтрам и называется он ipchains или iptables (в зависимости от версии ядра операционной системы).

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

Вся информация по сетям передается в виде короткой последовательности байтиков. Такая последовательность содержит адрес получателя, адрес отправителя, данные и еще всякую служебную дребедень. Она, эта самая последовательность, называется IP пакетом. Пакетный фильтр смотрит в приходящий или уходящий пакет и согласно правилам, которые ты укажешь, сделает с ним какие-то указанные тобой действия.

Если у тебя система на базе ядра версии 2.2.х, то у тебя наверняка установлен ipchains. По своей сути iptables и ipchains очень похожи, различаются в основном параметрами команд и возможностями. Iptables понятнее и гибче в настройках. Поэтому я расскажу тебе именно о нем. Я уверен, что тебе очень сильно поможет очень полезный документ, лежащий по указанному ниже адресу: http://www.linux.org.ru:8100/books/HOWTO/packet-filtering-HOWTO-3.html. Это рекомендуется прочесть несколько раз.

С чего начать?

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

Процедуры, отвечающие за работу пакетного фильтра также находятся в ядре. Если ты не знаешь с какого боку подойти к настройке ядра - пройдись на http://www.linux.org.ru:8100/books/HOWTO/Kernel-HOWTO.html и там тебе все расскажут в лицах и красках.

Я надеюсь, что у тебя хватит мозгов установить пакет с исходниками ядра или скачать свежее ядро ветки 2.4.х с ftp.kernel.org. У меня установлен дистрибутив ALT Linux Master 2.0 c ядром 2.4.18 и все примеры будут приведены на нем. Коротко это будет выглядеть так: администратором входишь в каталог /usr/src/linux, естесственно, что все это делается в консоли или в терминале. Даешь команду make menuconfig или make xconfig (если ты работаешь в Х)

Идешь в Networking Options и включаешь поддержку Network packet filtering.

Затем, спустившись немного ниже можешь настроить фильтр пакетов в разделе Netfilter Configuration.

Если что-то из вариантов настройки фильтра пакетов тебе покажется непонятным, а я на 100 процентов уверен, что тебе будет непонятно почти все, я настоятельно рекомендую выйти в Сеть и прочитать (а заодно слить на свой винт) вот этот документ: http://gazette.linux.ru.net/rus/articles/iptables-tutorial.html Там про iptables написано почти все.

Сразу скажу, что в современных дистрибутивах: ALT Linux Master 2.0, ASP Linux 7.2, Mandrake Linux 7.2 и выше, Red Hat Linux 7.0 и выше, SuSE Linux, Debian 2.2 и выше и т.д., пакетный фильтр iptables уже включен в ядро и настроен на решение часто используемых задач. Значит тебе с большой вероятностью не придется самому заниматься конфигурированием и сборкой ядра.

Другое дело в случае консервативного дистрибутива Slackware или Gentoo. Скорее всего, тебе самому придется ковыряться в ядре, собирать его, скачивать пакет iptables (его тоже надо будет собрать) и устанавливать все это барахло. Но я уверен, справившись с установкой такого дистрибутива ты на 100% справишься с такой мелочью как настройка и сборка ядра.

Продолжаем извращения

Ок. Я поверил в то, что ты таки сподобился совершить почти невероятное и установил iptables, скомпилил ядро и при этом не убил нафиг свою несчастную систему. Ну что ж... пожалуй пришло время и поразвлечься... Приготовь свой любимый терминал, консоль (или что там еще у тебя), текстовый редактор. Разомни пальчики и...

Пакетный фильтр iptables может работать с тремя таблицами правил. Таблица для фильтрации filter (она ставится по умолчанию, если явно ничего не указано), таблица для nat маскарадинга и трансляции адресов (и даже не спрашивай чего это такое - но это очень полезно для вывода локалки в Инет). И, наконец, таблица mangle для редактирования пакетов, но это слишком сложно.

В каждую таблицу заносятся последовательности (цепочки) правил фильтрации. Они последовательно просматриваются и исполняются фильтром. Цепочки ты либо заносишь сам из командной строки. Либо пишешь сценарий на shell. Хочу сказать, что скриптовые языки вроде perl и php для такого дела не подходят, хотя на них и можно написать системы, облегчающие составление правил и цепочек. Зайдеи на www.freshmeat.net и поищи по слову firewall или по слову iptables - увидишь массу ссылок на программы для быстрого и удобного составления правил фильтрации пакетов.

В общем виде цепочка выглядит так:
iptables Команда Ключ Критерий Действие_или_переход (сразу скажу, что они могут стоять на произвольных местах). Пример:
iptables -A INPUT -i ppp01 -p tcp -s 0/0 --sport 0:65535 -d 0/0 --dport 80 -j ACCEPT

Команда: -A INPUT добавляет правило фильтрации во входящую цепочку INPUT, это стандартное название.
Ключ: ключ тут не указан.
Критерий: их несколько, в качестве критерия отбора пакета указаны интерфейс ppp0 (-i ppp0), протокол tcp (-p tcp), адрес и маска подсети отправителя (-s 0/0), порт или диапазон портов отправителя (--sport 0:65535), адрес и маска подсети получателя (-d 0/0), порт или диапазон портов получателя (--dport 80). При совпадении информации в пакете с критериями в правиле выполняется
Действие_или_переход: -j ACCEPT, что означает принять это пакет.

Подробное описание можешь прочитать в документе iptables-tutorial, ссылку на который я тебе уже давал.

На рисунке я тебе показал пример цепочки для зашиты порта на котором работает Х сервер. Цепочка сработает в случае, если адрес и порт отправителя любые, а адрес и порт получателя равны 127.0.0.1 и 6000 сответственно. В результате выполнения действия DROP, пакет будет отброшен. Там же на рисунке продемонстрирован результат. Сканирование портов машины показало, что порт 6000 помечен как filtered, то есть закрыт пакетным фильтром. Что и требовалось доказать.

А вот тебе реально используемые примеры:

Пример 1.

Как с помощью iptables закрыть на ppp0 все порты 1-1024 и оставить открытыми только некоторые, например 53 и 80? Примерно так:
#!/bin/sh
IPT=/путь/к/iptables
$IPT -Z INPUT
$IPT -A INPUT -i ppp01 -p tcp -s 0/0 --sport 0:65535 -d 0/0 --dport 80 -j ACCEPT
$IPT -A INPUT -i ppp01 -p tcp -s 0/0 --sport 0:65535 -d 0/0 --dport 1:1024 -j DROP
$IPT -A INPUT -i ppp01 -p udp -s 0/0 --sport 0:65535 -d 0/0 --dport 53 -j ACCEPT
$IPT -A INPUT -i ppp01 -p udp -s 0/0 --sport 0:65535 -d 0/0 --dport 1:1024 -j DROP

Пример2

Как настроить пакетный фильтр для фильтрации по содержимому пакетов?
Следующие правила блокируют прохождение пакетов, данные в которых содержат подстроку virus.exe и ведут лог пакетов с строкой secret внутри:
#!/bin/sh

iptables -A INPUT -m string --string "secret" -j LOG --log-level info \
--log-prefix "SECRET"
iptables -I INPUT -j DROP -p tcp -s 0.0.0.0/0 -m string --string "virus.exe"

# Block Code Red
iptables -I INPUT -j DROP -p tcp -m string --string "cmd.exe"

# Block Nimda
iptables -I INPUT -j DROP -p tcp -m string --string "root.exe"
iptables -I INPUT -j DROP -p tcp -m string --string "default.ida"

Пример 3

Ситуация такая - машина подключена к Инету напрямую, нужно сделать так, чтобы доступ с нее был только на ftp, а все остальные in и out пакеты блокировались.
iptables -F OUTPUT
iptables -P OUTPUT DROP
iptables -A OUTPUT -p tcp --dport 20 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 21 -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT # это если не хочешь по ip лазать

iptables -F INPUT
iptables -P INPUT DROP
iptables -A INPUT -p tcp -m state --state ESTABLISHED, RELATED -j ACCEPT
iptables -A INPUT -p udp --sport 53 -j ACCEPT # опять-же для dns

Что осталось?

Iptables хранит все таблицы и цепочки в оперативной памяти компьютера. Но, авторы были не идиотами и сделали возможность сохранения сохранения настроек и их последующего восстановления. Для этого в природе существуют утилиты iprtables-save и iptables-restore. Их использовать ну очень просто. Соответственно есть man страницы.

Что читаем?

Читать тебе, перчик ты недозрелый, придется много, часто и густо. Ха! Не делай такое кислое лицо, это тебе не идет. Ты думаешь, что крутые перцы, о которых идет такая громкая слава родились с такими мозгами? Нихрена подобного! Они просиживают ночами, пытаясь вникнуть в документацию. Бери с них пример. И твои нервы станут мягкими и шелковистыми. Вот тебе список документов и статей, в скобках под названием документов указан адрес откуда можно взять:

  1. Kernel-HOWTO
  2. Linux 2.4 Packet-filtering-HOWTO (http://www.linux.org.ru:8100/books/HOWTO/index.html)
  3. Iptables-HOWTO (http://www.linuxguruz.org/iptables/howto/iptables-HOWTO.html)
  4. Firewall-HOWTO (http://linuxdocs.org/HOWTOs/Firewall-HOWTO.html)
  5. NAT-HOWTO (http://imc.edu.trekhgorny.ru/~merlin/iptables/NAT-HOWTO.linuxdoc.html)
  6. Netfilter-hacking-HOWTO (http://www.netfilter.org/documentation/HOWTO/netfilter-hacking-HOWTO.html)
  7. Iptables-tutorial (http://gazette.linux.ru.net/rus/articles/iptables-tutorial.html)
Вот и все. Желаю успехов на тяжком пути хакера.