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

UnixForum






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

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

На главную -> MyLDP -> Тематический каталог -> Безопасность работы с системой Linux

Записки Джоя: TCP Wrappers в Red Hat Enterprise Linux

Оригинал: Joey's Notes: TCP Wrappers on Red Hat Enterprise Linux
Автор: Джой Престиа (Joey Prestia)
Дата: май 2009 г.
Перевод: Сергей Супрунов
Дата перевода: 01 июня 2009 г.

Введение

В области информационных технологий безопасность ни в коей мере не является результатом "одного-единственного решения"; другими словами, панацеи для защиты ваших систем не существует. Лучшие схемы защиты являются результатом совместной работы различных приложений и методов, таких как фильтрация пакетов с помощью iptables, принудительный контроль доступа (Mandatory Access Control, MAC) наподобие SELinux, разграничительный контроль доступа (Discretionary Access Control, DAC), реализуемый в виде системных прав и разрешений. Наконец, не сбрасывайте со счётов использование TCP Wrappers [Дословно - "TCP-обёртки". Устоявшегося перевода этого термина не существует, поэтому в дальнейшем, во избежание неоднозначности, будет использоваться оригинальный термин как более понятный большинству читателей. - прим.перев.], которые хорошо дополнят ваши правила файрволла.

[Гуру в области безопасности Брюс Шнайер (Bruce Schneier) часто указывает, что "безопасность - это не продукт, а процесс". Важнейшая составляющая безопасности даже не связана с инструментами, которые вы используете; это осознание необходимости постоянно быть в курсе происходящего и держать всё под контролем. Инструменты - это то, о чём нужно думать в последнюю очередь. - прим.ред.]

Описание

TCP Wrappers работают аналогично спискам доступа (Access Control List, ACL) на основе имён хостов. Их используют для фильтрации сетевого доступа к серверам, работающим по Интернет-протоколу (IP) на системах Linux, Unix или BSD. Они позволяют использовать имя хоста или сетевые адреса как критерии фильтрации, реализуя некоторый уровень управления доступом. Они ещё больше расширяют возможность демонов, работающих под управлением xinetd. При использовании этой техники все попытки доступа могут быть записаны в лог, ограничены, а клиенту отправлены соответствующие сообщения. Это может добавить ещё один уровень безопасности вашему окружению. TCP Wrappers, ко всему прочему, можно перенастраивать в режиме реального времени без перезагрузки сервисов, которые они защищают.

Преимущества

Соединения, которые разрешены, просто принимаются; те, которые запрещены - отклоняются. Некоторые сервисы смогут отправлять определённое сообщение об ошибке, как это делают SSH и vsftpd. Ниже приводится пример использования TCP Wrappers для защиты сервисов.

Вот как выглядит с точки зрения клиента запрет на использование SSH:

[root@alien ~] ssh root@192.168.0.15
ssh_exchange_identification: Connection closed by remote host

Пример запрета FTP:

[root@alien ~] ftp 192.168.0.15
Connected to 192.168.0.15.
421 Service not available.

Как работают TCP Wrappers

Когда клиент пытается соединиться с сервисом, использующим TCP Wrappers, происходит следующее (эти шаги важно знать, поскольку порядок обращения к файлам имеет огромное значение и правила обрабатываются построчно):

  1. Проверяется файл /etc/hosts.allow. Если в нём найдено соответствие, доступ к сервису предоставляется.
  2. Проверяется файл /etc/hosts.deny. Если в нём найдено соответствие, доступ будет запрещён.
  3. В случае, если соответствующие правила не найдены, доступ предоставляется.

[Каждое правило может содержать действие 'allow' или 'deny' непосредственно в себе; в этом случае имя файла, в котором оно расположено, значения не имеет. В системах FreeBSD файл /etc/hosts.deny вообще не обрабатывается, и все правила должны быть размещены в /etc/hosts.allow с обязательным указанием действия. - прим.перев.]

Чтобы определить, какие процессы и демоны используют TCP Wrappers, выполните следующую команду:

strings -f <program_name> | grep hosts_access

Ниже приводится пример вывода этой команды:

[root@alien ~] strings -f /usr/sbin/* | grep hosts_access
/usr/sbin/in.tftpd: hosts_access
/usr/sbin/sshd: hosts_access
/usr/sbin/stunnel: hosts_access
/usr/sbin/stunnel: See hosts_access(5) manual for details
/usr/sbin/tcpd: hosts_access_verbose
/usr/sbin/vsftpd: hosts_access
/usr/sbin/xinetd: hosts_access

[root@alien ~] strings -f /sbin/* | grep hosts_access
/sbin/portmap: hosts_access_verbose

Применение TCP Wrappers

Используя TCP Wrappers, всегда помните о следующих вещах. Во-первых, о порядке поиска соответствий. Во-вторых, о том, что поиск останавливается по первому совпадению. Любые изменения в /etc/hosts.allow или /etc/hosts.deny вступают в силу немедленно, без необходимости перезапускать какие-либо сервисы. Как и в случае с iptables, порядок правил играет решающую роль. Давайте рассмотрим команды, формирующие правила. Основной формат команд, используемых в /etc/hosts.allow и /etc/hosts.deny, следующий:

daemon_list : client_list  : shell_command 
Здесь daemon_list - список из одного или более имён процессов или служебное слово (о них - далее); client_list - список из одного или более имён хостов, IP-адресов, шаблонов или служебных слов, на соответствие которым будет проверяться имя хоста или адрес клиента.

Пример правил /etc/hosts.allow и /etc/hosts.deny:

/etc/hosts.allow

#
# hosts.allow   В этом файле описаны имена хостов,
#               которым позволено использовать локальные INET-сервисы
#               (определяемые сервером /usr/sbin/tcpd)
#
# Мои новые правила
sshd : 192.168.0.14 

/etc/hosts.deny

#
# hosts.deny    В этом файле описаны имена хостов,
#               которым запрещено использовать локальные INET-сервисы
#               (определяемые сервером /usr/sbin/tcpd)
#
# Мои новые правила
ALL : ALL

Обратите внимание на результат работы этих правил:

Подключение с station14.example.com (192.168.0.14)

Last login: Tue Apr  7 06:45:09 2009 from station14
[root@station15 ~]#

Подключение с alien.example.com (192.168.0.247)

[root@alien ~]# ssh 192.168.0.15
ssh_exchange_identification: Connection closed by remote host
[root@alien ~]#

Служебные слова

ALL:
Соответствует всем сервисам или хостам.
LOCAL:
Соответствует любому хосту, в имени которого не содержится точек.
UNKNOWN:
Соответствует любому неизвестному пользователю, и соответствует любому хосту, имя или адрес которого неизвестны. Не забывайте, что имя хоста может быть недоступно, если возникнут проблемы с сервером имён.
KNOWN:
Соответствует известным пользователям и хостам, чьи имя и адрес известны. Не забывайте, что имя хоста может быть недоступно, если возникнут проблемы с сервером имён.
PARANOID:
Соответствует любому хосту, имя которого не соответствует его IP-адресу.
EXCEPT:
Данное служебное слово предполагает использование в следующем виде: list_1 EXCEPT list_2. Такой оператор будет соответствовать всему, что совпадает с list_1, при условии что нет совпадения с list_2. EXCEPT можно использовать в daemon_list и client_list.

(ПРЕДУПРЕЖДЕНИЕ: Всегда завершайте файлы /etc/hosts.allow и /etc/hosts.deny пустой строкой! Просто установите курсор в конец последней строки и введите символ возврата каретки (клавишей <Enter>). При невыполнении этого шага вы можете столкнуться с непредсказуемым поведением TCP Wrappers.)

Ниже приводится несколько примеров правил. Выполняемое ими действие определяется тем, в какой из файлов вы их поместите, при условии, что отсутствует явное указание на действие 'allow' или 'deny' в конце правила.

sshd : .example.com
vsftpd : 192.168. 
ALL : 192.168.1.0/255.255.255
sshd : station1.example.com : allow
sshd : station15.example.com : deny
vsftpd : ALL EXCEPT *.hacker.org

Использование Twist

Директива 'twist' используется для подмены сервиса выбранной командой. Обычно эта возможность используется для создания сервисов-"ловушек" (honeypots). Другое применение - отправка сообщений подключающемуся клиенту. Команда 'twist' должна указываться в конце строки правила. Ниже показан пример использования 'twist' в /etc/hosts.deny для отправки с помощью команды echo сообщения хосту, который неадекватно работает с FTP-серверами:
vsftpd : station6.example.com \
: twist /bin/echo "Service suspended for abuse!"

Использование Spawn

Директива 'spawn' приводит к запуску дочернего процесса. Она может оказаться полезной для создания особых лог-файлов, отслеживающих доступ к сервису. Кроме того, с помощью этой директивы вы можете запускать собственные скрипты в фоновом режиме, незаметно для пользователя. В примере ниже мы записываем метку времени в лог-файл, так что мы сможем отслеживать FTP-соединения:

vsftpd : .example.com  \
: spawn /bin/echo $(/bin/date) access granted to %h>>/var/log/ftp_access.log 

При этом в файлах /etc/hosts.allow и /etc/hosts.deny вы можете использовать следующие символы-заменители:

%aАдрес клиента
%AАдрес сервера
%cИнформация о клиенте: user@host, user@address, имя хоста или просто адрес
%dИмя демона/процесса
%hИмя хоста клиента или адрес, если имя хоста недоступно
%HИмя хоста сервера или адрес, если имя хоста недоступно
%nИмя хоста клиента (либо 'unknown' или 'paranoid')
%NИмя хоста сервера (либо 'unknown' или 'paranoid'
%pИдентификатор процесса (PID)
%sИнформация о сервере: daemon@host, daemon@address или просто имя демона
%uИмя пользователя клиента (или 'unknown')
%%Одиночный символ '%'

(После подстановки символы, которые могут быть неверно восприняты командной оболочкой, заменяются символами подчёркивания.)

Заключение

TCP Wrappers отлично дополнят ваши нынешние инструменты безопасности. Но запомните, что всегда необходимо тщательно проверять любую реализацию защиты, прежде чем переносить её на работающие серверы!

Ссылки


Об авторе

Джой родился в Фениксе, и в 14 лет начал программировать на Timex Sinclair 1000. Им двигала надежда, что он сможет делать что-нибудь на этом "динозавре". Вскоре он стал искусно программировать на Бейсике и Ассемблере. В 1990 году Джой начал работать программистом, добавив к своему арсеналу Кобол, Фортран и Паскаль. С тех пор им овладела страсть ко всем областям информатики. В 2002 году он принялся за изучение RedHat Linux, после того как кто-то дал ему RedHat шестой версии. Это положило начало его новому увлечению - Linux. В настоящее время Джой завершает обучение по специальности "Сети Linux" и работает в "RedHat Academy" Аризонского колледжа. Также он является сотрудником Linux Gazette.