Шокирующая уязвимость домашних сетей.
Автор: © Jan Stumpel
|
1. ВведениеДо недавнего времени я уделял мало внимания безопасности моей домашней сети, на то было несколько причин:
Как я это обнаружил ? Чтобы подготовиться к тому счастливому дню, когда постоянное, высоко-скоростное соединение с Интернет будет доступно в нашем районе, я решил что будет хорошей идеей начать разбираться с безопасностью. Результаты меня шокировали. Первый шок я испытал взглянув на долгое время игнорируемые мной файлы /var/log/syslog*. Несколько записей 'refused connect from' (в соединении с адреса отказано). Одно соединение по ftp ('connect from'), которое очевидно было успешным. Уппс. Кажется пользователи интернет соединяющиеся по dial-up не оставлены кракерами без внимания. И моя безопасность не непробиваемая. Лучше потратить немного времени, взглянув на безопасность по-настоящему. И попытаться на сей раз понять некоторые её аспекты. Это означает чтение книг, FAQ, HOWTO и множество статей в Web; и проведение некоторых экспериментов. Эта статья результат моих изысканий. Помните: Я не эксперт, а всего лишь дилетант, домашний пользователь, пытающийся заставить всё работать как надо. Я не гарантирую правильность или работоспособность ничего из описанного здесь. 2. СистемаУ меня очень простая домашняя сеть, состоящая из двух машин:Содержимое /etc/hosts на heaven, и c:\windows\hosts на earth, таково: 127.0.0.1 localhostЭто показывает, что моя сеть использует имя домена my.home. Это имя не зарегистрировано и предназначено только для локального использования. Адреса 'message from (сообщение от) ' и 'envelope from (перенаправлена)' , в почте отправляемой во внешний мир, будут преобразовываться (в выпусках LG за Июль и Сентябрь, 1999, я описывал как сделать это). 3. 'Частные' домашние сетиВ моём понимание, безопасность - это иметь частную сеть. Под этим я понимаю сеть, которая не предоставляет каких либо внешних сервисов. Она не предоставляет WWW страницы или файлы. Вы не можете войти в неё при помощи telnet. Она даже не слушает запросы извне. Если кто-то попытается соединиться, то не получит ответа. Эта идея недавно была развита Sander Plomp , серия статей которого послужила основой для этого фрагмента.Сеть LAN, которая не соединена с интернет, по определению является частной сетью. Но это не тот тип частной сети, который я имею в виду. Я хочу использовать сеть, посылать и принимать почту, ходить по Web, загружать файлы и т.д. Я просто не хочу чтобы кто-то извне входил в мою сеть. Линукс системы в общем случае не являются частными сетями. По умолчанию, процедура инсталляции дистрибутива Линукс устанавливает всевозможные виды сетевых сервисов (таких как telnet,ftp,finger, и т.д.), которые доступны всем в мире, защищённые при этом (если вообще) лишь паролем. Также, LAN построенные на основе Microsoft Windows в общем случае не являются частными. Соедините между собой два Win95 компьютера и включите 'file sharing' (разделение (совместное использование) файлов), и весь мир сможет разделить с вами ваши файлы, пока вы подключены к интернет :). Чтобы сделать не-частные сети безопасными, используются различные приемы; пароли и другие методы обеспечения безопасности, которые обсуждались в Linux Gazette множество раз, такие как tcpd (врапперы для tcp, использующие псевдонимы) и фильтрация пакетов на уровне ядра (с ipchains в качестве пользовательского интерфейса). Эти методы могут придать некоторую безопасность системе, которая обязательно должна предоставлять общедоступные сервисы. Они похожи не стражей у дверей, поставленных там, чтобы удерживать нежелательных персон, в то же время пропуская желаемых клиентов. Но зачем здесь вообще двери? Я не хочу, чтобы меня посещали. Моя сеть частная! Если у нас есть запущенные серверы, доступные из внешнего мира, нам всегда придётся беспокоиться о том, не сделали ли мы какой либо ошибки в конфигурации, которая может послужить основой для взлома. Также, программы серверы часто имеют ошибки в них самих, которые предоставляют кракерам возможность для проникновения. Одна из таких была недавно найдена в named. ОК, он был позднее исправлен, так что люди, имеющие последнюю версию named могут не беспокоиться об этой ошибке. Но как насчёт следующей ? Лучше вообще не иметь никаких дверей! Если вы действительно хотите сделать доступными некоторые сервисы (например распространение mp3 или что-то ещё), для компьютеров вне дома, вы должны овладеть более продвинутыми способами соблюдения безопасности. Но если вы просто хотите иметь дома частную сеть, читайте дальше. 4. Насколько безопасна ваша сеть ?Чтобы проверить безопасность домашней сети, вы можете просканировать её извне, например при помощи Secure Design. Щелкните на 'scan me now' и 'basic scan' (просканируйте меня сейчас и простое сканирование). Попробуйте сканирование как со шлюзовой машины, так и с других машин вашей сети. Когда я сделал это, то получил второй "шок". Это было впечатляюще. Длинный список показывающий возможные точки входа в мою систему: сервисы по разделению файлов Samba, telnet, сервис печати, X, почтовый сервер, ftp, finger и т.д. У меня были некоторые рудиментарные меры безопасности, таким образом система была в какой то мере защищена от серьёзного вторжения (я надеюсь). Но я считаю брешью в моей безопасности то, что внешний мир знает о наличии у меня почтового сервера (даже он один даёт возможности для проникновения). Эти сервисы предназначались для использования в моей домашней сети. И они в любом случае не для внешнего мира.Итак: вы просканировали свою систему! Кроме Secure Design, существуют также другие сервисы сканирования , например Shields Up!, DSL Reports, Sygate Online Services, и многие другие. Множество подобных сервисов можно найти на Австрийском сайте, Sicherheit im Kabelnetzwerk ('Безопасность в кабельных сетях'; там также есть и почти аналогичная английская версия). Используйте несколько сканирующих сервисов. Распечатайте результаты. Что из себя представляет это 'сканирование', я надеюсь станет понятно в ходе чтения статьи. Вы также можете 'просканировать' вашу систему самостоятельно, вызовом команды ( после su root) netstat -pan --inet. Используйте широкое окно xterm, когда будете делать это, т.к. вывод состоит из довольно длинных строк. Программы, которые имеют 0.0.0.0 в графе 'Local Address' (Локальный адрес) видны всему миру ! 5. Серверы и клиентыРазличие между серверами и клиентами не всегда понятно пользователям. Если вы хотите использовать ftp, например (чтобы получать и выкладывать файлы на другой компьютер) вы используете ftp клиент чтобы соединиться с другим компьютером. Если это всё, что вы хотите от ftp, то кроме программы ftp-клиента, вам больше ничего не понадобиться. Ftp сервер нужен, только если вы хотите, чтобы другие пользователи могли получать файлы с вашего компьютера или класть их туда. Аналогично с telnet: программа клиент для вашего собственного использования, программа сервер для использования другими людьми. Программы клиент и сервер совершенно различны имеют разные названия; например /usr/bin/telnet для telnet клиента, /usr/sbin/in.telnetd для сервера. Для новичков различие не всегда ясно. Если программа установки Линукс спрашивает 'хотите ли вы установить ftp сервер?', пользователи могут подумать 'эээ ... да, я конечно хочу использовать ftp, так что давайте'. Часто вас даже не спрашивают, а устанавливают ftp сервер по умолчанию.Один из путей создания частной сети - это не устанавливать вообще никаких серверов, только клиенты. Но это слишком просто, если вы имеете дома сеть соединяющую два или более компьютеров. Внутри вашей сети вы хотите заходить с одной машины на другую при помощи telnet, вы хотите иметь внутренний почтовый сервис, и т.д. Другими словами вам не обойтись без серверов. Основное занятие серверов - слушать. Они ждут сигнала который скажет: мне нужен твой сервис. Сигнал (по крайней мере для TCP-основанных сервисов) это специальный IP пакет, называемый SYN пакетом, который попадает на ваш компьютер и указывает номер сервиса. Например, номер telnet сервиса (номер которого ждёт программа in.telnetd, если она запущена) 23. Эти номера обычно называют номерами портов. Если программа in.telnetd не запущена, никто не слушает SYN пакетов с номером 23. Т.е., как говорят, 'порт 23 закрыт'. Порты не существуют сами по себе, как маленькие двери в ваш компьютер, которые вы можете открыть или закрыть. Порт открыт, если какой-то из серверов слушает его. В любом другом случае он закрыт. TCP порт существует только если есть программа которая слушает его, иначе он не существует !. Как SYN пакеты попадают в ваш компьютер ? В случае с heaven, пакет может попасть внутрь тремя разными путями: Было бы прекрасно, если бы все программы-серверы доступные на Линукс системах, имели опцию указывающую к какому из интерфейсов они должны прислушиваться. В этом случае мы могли бы просто сказать серверам не прислушиваться к ppp соединению, и все было бы как надо. Не понадобились бы какие либо меры безопасности (tcpd,firewall и т.д.); вы бы использовали их только для 'полноты' безопасности, как дополнительную предосторожность. Может быть это и случиться когда-нибудь, на на сегодняшний момент только несколько серверных программ имеют такую опцию ( включая важные exim и samba). Поэтому нам придётся сделать несколько вещей, чтобы наша сеть стала частной: 6. Удаление ненужных сервисов6.1 Ненужные сервисы inetdВо-первых, есть несколько сервисов, которые запускаются из inetd.conf. Почти все Линукс системы имеют супер-сервер называемый inetd, его работы заключается в том, что он слушает множество портов сразу и 'пробуждает' сервисы, когда это необходимо. Однако он также пробуждает и сервисы которые вам не нужны.Примерами ненужных сервисов могут служить: 6.2 Другие ненужные сервисыЕсли сервис не пробуждается при помощи inetd, он запускается независимо, как 'демон' или фоновая программа. Среди демонов, которые вам не понадобятся, кроме portmapper (если он запускается как демон) , локальный nameserver (сервер имён) (named, произносится name-dee). Не существует причины по которой небольшая домашняя сеть должна поддерживать такую вещь. /etc/hosts и C:\windows\hosts на ваших машинах, и адреса name серверов вашего ISP в /etc/resolv.conf, решат проблему поиска адресов в вашей сети.Обычно существует команда, которая предотвращает автоматический запуск сервера во время загрузки, путём удаления его из директорий начальной инициализации; например я избавился от сервера tamagotchi, автоматически установленный Debian 2.1, выдав команду update-rc.d -f /etc/init.d/tama remove 7. Обеспечение безопасности желаемых сервисов: не-inetdТеперь мы примемся за сервисы, которые мы хотим использовать, но не хотим, чтобы их видели из внешнего мира. Часто существуют опции конфигурации, которые делают сервис 'частным'. Примеры приведены далее.7.1 XСистема X была сконструирована как ориентированная на сеть оконная система, но на самом дела сетевые возможности никогда не используются в большинстве установок, и представляют угрозу безопасности. Вы можете избавиться от сетевых возможностей X, путём запуска X с опцией командной строки: startx -- -nolisten tcp. Теперь Secure Design не будет указывать в отчёте, что 'X11' открыты'. Чтобы сделать это постоянным, вы можете сделать синоним для startx (в ~/.bashrc, /etc/profile, или в другом подходящим для этого месте):alias startx="startx -- -nolisten tcp"Команда -nolisten tcp на самом деле должна быть в одном из файлов ресурсов X11, но я до сих пор не нашёл в каком. В любом случае способ с 'alias' работает. Чтобы протестировать, запустите (как root) netstat -pan --inet. X теперь не должны упоминаться в списке. Конечно, было бы лучше, если бы могли сохранить сетевые возможности X в рамках локальной сети, блокировав только доступ извне, но я не нашёл способа сделать это. 7.2 SambaВ Debian основанных системах, файл конфигурации для Samba это /etc/samba/smb.conf (на других системах, это может быть /etc/smb.conf). Когда я устанавливал Samba, я выбрал 'let Samba run as daemon' (позволить Samba запускаться в качестве демона); она не работала правильно из inetd. Любые строки относящиеся к netbios (который использует Samba) в /etc/inetd.conf должны быть предварительно закомментированы. Затем в /etc/samba/smb.conf, в секции [global], я добавилbind interfaces only = TrueПосле /etc/init.d/samba restart, демоны Samba 'слушают' только нашу домашнюю LAN. Они больше не видны остальному миру. Проверьте это при помощи netstat -pan --inet, и сканирования системы. 7.3 EximExim это почтовый сервер (или Mail Transport Agent, MTA (агент по пересылке почты)), используемый на моей системе. Вы можете использовать что-то другое (например sendmail или postfix), но при этом сохраняется тот-же принцип: ваш 'частный' почтовый агент не должен 'слушать' внешний мир. Люди, которые посылают вам почту, и другим пользователям в вашем доме, посылают её на почтовые ящики у ISP (или на несколько почтовых ящиков у разных ISP). Вы получаете её оттуда используя fetchmail или ему подобную программу. Люди не могут посылать почту в вашу сеть напрямую.У Exim есть опция local_interfaces(локальные интерфейсы) (которая находится в секции MAIN CONFIGURATION файла /etc/exim.conf). Это список (IP адресов) интерфейсов, которые будет слушать exim. Это работает только когда exim запущен как демон, независимо от inetd. Что настроить эту возможность: local_interfaces = 192.168.1.1:127.0.0.1 (кроме локальной сети, можно указать также и loopback интерфейс,иначе fetchmail не сможет работать; или вы должны использовать следующий синтаксис fetchmail -S имя вашей машины). 7.4 JunkbusterJunkbuster это http proxy сервер, который вы можете сконфигурировать так, чтобы не пропускать рекламу и нежелательную информацию. Он отлично делает своё дело. В Debian основанных системах, он слушает порт 5865, в других системах порт 8000. Это устанавливается в файле /etc/junkbuster/config. По умолчанию, junkbuster слушает все интерфейсы (другими словами весь мир). Однако вы можете установить в конфигурационном файлеlisten-address 192.168.1.1:5865 и теперь только машины в вашей собственной сети смогут присоединиться к нему ( включая машину-шлюз, на которой запущен junkbuster, heaven в данном случае, имя heaven вводится в 'Preferences/Advanced/Proxies' в меню Netscape, не localhost). 7.5 Другие (не-inetd) сервисыПриведённые выше примеры единственные. Если на вашей системе работают другие сервисы, вне inetd, проверьте их документацию на предмет того, как сделать их 'частными'. Например sendmail можно заставить слушать только локальную сеть, при помощи:0 DaemonPortOptions=Addr=192.168.1.1 в файле sendmail.cf. Но я не проверял это ! 7.6 Оставшиеся проблемные случае, наподобие lpdlpd остаётся проблемой. Его нельзя заставить слушать только внутреннюю сеть. Проще говоря необходимо заменить его на что-нибудь безопасное. Sander Plomp рекомендует заменить его на pdq. До сих пор я ленился сделать это, но я обязательно уделю этому своё внимание в ближайшем будущем.Могут остаться и другие проблемные случаи: сервера, которые нужны вам в вашей сети, но которые нельзя сделать 'частными', и для которых не существует подобных альтернатив. У меня есть такая проблема с cannaserver, системой для ввода японских символов с клавиатуры. Такие сервисы должны быть экранированы от внешнего мира, при помощи firewall, фильтрующей пакеты. См. секцию 10 этой статьи. 8. Маскировка сервисов inetd через xinetdНа текущий момент список видимых сервисов системы, согласно Secure Design, стал таким:8.1 Замена inetdДля сохранения безопасности домашней сети необходимо заменить inetd на что-нибудь, что может различать запросы к сервисам исходящие из локальной сети и извне. Plomp рекомендует tcpserver; Я же попробовал: xinetd. Сначала убейте inetd, затем установите xinetd. Важно знать что: Скрипт Debian /etc/init.d/xinetd запускает не только сам xinetd демон, но также и portmapper. Мы не хотим использовать portmapper, который используется для RPC вызовов и NFS, которые мы не используем. Так что всё относящееся к portmapper в /etc/init.d/xinetd должно быть закомментировано (# в начале строки).Один из способов сконфигурировать xinetd для telnet и pop3 это поместить следующие строки в /etc/xinetd.conf: defaults
service telnet
service pop-3
Таким образом, кроме общей секции 'defaults' (установки по умолчанию), которая описывает интерфейс, есть отдельные секции для каждого сервиса, который вы хотите запускать. Хотя формат совершенно отличен, данные для различных секций могут быть найдены в вашем inetd.conf. См. также man xinetd.conf. Я запустил xinetd и убедился, что теперь возможно зайти на heaven при помощи telnet как с самого heaven, так и с earth. Итак, Secure Design больше не указывает, что моя система имеет открытые telnet и pop3 порты ! Победа ! ПРИМЕЧАНИЕ: на моей собственной машине telnet heaven проходит успешно, а telnet localhost нет. xinetd может производить привязку (bind) только к одному интерфейсу в один момент времени; в данном случае к 192.168.1.1, но не к localhost (loopback интерфейс 127.0.0.1). К этому времени, все другие сервисы в /etc/inetd.conf были закомментированы. Поэтому inetd больше не нужен и можно от него избавиться. На Debian основанной системе, это можно сделать так: update-rc.d -f /etc/init.d/inetd removeЕго место занял xinetd: update-rc.d xinetd defaultsOK; сделан ещё один шаг в обеспечении безопасности. Вывод netstat -pan --inet выглядит примерно так: heaven:~# netstat -pan --inet
Практически все сервисы теперь слушают локальный интерфейс. Исключение составляет система печати: она слушает по адресе 0.0.0.0(т.е. везде) на порту 515. Теперь при сканировании системы будет упомянут как открытый только порт 515. На самом деле, некоторые сервисы сканирования, ориентированные на Windows, будут сообщать, что система полностью закрыта, т.к. они не сканируют порт 515. 9. Что насчёт IP Masquerading?Годами я использовал IP Masquerading, чтобы дать Windows системе в моём доме доступ в интернет. Вернее я так думал, пока однажды, в ходе моих изысканий связанных с безопасностью системы, я не отключил Masquerading, Windows система могла использовать интернет как и раньше.В чём дело? Просто earth, Windows машина, использовала всего три вещи связанные с интернет: Чтобы отключить IP masquerading и перенаправление (forwarding), в Debian, вам нужно сделать следующее: 10. Закрываем последние двериДавайте просуммируем всё сделанное нами: избавившись от ненужных сервисов, переконфигурировав другие, так чтобы они не слушали шлюзовый интерфейс, завернув другие в xinetd, и выключив Masquerading, мы уже создали достаточно безопасную систему, без firewall. Теперь время добавить финальный штрих: мы создадим вокруг нашей системы firewall для фильтрации пакетов, при помощи ipchains. Это должно быть последним шагом, а не первым.Часто можно прочитать совет 'сконфигурировать ipchains так, чтобы всё было блокировано по умолчанию', и затем сделать исключения для вещей, которые вы хотите разрешить. Возможно теоретически это и правильно, но на практике это может привести к разочарованию. Если всё заблокировано, ваша система просто откажется работать. Вы всё равно будете в той или иной степени в темноте, решая что разрешить. Так что по умолчанию я разрешил всё и добавлял ограничения одно за другим. Если система ломается (т.е. нет ping или невозможно просматривать Web страницы) после добавления очередного ограничения, значит оно было слишком радикальным и его необходимо отменить. Установка политики по умолчанию для цепи на DENY (отказать) или REJECT (отклонить) должна быть последним шагом, а не первым. Я начал с разборки firewall (ipchains -F) и запуска простейшего firewall скрипта с одним правилом: #!/bin/sh
ipchains -F input
Это блокирует SYN пакеты приходящие из внешнего интерфейсы,существенно повышая безопасность системы. Никто извне не может инициализировать соединение; внешние сканирующие сервисы сообщают, что сайт полностью закрыт (некоторые теперь могут даже назвать его 'скрытым' или 'невидимым'). Но мы можем добавить дополнительные ограничения. Т.е., мы можем использовать более общие DENY/REJECT правила и более точные ACCEPT правила. Перед тем, как вы добавите ограничения, будет полезно провести некоторые эксперименты. Вы можете создать правила типа ipchains, которые пропускают пакеты и ведут их лог (-j ACCEPT -l). Таким образом даже если вы не знаете (как например я), какие пакеты блокировать, вы можете посмотреть, что происходит 'обычно', держа открытое окно с tail -f /var/log/syslog в нём. Позже вы можете создать правила, чтобы блокировать 'ненормальные' пакеты. Я очень рекомендую вам провести собственные эксперименты и создать правила основываясь на вашем собственном понимании. После нескольких таких экспериментов, мой firewall скрипт в /etc/ppp/ip-up.d выглядит следующим образом. Это подразумевает что не запущен сервер имён, но у вас есть адреса ДВУХ серверов имён, предоставленные вашим ISP, в /etc/resolv/conf. Помните о важности обратных скобок (`)! Они могут исчезнуть, при копировании информации с этой страницы. #!/bin/sh
# Находим адреса внешних серверов имён
# устанавливает входные (INPUT) правила
# блокируем вход извне, с фиксированных диапазонов адресов
# Блокируем TCP соединения извне
# Блокируем все UDP пакеты, за исключением ответов серверов имён
# Разрешаем (пока) но ведём протокол всех ICMP пакетов
# Из локальной сети разрешаем только пакеты адресованные нам и широковещательные
# Устанавливаем выходные (OUTPUT) правила
# Не посылать пакеты на зарезервированные диапазоны адресов
# Блокировать все UDP пакеты кроме запросов к серверам имён
# Разрешить (пока) ICMP во внешний мир, но вести протокол
# У нас нет правил перенаправления (FORWARD); перенаправление отключено Такой firewall (который вы должны адаптировать к вашим персональным вкусам и нуждам) создаст дополнительную 'оболочку' вокруг вашей системы. Но ваша безопасности не должна зависеть от firewall; Единственная причина этому - то, что firewall'ы очень сложные штуки и слишком легко сделать ошибку при работе с ними. Сначала можно сделать множество других вещей, чтобы гарантировать безопасность вашей сети. 11. Ссылки и дополнительные материалы
|
Copyright © 2001, Jan Stumpel. Copying license http://www.linuxgazette.com/copying.html Published in Issue 65 of Linux Gazette, April 2001 |
Вернуться на главную страницу |