LXF121:Defend

Материал из Linuxformat.

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

Содержание

Безопасность: Для вашего сервера

Мартин Мередит научит вас управлять портами, разбираться с уязвимостями и отбивать хакеров, норовящих пролезть к вам в систему.

В былые времена телефонных модемов Интернет в основном содержал библиотечные каталоги, военные секреты и студенческие страницы с похождениями для Dungeons & Dragons. Ныне существуют сайты для людей, их домашних питомцев, друзей, семьи и бизнеса. Большинство людей охотно пользуются бесплатным хостингом или платят компаниям за размещение своих сайтов, но подлинные web-мастера предпочитают выделенный или виртуальный частный сервер [Virtual Private Server, VPS].

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

Защищены ли вы?

Каждая служба, к которой вы подключаетесь в Интернете, пользуется своим портом. Например, соединяясь с web-сайтом, вы используете порт 80 (или порт 443 для HTTPS), а подключаясь по SSH – порт 22. FTP использует порт 21, IMAP – порт 143, и так далее. Когда сервер запущен, он открывает эти порты и ждет входящих соединений.

Но как это отражается на вас? Владея сервером, вы можете иметь несколько разных работающих служб – может быть, у вас будут службы базового стека LAMP или электронной почты. Эти службы, как правило, открывают свои порты для всех пользователей Интернета, что не всегда хорошо.

В качестве примера исследуем свежеразвернутый сервер с помощью программы nmap. Она обычно имеется в менеджере пакетов, или в крайнем случае по адресу http://nmap.org. Установив nmap, запустите ее с адресом вашего сервера, чтобы получить примерно такой вывод:

mez@lazy: % nmap torpor
Starting Nmap 4.76 ( http://nmap.org ) at 2009-05-04 11:56 BST
Interesting ports on torpor:
Not shown: 984 closed ports
PORT STATE SERVICE
22/tcp open ssh
25/tcp open smtp
53/tcp open domain
80/tcp open http
110/tcp open pop3
143/tcp open imap
993/tcp open imaps
1234/tcp open hotline
3306/tcp open mysql
10000/tcp open snet-sensor-mgmt
Nmap done: 1 IP address (1 host up) scanned in 3.46 seconds

Результат: nmap выявил 10 портов, доступных в Интернете всем подряд. Большинство из них и должны быть открыты, если сервер, например, предоставляет SSH или почту. Однако, скажем, к MySQL доступ из Сети совершенно лишний, а некоторые порты (в частности, 1234) вообще открыты непонятно кем и зачем.

Меня кто-то слушает?

Скорая помощь

Запуск netstat -pnl от имени root сообщит вам, какие программы слушают порты.

Итак, как мы увидели выше, не всегда можно сказать, кто прослушивает определенный порт. Быстрый поиск в Google разъяснит нам, что порт 1234 облюбовали всякие паразиты типа троянов, а значит, придется провести расследование и выяснить, что происходит и почему данный порт стоит открытым.

Простейший способ узнать, какие программы слушают порты – вызов команды netstat. Запуск ее без параметров предоставит список открытых в данный момент соединений. Но нам-то хотелось бы узнать, какая конкретная программа прослушивает конкретный порт (наш 1234).

Для ее поиска запустим netstat -pnl от имени root. Выдастся на первый взгляд бессмысленный список, но нас интересуют в нем только две колонки. Номер порта нам известен; найдем колонку с именем Local Address, а в ней – запись, оканчивающуюся на этот номер, :1234 (двоеточие разделяет IP-адрес и номер порта). Подходящая строка выглядит так:

tcp 0 0 0.0.0.0:1234 0.0.0.0:* LISTEN 24481/php-cgi

В последней колонке – искомая программа. Итак, php-cgi слушает все IP-адреса на сервере (0.0.0.0 означает все IP) для любых подключений. PHP – это скриптовый язык, и здесь он установлен в режиме Fast CGI для прослушивания порта 1234.

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

Насаждающий законы

Вы видите эту диаграмму раньше, чем я про нее рассказал — все и вправду так просто

Доступный по умолчанию во всех современных дистрибутивах, iptables – это ответ Linux на все ваши запросы к брандмауэру (или межсетевому экрану). Он располагается между компьютером и Интернетом, разрешая или запрещая трафик, поступающий в ваш сервер или из него, на основе набора правил iptables.

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

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state -- state RELATED,ESTABLISHED –j ACCEPT
-A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
-A INPUT -p tcp -m tcp -- dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp -- dport 25 -j ACCEPT
-A INPUT -p tcp -m tcp -- dport 53 -j ACCEPT
-A INPUT -p udp -m udp -- dport 53 -j ACCEPT
-A INPUT -p tcp -m tcp -- dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp -- dport 110 -j ACCEPT
-A INPUT -p tcp -m tcp -- dport 143 -j ACCEPT
-A INPUT -p tcp -m tcp -- dport 993 -j ACCEPT
-A INPUT -p tcp -m tcp -- dport 10000 -j ACCEPT
-A INPUT -s 192.168.1.3 -p tcp -m tcp -- dport 3306 -j ACCEPT
-A INPUT -p icmp -m icmp -- icmp-type 0 -j ACCEPT
-A INPUT -p icmp -m icmp -- icmp-type 8 -j ACCEPT
COMMIT

*filter говорит нам, к какой таблице обращаются эти правила. Мы здесь займемся только таблицей фильтрации, но есть и другие таблицы, для настройки, например, NAT (Network Address Translation), маршрутизации и так далее.

Следующие несколько строк, содержащие [0:0], устанавливают политики по умолчанию для цепочек в iptables. Используя iptables, мы в основном работаем с тремя цепочками:

  • INPUT для всех входящих соединений,
  • FORWARD для всех соединений, пересылаемых на другие сервера (ими мы заниматься не будем), и
  • OUTPUT для всех исходящих соединений.

Политики для этих цепочек могут быть установлены как ACCEPT, DROP или REJECT, что означает разрешить соединение, игнорировать соединение или отослать назад код ошибки, говорящий, что порт не открыт. Здесь мы по умолчанию установим цепочки INPUT и FORWARD в DROP для всех соединений, а цепочку OUTPUT – в ACCEPT. Однако умолчания применяются только тогда, когда пакет не соответствует ни одному из правил, и следует задать несколько исключений.

Прежде чем это сделать, упомянем о финальной строке, COMMIT: она велит iptables применить правила к брандмауэру. В этом пункте ваш межсетевой экран активируется и встанет на стражу сервера.

Заткнем дыры

Строки, начинающиеся на -A INPUT, устанавливают правила брандмауэра. Здесь они записаны так, как если бы вы вызывали iptables напрямую, но без имени iptables в начале команды. Подробную информацию о том, как писать правила, ищите в man-странице iptables.

Каждое правило начинается с -A INPUT, чтобы iptables применил его к цепочке входящих пакетов. Если мы хотим применить правило к исходящим соединениям, вместо INPUT надо поставить OUTPUT. После этого идет описание пакетов, подпадающих под правило, и заканчивается строка на -j ACCEPT, чтобы iptables присоединил пакет к цепочке ACCEPT – другими словами, пропустил его. Если мы хотим применить для пакета REJECT или DROP, то вместо ACCEPT так здесь и запишем. Теперь рассмотрим строку

-A INPUT -m state -- state RELATED,ESTABLISHED -j ACCEPT

которая велит iptables разрешить любые соединения, которые установлены (ESTABLISHED) или связаны (RELATED) с установленными. Это хорошее правило, поскольку оно разрешает продолжить любые уже созданные соединения – к примеру, существующее SSH-соединение будет оставаться активным, если вы используете SSH для изменения правил брандмауэра. Оно разрешает также входящие соединения, имеющие отношение к исходящим соединениям (TCP работает в обоих направлениях, и без этого правила может оказаться, что вам недоступны исходящие соединения с компьютера).

Следующая за ней строка разрешает iptables принимать любые соединения, выполняемые с 127.0.0.1 (-s означает IP-адрес источника) на 127.0.0.1 (-d ccылается на IP-адрес получателя); это можно перевести как «принимать любые соединения от самого себя».

Скорая помощь

Вы можете запускать правила брандмауэра при старте системы, добавив команду iptables-restore в /etc/rc.local.

В следующих девяти строках мы открываем порты, нужные нам для связи с внешним миром. Заметьте, что у нас нет разрешения доступа к порту 3306 (MySQL) и 1234 (ошибочная конфигурация PHP): оно учтено в правиле брандмауэра, позволяющем локальные соединения. А вот что не мешает добавить – это сброс всех внешних попыток доступа к MySQL, такого вида:

-A INPUT -s 192.168.1.3 -p tcp -m tcp ----dport 3306 -j ACCEPT

Здесь IP-адресу 192.168.1.3 разрешено присоединяться к порту 3306, потому что в нашей локальной сети есть еще один сервер, нуждающийся в доступе к MySQL.

Две строки прямо над COMMIT позволяют серверу распознавать пинги и включают отправку ответов на них.

После сохранения файла (куда нибудь типа /etc/iptables.conf) можно запустить команду

iptables-restore < /etc/iptables.conf

включив правила брандмауэра, написанные ранее. Повторно запустив nmap, мы получим следующий результат:

mez@lazy: % sudo nmap torpor
Starting Nmap 4.76 ( http://nmap.org ) at 2009-05-04 11:56 BST
Interesting ports on torpor:
Not shown: 984 filtered ports
PORT STATE SERVICE
22/tcp open ssh
25/tcp open smtp
53/tcp open domain
80/tcp open http
110/tcp open pop3
143/tcp open imap
993/tcp open imaps
10000/tcp open snet-sensor-mgmt
Nmap done: 1 IP address (1 host up) scanned in 10.30 seconds

Заметим, что вывод теперь сообщает, что отфильтрованные порты не показываются взамен закрытых (строка 4). Также может оказаться, что nmap надо запустить от имени root – в нашем тесте эта конфигурация брандмауэра работала чересчур бдительно, и nmap не видел все открытые порты, пока его не запускали от имени root.

Скажи «Пароль»!

Даже с применением многочисленных мер безопасности все еще сохраняется шанс, что кто-то взломает ваш сервер, просто угадав пароль! Существуют скрипты, которые, применяя словарь, могут перебрать все возможные комбинации имени пользователя и пароля за относительно короткое время. [имеется ввиду что перебираться будут комбинации наиболее популярных имен пользователей и паролей]

Fail2ban (http://www.fail2ban.org) пробует предотвратить это, отслеживая наличие сбоев входа в файле журнала. Обнаружив, что кто-то несколько раз подряд безуспешно пытается войти, он на некоторое время запрещает такому старателю доступ на сервер (используя брандмауэр).

Это, конечно, не слишком понравится тем, кто регулярно забывает пароль, зато остановит попытки лобовых словарных атак на ваш сервер.

Что такое Nessus?

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

Установив Nessus и nessud с помощью вашего менеджера пакетов, создайте пользователя. Запустите команду nessus-adduser и следуйте инструкциям на экране. Теперь запустите клиент Nessus (его можно найти в Ubuntu в меню Приложения > Интернет > Nessus).

Запущенный Nessus работает со списком модулей расширения, которые предназначены для проверки уязвимостей. Так как новые уязвимости находят каждый день, Nessus необходимо постоянно обновлять. Tenable Network Security, создатель Nessus, имеет два разных списка модулей – HomeFeed и ProfessionalFeed. ProfessionalFeed предоставляет более свежий список, включая самые последние уязвимости, которые можно протестировать сразу же после появления соответствующего модуля. Правда, ProfessionalFeed стоит 1200 долларов США, и если вы работаете с Nessus не в режиме ежедневных проверок и не в сверхсекретном учреждении, HomeFeed будет достаточно.

Для скачивания своих модулей Tenable требует регистрации, которую можно произвести на http://linkpot.net/enviably. После этого запустите команду nessus-fetch ----register <ваш регистрационный код>, где нужно вставить код, полученный на вашу электронную почту после регистрации.

Настроив и загрузив программу, вы можете обнаружить, что основное окно Nessus немного запутано. Чтобы вы не блуждали в нем бездумно, мы покажем, как выполнить простое сканирование.

Первым делом зайдите на сервер с данными, которые вы задали ранее. После подключения перед вами предстанет окно Plugins. Это список скриптов, которые Nessus попытается запустить. Нажмите на кнопку Select All и переключитесь на вкладку Scan Options. Здесь находятся основные параметры сканирования.

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

Наконец, задайте имя или IP-адрес сервера на вкладке Target, а затем уступите место Nessus простым нажатием Start The Scan и ждите, пока программа сделает все остальное.

Завершив сканирование, Nessus представит вам отчет с указанием перечня найденных проблем. Многие сообщения Nessus относятся к информационным, типа «у вас есть работающий SSH-сервер», но сообщения особой важности помечаются красной иконкой STOP рядом с ними. Найдя уязвимости, Nessus подскажет вам, как их исправить (или направит в такое место, где можно узнать решение). В случае критических проблем вы должны действовать немедленно.

Поставить растяжку

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

Итак, что же делать, если гарантией безопасности является только отключение системы – или, по крайней мере, отключение от Интернета? На тот момент, когда хакер уже влез в вашу систему, вы все еще можете, как минимум, убедиться в его присутствии. Это позволит сделать система обнаружения вторжений (IDS), хотя мы надеемся, что она вам никогда не пригодится.

Сейчас самая известная IDS – это Tripwire, которая разрабатывается с 1992 года. В данный момент существуют три программы с таким именем, и все они делают одно и то же. И только одна из них относится к открытому коду. Вы можете найти ее в вашем дистрибутиве или на сайте http://tripwire.sf.net. Tripwire работает, создавая базу данных всех файлов вашей системы и отмечая, когда в них происходят изменения. Из-за особенностей работы системы, лучше всего установить Tripwire до подключения компьютера к Интернету. Если кто-то уже дорвался до вашей машины раньше, чем программа была установлена, то Tripwire в итоге просто даст уверенность, что черные ходы, созданные злоумышленником, остаются в силе.

Установка Tripwire – процесс длительный и выходит за рамки данного урока, но вы можете найти более подробную информацию о процессе на http://www.alwanza.com/howto/linux/tripwire.html и http://www.tripwire.com.

Приглядим за серверами

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

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

Серверы склонны генерировать большой объем информации о происходящем. Посмотрите в директорию /var/log: вы найдете массу журнальных файлов, от системного журнала до журнала доступа Apache. Журналы предоставляют много полезной информации, но определить, что стоит читать, а что нет, не так-то просто.

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

Под Debian и Ubuntu установка и настройка Logwatch проста. Однако чтобы принимать информацию в формате HTML, надо задать метод вывода, выходной формат и адрес электронной почты, куда присылать информацию. Вы можете изменить эти параметры, отредактировав /usr/share/logwatch/default.conf/logwatch.conf, например, так:

Output = mail
Format = html
MailTo = youraddress@yourdomain.net

Отчеты будут поступать на ваш ящик, позволяя вам быть в курсе дел на сервере, где бы вы ни были.

Альтернатива командной строке

На данном уроке мы отвели время на изучение написания правил брандмауэра в командной строке. Однако существуют альтернативы такому подходу. Наш фаворит (и мы регулярно его используем) – это Webmin, инструмент, позволяющий управлять сервером через web-браузер. Если вы установили Webmin на ваш сервер, то найдете опции брандмауэра в Networking > Firewall. Если вы разобрались в рассмотренном здесь создании правил брандмауэра, работа с Webmin будет сродни прогулке в парке. Для начала нажмите Revert Configuration – загрузятся ранее созданные правила брандмауэра. Затем правила можно будет изменять в зависимости от вашей новой установки Webmin. Наконец, покончив с реформами, нажмите Apply Configuration для ввода модифицированных правил в действие. LXF

Личные инструменты
  • Купить электронную версию
  • Подписаться на бумажную версию