Перейти к содержанию

17.3 Защита от сетевых атак (Defending Against Network Attacks)

Было бы замечательно жить в мире, где сети можно соединять, доверяя другим уважать наши системы. К сожалению, такого мира не существует. Если ваши Linux-системы подключены к сети, необходимо серьёзно заботиться о защите от сетевых атак. Если же ваша сеть подключена к публичной сети, например к Интернету, эта забота становится первостепенной.

Как и большинство тем этой книги, сетевая безопасность — огромная область, которой посвящены многотомные труды. У нас нет ни времени, ни возможности воздать теме должное. Вместо этого рассмотрим несколько базовых мер защиты от сетевых атак:

  • Снижение уязвимостей сети
  • Реализация межсетевого экрана с помощью iptables

Начнём с мер по снижению сетевых уязвимостей.

Снижение сетевых уязвимостей (Mitigating Network Vulnerabilities)

Хорошая новость: существуют простые меры, позволяющие снизить угрозу Linux-системам со стороны сетевых атак. К ним относятся:

  • Отслеживание актуальных угроз
  • Выгрузка ненужных служб
  • Установка обновлений

Начнём с обсуждения отслеживания актуальных сетевых угроз.

Отслеживание актуальных угроз (Staying Abreast of Current Threats)

Одна из главных проблем сетевой безопасности состоит в том, что мы всегда на шаг позади тех, кто носит чёрные шляпы. Не успеваем применить исправление для защиты от последней уязвимости, как появляется новая. Поэтому крайне важно быть в курсе последних сетевых угроз: они меняются еженедельно, а иногда и ежедневно! Единственный способ обезопасить системы — знать, какие угрозы актуальны в данный момент.

Лучший способ сделать это — регулярно посещать тематические сайты по безопасности. Они информируют о свежих уязвимостях и способах защиты. Один из наиболее авторитетных ресурсов — www.cert.org, поддерживаемый Группой реагирования на компьютерные инциденты (CERT) при Университете Карнеги-Меллон. Сайт CERT содержит ссылки на последние рекомендации по безопасности.

Ещё один отличный ресурс — www.us-cert.gov. Поддерживаемый Группой готовности к компьютерным чрезвычайным ситуациям правительства США (US-CERT), этот сайт предоставляет обширную информацию о текущих кибератаках.

Разумеется, существуют сотни других сайтов по безопасности. Однако перечисленные — среди наиболее авторитетных. Большинство других ресурсов черпают содержание именно из них. Регулярно посещая эти сайты, вы будете в курсе происходящего в мире безопасности и, возможно, сможете предотвратить атаку на свои системы.

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

Выгрузка ненужных служб (Unloading Unneeded Services)

Один из простейших способов снизить угрозу сетевой атаки — просто выгрузить сетевые службы, запущенные на системе, но не нужные. В зависимости от дистрибутива и способа его установки на системе, вероятно, работает ряд служб, о которых вы не знаете и которые вам не нужны. Просмотреть список установленных служб и их состояние можно, введя в командной строке chkconfig. Эта команда выведет каждую службу и её состояние, как показано на рис. 17-9.

Рис. 17-9. Просмотр установленных служб.

Рис. 17-9. Просмотр установленных служб.

Примечание

Утилита chkconfig доступна не во всех дистрибутивах. Изначально это утилита Red Hat, перенесённая во многие другие дистрибутивы, например SUSE Linux. В Debian она, скорее всего, недоступна.

Следует предостеречь: не отключайте службу, если не знаете, что она делает. Некоторые демоны необходимы для нормальной работы системы. Если назначение службы неизвестно, воспользуйтесь утилитами man, info или Интернетом, чтобы разобраться и решить, нужна ли она.

В дополнение к chkconfig можно использовать команду nmap для просмотра открытых IP-портов Linux-системы. Эта информация очень полезна. Каждый открытый порт представляет потенциальную уязвимость. Одни открытые порты необходимы, другие — нет. Закрыть порт можно, выгрузив использующую его службу.

Примечание

Для использования команды nmap необходимо установить пакет nmap.

Рис. 17-10. Использование nmap для сканирования открытых портов.

Рис. 17-10. Использование nmap для сканирования открытых портов.

Синтаксис nmap: nmap –sT host_IP_address для сканирования TCP-портов и nmap –sU host_IP_address для сканирования UDP-портов. На рис. 17-10 утилита nmap использована для поиска открытых TCP-портов.

Как видно на рисунке, на проверяемом узле работает ряд служб. По этому выводу можно определить, что следует, а что не следует оставить запущенным в системе. Чтобы отключить службу, можно воспользоваться её сценарием init в каталоге init. Также следует использовать команду chkconfig или systemctl, чтобы служба не запускалась автоматически.

Совет

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

Помимо утилиты nmap, для сканирования открытых портов можно использовать утилиту netstat. Утилита netstat — ещё один мощный инструмент. Синтаксис: netstat параметр в командной строке системы, которую нужно проверить. Можно использовать параметры из табл. 17-2.

Параметр netstat Описание
–a Список всех слушающих и неслушающих сокетов
–i Статистика сетевых интерфейсов
–l Список слушающих сокетов
–s Сводная информация по каждому протоколу
–r Таблица маршрутизации

Табл. 17-2. Параметры netstat.

Пример использования netstat с параметром –l для просмотра списка слушающих сокетов на Linux-узле показан на рис. 17-11.

Рис. 17-11. Использование netstat для просмотра списка слушающих сокетов.

Рис. 17-11. Использование netstat для просмотра списка слушающих сокетов.

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

Установка обновлений (Installing Updates)

Одна из важнейших мер защиты от сетевых атак — регулярная установка обновлений операционной системы. Простой факт IT-жизни: программное обеспечение пишется несовершенно. Большинство программ и служб имеют дефекты. Ядро Linux — не исключение. Одни дефекты несущественны, другие лишь раздражают, третьи представляют серьёзные риски безопасности.

По мере выхода и использования программного обеспечения дефекты обнаруживаются системными администраторами, пользователями и (к сожалению) хакерами. При обнаружении дефектов создаются и выпускаются обновления. В большинстве дистрибутивов можно настроить операционную систему на автоматическую проверку наличия обновлений в Интернете. Например, в SUSE Linux для этого предназначен модуль YaST Online Update, показанный на рис. 17-12. Систему можно настроить как на автоматическую установку обновлений, так и на запрос подтверждения. Инструмент обновления зависит от используемого дистрибутива Linux.

Рис. 17-12. Обновление системы.

Рис. 17-12. Обновление системы.

Совет

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

Следует также реализовать межсетевой экран на уровне узла для защиты Linux-системы.

Реализация межсетевого экрана с помощью iptables (Implementing a Firewall with iptables)

Сегодня большинство организаций подключают корпоративные сети к Интернету. Это расширяет возможности коммуникации и предоставляет доступ к огромному объёму информации. К сожалению, это также подвергает сеть серьёзным угрозам безопасности. Если пользователи могут выходить в Интернет, незваный гость оттуда тоже может проникнуть в сеть, если не принять меры. Для этого организации необходимо реализовать сетевой межсетевой экран (network firewall), а также межсетевые экраны уровня узла (host-based firewalls) на каждой системе.

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

В этой части главы рассмотрим следующие темы:

  • Принцип работы межсетевых экранов
  • Реализация межсетевого экрана с фильтрацией пакетов

Принцип работы межсетевых экранов (How Firewalls Work)

Что такое межсетевой экран (firewall)? Межсетевой экран — это совокупность аппаратных и программных средств, выступающих в роли привратника между вашей сетью и другой сетью. Как правило, межсетевой экран имеет два и более сетевых интерфейса. Один подключён к внутренней сети, другой — к публичной сети и работает подобно маршрутизатору. Однако межсетевой экран не является маршрутизатором (хотя может быть реализован совместно с ним).

Задача межсетевого экрана — контролировать трафик, проходящий между сетями, как входящий, так и исходящий. Межсетевой экран настраивается с помощью правил, определяющих, какой трафик разрешён. Любой трафик, нарушающий правила, блокируется, как показано на рис. 17-13.

Рис. 17-13. Принцип работы межсетевого экрана.

Рис. 17-13. Принцип работы межсетевого экрана.

Межсетевые экраны реализуются различными способами. Один из наиболее распространённых типов — межсетевой экран с фильтрацией пакетов (packet-filtering firewall), через который должен проходить весь трафик между частной и публичной сетями. При этом межсетевой экран захватывает все входящие и исходящие пакеты и сравнивает их с настроенными правилами.

Межсетевой экран может фильтровать трафик по адресу источника, адресу назначения, порту источника, порту назначения, используемому протоколу или типу пакета. Если пакет соответствует правилам, он передаётся в следующую сеть; если нет — отбрасывается, как показано на рис. 17-14.

Рис. 17-14. Использование межсетевого экрана с фильтрацией пакетов.

Рис. 17-14. Использование межсетевого экрана с фильтрацией пакетов.

Межсетевые экраны с фильтрацией пакетов не обязательно реализуются между вашей сетью и Интернетом. Их можно также внедрить между сегментом сети и магистральным сегментом для повышения внутренней безопасности.

Для использования межсетевого экрана с фильтрацией пакетов необходимо знать, какие номера портов по умолчанию используются теми или иными службами. IP-порты с 0 по 1023 назначены организацией IANA (Internet Assigned Numbers Authority) сетевым службам и называются общеизвестными портами (well-known ports). Некоторые наиболее распространённые назначения портов показаны в табл. 17-3.

Порт Служба
20, 21 FTP
22 OpenSSH
23 Telnet
25 SMTP
53 DNS
80, 443 HTTP и HTTPS
110 POP3
119 NNTP
137, 138 и 139 SMB и NetBIOS (используется Samba)
143 IMAP
161 и 162 SNMP
177 X Display Manager Control Protocol (XDMCP)
389, 636 LDAP (незащищённый и защищённый)
631 IPP

Табл. 17-3. Распространённые назначения портов.

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

Совет

Можно также реализовать межсетевые экраны с контролем состояния соединений (stateful firewalls) и шлюзы уровня приложений (application-level gateways), работающие на более высоких уровнях модели OSI. К сожалению, у нас нет времени и возможности рассмотреть их здесь.

Реализация межсетевого экрана с фильтрацией пакетов (Implementing a Packet-Filtering Firewall)

Как Linux может выступать в роли маршрутизатора, так и в роли межсетевого экрана. Из него можно создать весьма надёжный и мощный межсетевой экран. На рынке существует много аппаратных решений на базе Linux. Есть также загружаемые Linux ISO-образы, например от Untangle, которые можно установить на стандартное PC-оборудование и превратить его в маршрутизатор. Для наших целей сосредоточимся на создании базового межсетевого экрана с фильтрацией пакетов с помощью iptables.

Первый шаг при настройке межсетевого экрана с фильтрацией пакетов на Linux — проектирование реализации. При проектировании необходимо ответить на следующие вопросы:

  • Разрешить ли весь входящий трафик по умолчанию, задав правила для отдельных типов нежелательного трафика?
  • Запретить ли весь входящий трафик, кроме конкретных разрешённых типов?
  • Разрешить ли весь исходящий трафик по умолчанию, блокируя только отдельные типы или адресатов?
  • Заблокировать ли весь исходящий трафик, кроме конкретных разрешённых типов или адресатов?
  • Какие порты должны быть открыты на межсетевом экране для пропуска трафика снаружи? Например, если за межсетевым экраном развёртывается веб-сервер с публичным доступом, необходимо открыть порты 80 и, вероятно, 443 на граничном межсетевом экране.

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

После проектирования межсетевой экран можно реализовать. Установив и настроив требуемые сетевые платы, можно настроить межсетевой экран с помощью утилиты iptables. Многие дистрибутивы Linux включают графические надстройки для iptables. Они обычно менее гибки, чем утилита командной строки, но делают процесс настройки значительно быстрее и проще.

Основу Linux-межсетевого экрана составляет пакет iptables. Большинство дистрибутивов включают его. Если нет — его можно загрузить с www.netfilter.org. Версии ядра Linux до 2.4 использовали ipfwadm или ipchains вместо iptables. На сайте The Linux Documentation Project (www.tldp.org) многие руководства по межсетевым экранам всё ещё написаны для этих устаревших пакетов.

Примечание

В будущем пакет iptables будет заменён новым пакетом nftables.

Фильтрацию пакетов на Linux выполняет само ядро. Для использования iptables ядро должно соответствовать инфраструктуре netfilter (netfilter infrastructure). Эта инфраструктура включена по умолчанию при установке большинства дистрибутивов.

Инфраструктура netfilter использует концепцию «таблиц и цепочек» для создания правил межсетевого экрана. Цепочка (chain) — это просто правило, определяющее поведение межсетевого экрана при получении входящего пакета. Для создания правил фильтрации пакетов используется таблица filter. В таблице filter по умолчанию три цепочки:

  • FORWARD — содержит правила для пакетов, передаваемых между сетями через Linux-систему.
  • INPUT — содержит правила для пакетов, адресованных локальной Linux-системе.
  • OUTPUT — содержит правила для пакетов, исходящих из локальной Linux-системы.

Если при использовании iptables имя таблицы явно не указано, по умолчанию используется таблица filter. Каждая цепочка в таблице filter поддерживает четыре политики:

  • ACCEPT
  • DROP
  • QUEUE
  • REJECT

С помощью iptables можно создавать правила в цепочке. Цепочка может содержать несколько правил. Каждому правилу присваивается номер: первому добавленному — номер 1.

Утилита iptables позволяет добавлять, удалять, вставлять и дополнять правила. Синтаксис: iptables –t таблица команда цепочка параметры. Доступные команды:

  • –L — вывод всех правил цепочки
  • –N — создание новой цепочки

Можно работать как со стандартными цепочками, так и создавать собственные командой iptables –N имя_цепочки. Добавить правила в цепочку можно с помощью параметра –A. Доступны также следующие параметры:

  • –I — вставить правило в цепочку
  • –R — заменить правило в цепочке
  • –D — удалить правило из цепочки
  • –F — удалить все правила из цепочки (сброс)
  • –P — задать политику по умолчанию для цепочки

Дополнительные параметры iptables:

  • –p — задаёт протокол для проверки правилом. Можно указать all, tcp, udp или icmp. Для tcp или udp доступны расширения для сопоставления:
    • --sport — конкретный порт источника
    • --dport — конкретный порт назначения
    • --sports — несколько портов источника
    • --dports — несколько портов назначения
  • –s ip_address/mask — задаёт адрес источника. Для проверки всех IP-адресов используйте 0/0.
  • –d ip_address/mask — задаёт адрес назначения. Для проверки всех IP-адресов используйте 0/0.
  • –j target — задаёт действие при совпадении пакета с правилом: ACCEPT, REJECT, DROP или LOG.
  • –i interface — задаёт интерфейс, на котором принимается пакет. Применяется только к цепочкам INPUT и FORWARD.
  • –o interface — задаёт интерфейс, через который отправляется пакет. Применяется только к цепочкам OUTPUT и FORWARD.

Примечание

Здесь представлена лишь часть возможностей iptables. Полный список параметров см. в man-странице iptables.

Лучший способ освоить iptables — изучить примеры. В табл. 17-4 приведены образцы команд для начала работы.

Команда iptables Функция
iptables –L Список существующих правил
iptables –D FORWARD 1 Удаление первого правила из цепочки FORWARD
iptables –t filter –F Удаление всех правил из таблицы filter
iptables –P INPUT DROP Политика по умолчанию для цепочки INPUT: отбрасывать все входящие пакеты
iptables –P FORWARD DROP Настройка цепочки FORWARD: отбрасывать все пакеты
iptables –A INPUT –s 0/0 –p icmp –j DROP Настройка межсетевого экрана: игнорировать все входящие PING-пакеты, адресованные локальной Linux-системе
iptables –A FORWARD –p tcp –s 0/0 --sport 80 –j ACCEPT Настройка межсетевого экрана: разрешить HTTP-трафик
iptables –A INPUT –i eth0 –s 192.168.2.0/24 –j DROP Настройка межсетевого экрана: принимать все входящие пакеты на eth0 из сети 192.168.2.0

Табл. 17-4. Примеры команд iptables.

С помощью iptables можно создать сложную систему правил, управляющих прохождением данных через межсетевой экран. Большинство администраторов используют параметр –P для задания правил по умолчанию, а затем настраивают исключения для конкретной сети.

Помните, что правила, созданные с помощью iptables, непостоянны. После перезагрузки системы они будут потеряны. Для сохранения правил используйте команду iptables-save, записывающую таблицы в файл. Восстановить таблицы из файла можно командой iptables-restore.

Давайте потренируемся применять меры сетевой безопасности на Linux-системе в следующем упражнении.

Упражнение 17-2. Применение мер сетевой безопасности на Linux

В этом упражнении вы потренируетесь сканировать открытые IP-порты и реализовывать простой межсетевой экран уровня узла. Для проверки конфигурации межсетевого экрана потребуется вторая система.

Упражнение можно выполнить с использованием виртуальной машины, прилагаемой к книге. Запустите снимок 17-1 для корректно настроенной среды.

Видео. Посмотрите видео «Упражнение 17-2» с демонстрацией выполнения задания.

Выполните следующее:

  1. Загрузите Linux-систему и войдите под учётной записью обычного пользователя.
  2. Откройте сеанс терминала.
  3. Переключитесь на учётную запись root, введя su – и пароль student.
  4. Сканирование системы на предмет открытых портов:
    • В командной строке введите nmap –sT your_IP_address. Какие TCP/IP-порты используются в вашей системе?
    • В командной строке введите nmap –sU your_IP_address. Какие UDP/IP-порты используются в вашей системе?
    • С удалённой системы выполните ping вашей Linux-системы и убедитесь, что она отвечает.
    • Откройте сеанс терминала.
    • В командной строке выполните su – до root.
    • Настройте ядро на использование фильтра iptables, введя modprobe iptable_filter в командной строке.
    • Просмотрите текущие правила для таблицы filter, введя iptables –t filter –L.
    • В командной строке введите iptables –t filter –A INPUT –s 0/0 -p icmp –j DROP. Эта команда создаёт правило, отбрасывающее все входящие пакеты ICMP-протокола из любого источника, адресованные локальной системе.
    • Просмотрите новое правило, введя iptables –t filter –L. В цепочке INPUT должно появиться следующее правило:

      DROP           icmp --     anywhere                    anywhere
      

    Настройка простого межсетевого экрана с помощью iptables:

    • С удалённой системы выполните ping IP-адреса вашей Linux-системы. Пакеты должны отбрасываться, как показано в следующем примере:

      Pinging 192.168.1.10 with 32 bytes of data:
      Request timed out.
      Request timed out.
      Request timed out.
      Request timed out.
      

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