Брандмауэры и специальное программное обеспечение 8 Часть 4
Вид материала | Реферат |
- Муниципальное общеобразовательное учреждение средняя общеобразовательная школа №12, 174.77kb.
- Управление экономикой и создание экономических информационных систем Изучив данную, 148.93kb.
- Программное обеспечение ЭВМ, 209.59kb.
- Программное обеспечение вычислительной системы, 824.71kb.
- Учебная программа (Syllabus) Дисциплина: Интерфейсы компьютерных систем (iks 3304), 321.31kb.
- Реферат по Информационной безопасности Тема: «Антивирусы», 711.1kb.
- Пк программный комплекс; по программное обеспечение; ппо прикладное программное обеспечение, 208.41kb.
- Лекция 4 Обеспечивающие подсистемы асу. Математическое, программное, лингвистическое,, 59.3kb.
- Математическое и программное обеспечение систем оперативной оценки характеристик сложных, 247.51kb.
- Учебная программа (Syllabus) Дисциплина «Инструментальные средства разработки программ», 374.12kb.
Заключение
В данной главе приведено краткое описание общеизвестных служб. Также я рассказал вам о том, что такое порты, как они связаны со службами и зачем они вообще нужны. В главе я также рассмотрел утилиту netstat и то, как с ее помощью можно определить порты, используемые в настоящий момент для обмена данными и открытые в ожидании поступлений запросов на подключение. Именно такие порты используются взломщиками для проникновения в вашу систему.
11
inetd, inetd.conf и сетевые атаки
В данной главе рассматриваются следующие вопросы:
- что такое inetd;
- работа с inetd.conf;
- защита от сетевых атак;
- что такое honey pot (горшок меда).
В предыдущей главе уже упоминалось, что система обладает способностью в случае необходимости автоматически запускать серверные программы, которые не были запущены в процессе инициализации системы и не упоминаются в таблице процессов до тех пор, пока кто-либо извне не подключится к ним. Для многих новичков в мире Linux эта возможность является полнейшей загадкой. Каким образом удаленный клиент может обратиться к серверной программе, которая не запущена на сервере? В данной главе вы узнаете об этом, а также поймете, как можно модифицировать поведение системы таким образом, чтобы предотвратить запуск нежелательных служб. В первой части главы рассказывается о том, как происходит запуск служб, которые не запускаются в процессе инициализации, и как можно запретить подобный запуск.
Во второй части главы обсуждаются сетевые атаки. Интернет — это срез нашего общества. Эта среда является как дружественной, так и враждебной, так как в ней, как и в обществе, встречаются совершенно разные индивидуумы. Вы также должны учитывать, что Интернет более глобален, чем общество в радиусе 100 и даже 1000 миль вокруг вас. В Интернете действуют враждебные вам правительства, враждебные вам организации и враждебные вам люди.
inetd
Чтобы понять, как работает inetd, проанализируем вывод команды netstat -а. Интересующие нас элементы этого вывода показаны в листинге 11.1.
Листинг 11.1. Сокращенный вывод команды netstat-a
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 *:6000 *:* LISTEN
tcp 0 0 *:3306 *:* LISTEN
tcp 0 0 *:www *:* LISTEN
tcp 0 0 *:10000 *:* LISTEN
tcp 0 0 *:smtp *:* LISTEN
tcp 0 0 *:sunrpc *:* LISTEN
tcp 0 0 *:swat *:* LISTEN
tcp 0 0 *:finger *:* LISTEN
tcp 0 0 *:imap2 *:* LISTEN
tcp 0 0 *:pop3 *:* LISTEN
tcp 0 0 *:ftp *:* LISTEN
tcp 0 0 *:time *:* LISTEN
tcp 0 0 *:chargen *:* LISTEN
tcp 0 0 *:daytime *:* LISTEN
tcp 0 0 *:discard *:* LISTEN
tcp 0 0 *:echo *:* LISTEN
udp 0 0 *:xdmcp *:*
udp 0 0 *:sunrpc *:*
udp 0 0 *:time *:*
udp 0 0 *:chargen *:*
udp 0 0 *:daytime *:*
udp 0 0 *:discard *:*
udp 0 0 *:echo *:*
raw 0 0 *:icmp *:* 7
raw 0 0 *:tcp *:* 7
Вначале внимание следует обратить на строки, в которых фигурируют не имена служб, а номера портов. Можно видеть, что в системе используются порты с номерами 6000, 3306 и 10000. Почему netstat отображает числа, а не имена служб? Дело в том, что соответствующие порты и службы не упоминаются в файле /etc/services, поэтому netstat отображает их в виде номеров портов.
Попытаемся определить, какие серверные программы используют нумерованные порты. Первым таким портом является порт 6000. В предыдущей главе говорилось, что порты от 6000 до 6010 используются Х-сервером. Вы знаете, что в данный момент на вашем компьютере запущен Х-сервер, поэтому данная запись не должна быть причиной для вашего беспокойства. Порт 3306 используется mysql Так как mysql всегда использует порт с таким номером, вы можете внести соответствующую запись в файл /etc/services, благодаря чему netstat будет снабжать вас более информативным выводом. Наконец, порт 10000 используется программой webmin. И вновь, если вы всегда выделяете этот порт для использования программой webmin, вы можете просто занести сведения об этом в файл /etc/services, тогда в следующий раз вам не придется вспоминать об этом.
ПРИМЕЧАНИЕ
В каждый момент времени некоторый порт может быть связан только с одним процессом. Таким образом, каждый из перечисленных портов обладает одним и только одним связанным с ним процессом.
Все остальные службы в листинге 11.1 отображаются с указанием их символьных имен, так как все они упоминаются в файле /etc/services. Но если вы сравните список серверов, ожидающих соединения, и список серверов, перечисленных в таблице функционирующих процессов, вы обнаружите, что фактически запущенных в системе серверов не хватает. Вы сможете обнаружить сервер, соответствующий порту 80, то есть web-сервер, который в таблице процессов фигурирует под именем httpd. На самом деле вы обнаружите несколько процессов httpd. Вы также обнаружите, что в системе функционирует процесс sendmail, который связан с портом 25 (smtp). Соответствие некоторых других серверов также очевидно. Однако в списке функционирующих процессов нет программ, которые соответствовали бы таким службам, как swat, finger, imap2, рорЗ, ftp и проч. Никаких процессов, соответствующих этим службам, в настоящий момент в памяти компьютера не находится. Каким же образом все эти службы могут ожидать поступления запросов на подключение через определенный порт, если они даже не загружены в память? Попробуйте запустить клиента FTP и подключиться к серверу FTP, якобы ожидающему поступления запроса на подключение на локальном узле. Сервер откликнется на ваш запрос и поприветствует вас. Пока клиент ftp активен, посмотрите на таблицу запущенных процессов. Вы увидите, что в ней появилась запись, соответствующая FTP-серверу.
ССЫЛКА
Процессы httpd подробнее обсуждаются в главе 20 «Установка и запуск защищенного web-сервера Apache».
Что же произошло? На самом деле за поступлением запросов на подключение через все подобные порты следит программа inetd. Когда через один из этих портов поступает запрос на подключение, программа inetd запускает соответствующую серверную программу. Благодаря такому подходу экономятся ресурсы, так как отпадает необходимость постоянно держать в памяти большое количество редко используемых серверных приложений — всего одна небольшая программка следит за поступлением запросов и запускает необходимые для обслуживания клиентов приложения по мере необходимости. Именно поэтому, возможно, вы обратите внимание на небольшую временную задержку между моментом отправления запроса на подключение и появлением на экране приглашения на ввод пароля. Эта задержка проявляется, по крайней мере, в первый раз: в последующем задержка обычно значительно короче. Информация о том, за какими портами следит inetd и какие серверные программы следует запускать в случае поступления запроса через какой-либо из этих портов, содержится в файле /etc/inetd.conf. Отредактировав этот файл, вы сможете настроить работу inetd в соответствии со своими предпочтениями.
СОВЕТ
Далеко не все службы могут быть запущены и должны запускаться при помощи inetd. Для загрузки и инициализации некоторых служб требуется значительное время. Если вы будете использовать inetd для запуска подобных служб, за время их инициализации вы рискуете потерять соединение с клиентом. Прежде чем использовать какое-либо серверное приложение совместно с inetd, внимательно ознакомьтесь с документацией этого приложения.
Не все службы могут быть запущены с использованием inetd, поэтому все те службы, использование которых совместно с inetd оправдано и рекомендуется, уже упомянуты в файле inetd.conf. Многие из этих служб, скорее всего, окажутся для вас ненужными, поэтому вы можете просто отключить их.
Работа с inetd.conf
Чтобы получить возможность запуска служб с использованием inetd, вы должны понимать внутреннее строение файла inetd.conf. Это конфигурационный файл, который используется для включения или отключения служб, соответствующих портам, не связанным ни с одним из работающих в системе серверных приложений. В этом файле перечисляются службы, запускаемые с использованием inetd, а также указывается, какие действия должен предпринять демон inetd в случае, если к одной из этих служб обращается удаленный клиент.
Содержимое файла inetd.conf показано в листинге 11.2 (комментарии переведены на русский язык). Это достаточно сложный конфигурационный файл, содержащий в себе таблицу, каждая запись которой состоит из семи полей.
Листинг 11.2. Содержимое файла /etc/inetd.conf, используемого в составе Caldera OpenLinux no умолчанию
#
# inetd.conf В этом файле описываются службы, запуск которых осуществляется
- при помощи суперсервера INETD TCP/IP. Чтобы перенастроить
- работающий процесс INETD, отредактируйте данный файл, а затем
- передайте процессу INETD сигнал SIGHUP.
#
- Версия: @(#)/etc/inetd.conf 3.10 05/27/93
#
- Авторы: Изначальный код позаимствован из BSD UNIX 4.3/TAHOE.
# Fred N. van Kempen,
#
- Модификацию для Debian Linux выполнил Ian A. Murdock
#
- Модификацию для RHS Linux выполнил Marc Ewing
#
- Дальнейшую модификацию выполнил 0laf Kirch
для Caldera Open Linux
#
#
- Echo, discard, daytime, and chargen используются в основном для тестирования.
#
- Для активации внесенных в файл изменений выполните 'killall -HUP inetd'
#
- Замечание: встроенные службы UDP теперь отбрасывают пакеты для портов < 512.
echo stream tcp nowait root internal
- Модификацию для RHS Linux выполнил Marc Ewing
echo dgran udp wait root internal
discard stream tcp nowait root internal
discard dgram udp wait root internal
daytime stream tcp nowait root internal
daytime dgram udp wait root internal
chargen stream tcp nowait root internal
chargen dgram udp wait root internal
time stream tcp nowait root internal
time dgram udp wait root internal
#
# Это стандартные службы.
#
ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -l -a #telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd #gopher stream tcp nowait root /usr/sbin/tcpd gn #
- smtp следует включать, только если только вы *действительно* знаете, что делаете.
- теперь smtp обслуживается демоном sendmail, но не smtpd. Этот демон
- запускается не отсюда, он запускается во время загрузки из файла /etc/rc.d/rc#.d.
#smtp stream tcp nowait root /usr/bin/smtpd smtpd
#nntp stream tcp nowait root /usr/sbin/tcpd in.nntpd I
# Shell, login, exec и talk являются протоколами BSD.
#
#shell stream tcp nowait root /usr/sbin/tcpd in.rshd #login stream tcp nowait root /usr/sbin/tcpd in.rlogind #exec stream tcp nowait root /usr/sbin/tcpd in.rexecd #talk dgram udp wait nobody.tty /usr/sbin/tcpd in.talkd #ntalk dgram udp wait nobody.tty /usr/sbin/tcpd in.ntalkd #dtalk stream tcp wait nobody.tty /usr/sbin/tcpd in.dtalkd #
# Почтовые службы pop и imap
I
#pop2 stream tcp nowait root /usr/sbin/tcpd ipop2d рорЗ stream tcp nowait root /usr/sbin/tcpd ipop3d imap stream tcp nowait root /usr/sbin/tcpd imapd t
# Служба UUCP для Интернета.
#
#uucp stream tcp nowait uucp /usr/sbin/tcpd /usr/sbin/uucico -l f
- Служба tftp используется в основном для загрузки ОС. В большинстве случаев
- эта служба запускается только на специальных "серверах загрузки".
- Не включайте эту службу, если она вам не нужна.
#
#tftp dgram udp wait root /usr/sbin/tcpd in.tftpd #bootps dgram udp wait root /usr/sbin/tcpd bootpd f
# cfinger нужен для GNU finger, который в комплекте RHS Linux не используется
I
finger stream tcp nowait nobody /usr/sbin/tcpd in.fingerd -u #cfinger stream tcp nowait root /usr/sbin/tcpd in.cfingerd #
- Finger, systat и netstat передают посторонним информацию о пользователях
- эти данные могут использоваться "взломщиками системы".
- Зачастую все или некоторые из этих служб отключаются для улучшения зашиты.
#
#systat stream tcp nowait nobody /usr/sbin/tcpd /bin/ps -auwwx #netstat stream tcp nowait nobody /usr/sbin/tcpd /bin/netstat --inet
#
# Аутентификация
#
#auth stream tcp nowait root /usr/sbin/tcpd in.identd -t120
swat stream tcp nowait.400 root /usr/sbin/tcpd swat
#
# Конец файла inetd.conf
Рассмотрим предназначение каждого из полей файла inetd.conf подробнее.
- Первое поле содержит имя службы. Это имя должно соответствовать имени, указанному в первом поле файла /etc/services.
- Во втором поле указывается тип сокета. Здесь можно указать одно из значений: stream, dgram, raw, rdm или seqpacket в зависимости от того, сокет какого типа используется сервером: поточный, дейтаграмма, чистый IP, надежно доставляемое сообщение или пакет, передаваемый в последовательности. В общем случае пакеты TCP передаются через сокеты типа stream, а пакеты UDP передаются через сокеты типа dgram. Настраивая службу на совместную работу с inetd, вы должны использовать одно из этих значений, если только прилагаемые к службе инструкции не предписывают какой-либо иной вариант настройки.
- В третьем поле указывается тип протокола. Здесь может стоять одно из следующих значений: tcp, udp, rpc/tcp или rpc/udp. Это поле должно соответствовать типу протокола, указанному для данной службы в файле /etc/services.
- В четвертом поле может стоять одна из меток: wait (ждать) или nowait (не ждать). Как правило, службы UDP используют метку wait, а службы TCP используют метку nowait. Одним из исключений является служба TFTP. Эта служба использует пакеты UDP, однако она создает псевдосоединение и поэтому использует метку nowait для того, чтобы избежать возникновения скоростных условий (race conditions), о которых рассказывается на следующей врезке. Метка nowait позволяет нескольким экземплярам серверного процесса «наслаиваться» друг на друга. В этом случае серверный процесс не завершается немедленно, а продолжает работать как привилегированный процесс. Метка wait подразумевает, что псевдосоединение разрывается каждый раз после приема очередного пакета, поэтому при поступлении каждого очередного запроса требуется аутентификация. В противном случае процесс, продолжающий ожидание в очереди, мог бы принять это псевдосоединение за предыдущего пользователя. Метки wait и nowait сообщают серверу, как следует реагировать на пакеты, поступающие через порт. Службы, использующие wait, являются однопоточны-ми и остаются в очереди ожидания до тех пор, пока их работа не завершается. Службы, использующие nowait, устанавливают соединение и освобождают очередь ожидания, продолжая при этом обмен данными с клиентом. Благодаря этому другой сервер может продолжить ожидание поступления запросов через порт. В данном поле можно указать необязательный числовой аргумент, например: nowait.400. Это число определяет максимальное количество серверных процессов, которое может быть загружено в память в течение 60-секунд-ного периода. Если этот параметр не указывается, по умолчанию используется значение 40.
- В четвертом поле указывается пользователь, от имени которого демон inetd запускает соответствующую службу. Благодаря этому вы можете запустить серверный процесс на уровне привилегий более низком, чем root В поле пользователя при желании можно указать группу в формате пользователь.группа. Если группа не указывается, используется первичная группа для указанного пользователя.
- В последних двух полях указывается серверная программа и ее аргументы. Благодаря тому, что для запуска программы и указания аргументов используется два отдельных поля, вы можете запустить программу-оболочку TCP (TCP Wrapper) и в качестве аргумента указать собственно запускаемый сервер. В нашем примере по умолчанию используется tcpd — демон tcpwrappers, который используется для вызова необходимого демона.
ССЫЛКА
Более подробно о программах-оболочках TCP (TCP Wrappers) рассказывается в главе 15.
Скоростные условия
Термин «скоростные условия» (race conditions) часто встречается в компьютерной литературе. Такие условия возникают там, где имеют место две составляющих: во-первых, несколько команд выполняются одна за другой, во-вторых, используются команды, в процессе выполнения которых эффективный пользовательский ID меняется на 0.
Например, если работая с файловой системой вы отдаете команду mkdir, эта команда в процессе своего исполнения меняет пользовательский ID на ноль, чтобы создать каталог. Без этого не обойтись, так как для того, чтобы создать файл (или каталог), команда вынуждена напрямую работать с файловой системой, а файловая система принадлежит пользователю root. Поэтому создание каталога (а это многоэтапный процесс) происходит в момент, когда эффективный пользовательский ID становится равным 0. Когда каталог уже создан, права на его владения должны быть изменены таким образом, чтобы этот каталог принадлежал пользователю, инициировавшему исполнение команды mkdir. На самом деле это два отдельных легко идентифицируемых процесса, которые выполняются в результате обращения к mkdir.
Теперь представьте, что система испытывает сильную нагрузку и пользователь обращается к mkdir с использованием nice, чтобы замедлить процесс еще больше. Предположим также, что сразу же за командой mkdir в сценарии командной оболочки стоит команда удаления каталога и создания ссылки на /etc/shadow. Если злоумышленнику удастся создать условия, при которых каталог удаляется и ссылка создается еще до того, как команда mkdir производит создание каталога и перенастраивает права на владение, тогда получается, что пользователь, изначально запустивший программу, становится владельцем файла /etc/shadow.
Таким образом, скоростные условия возникают в ходе выполнения процесса, являющегося цепочкой событий, в ходе выполнения которых эффективный UID изменяется на 0, при этом данная цепочка выполняется на протяжении определенного времени и параллельно с другими процессами. Иными словами, процесс А обращается к процессу В, который модифицирует результат выполнения процесса А, и при этом между процессами протекает определенное время. Конечно, для возникновения скоростных условий требуется выполнение некоторых других условий, однако подробности в данной книге не обсуждаются.
Взглянув на листинг файла /etc/inet.conf, вы можете заметить, что строка, соответствующая службе ftp, активна. Чтобы запретить использование ftp, просто поставьте в начале этой строки символ «#», после этого перезапустите сервер inetd. Таким образом вы закомментируете строку, предписывающую запуск службы ftp. Новички в мире Linux часто путают два файла /etc/inetd.conf и /etc/services. Желая предотвратить запуск некоторой службы, они часто комментируют строки в файле /etc/services, однако на самом деле поступать так не следует. Файл /etc/ services содержит описания всех доступных в системе служб, а файл /etc/inetd.conf содержит информацию о том, какие из этих служб разрешается запускать с использованием демона inetd. Если вы хотите предотвратить загрузку в память некоторой службы, будет лучше, если вы закомментируете соответствующую строку в файле /etc/inetd.conf, оставив при этом файл /etc/services без изменений. Конечно, комментирование или удаление записей в любом из этих файлов приведет к одним и тем же результатам — соответствующая служба перестанет запускаться, однако следует учитывать, что информация из файла /etc/services зачастую используется другими важными программами, поэтому если вы удалите из этого файла информацию о некоторой службе, вы можете нарушить работу таких программ.
СОВЕТ
Перезапустить серверную программу inetd можно несколькими разными способами. Во многих документах рекомендуется посылать серверу сигнал SIGHUP. Это можно сделать следующим образом:
kill -l $(pidof inetd) kill -HUP $(pidof inetd)
Вы также можете просто перезапустить сервер:
/etc/гс.d/init.d/inet stop : /etc/re.d/init.d/inet start
Следует отметить, что при остановке или перезапуске inetd любые серверные приложения, запущенные с использованием inetd до этого, не будут остановлены. Иными словами, если кто-либо подключен к системе с использованием telnet, этот сеанс не будет уничтожен, однако после остановки inetd новые удаленные пользователи не смогут подключиться к системе с использованием telnet.