Gentoo Linux сборник статей



Pdf просмотр
страница31/79
Дата14.11.2016
Размер5.55 Mb.
Просмотров11425
Скачиваний1
1   ...   27   28   29   30   31   32   33   34   ...   79
9.b. Файловая система proc
Множество параметров ядра может быть изменено с помощью файловой системы
/proc или sysctl.
Чтобы иметь возможность на лету изменять параметры и переменные ядра, вам понадобится определить в ядре CONFIG_SYSCTL. Она включена по умолчанию в ядрах серии 2.4.
Листинг 1: Отключения IP-форвардинга
# /bin/echo "0" > /proc/sys/net/ipv4/ip_forward
Проверьте, что проброс IP-пакетов отключен. Эта возможность необходима лишь для узла, имеющего доступ к нескольким сетям. Рекомендуется устанавливать и отключать этот флаг до включения или отключения других флагов.
Листинг 2: Отбрасывание пакетов ping
# /bin/echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all
Это просто заставит ядро игнорировать все сообщения ping (ICMP-пакеты типа 0).
IP-пакет, несущий ICMP-сообщение, может содержать также в нагрузку и другую информацию, о которой вы можете не подозревать, поэтому следует отключить прием. Администраторы используют ping как утилиту диагностики и часто выражают недовольство, если она отключена, но нет причины позволять чужакам пинговать узел. Тем не менее, если необходимо разрешить внутренним пользователям использовать ping, то можно отключить сообщения ICMP типа 0 в межсетевом экране (тем самым позволив локальным администраторам использовать эту утилиту).
Листинг 3: Игнорирование широковещательных запросов ping
# /bin/echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
Это отключает ответ на широковещательные ICMP-запросы, предотвращая реализацию Smurf-атаки. Smurf-атака основана на отправке ICMP-пакета типа 0
(ping) по широковещательному адресу сети. Обычно для этого злоумышленник использует поддельный адрес. Все компьютеры сети ответят на сообщение ping, что может вызвать наводнение трафика на узел, адрес которого был подделан.
Листинг 4: Отключение исходящих маршрутизированных пакетов.
# /bin/echo "0" > /proc/sys/net/ipv4/conf/all/accept_source_route
Не принимать исходящие маршрутизированные пакеты. Злоумышленники могут использовать исходящую маршрутизацию для генерации трафика, имеющего адрес внутренней сети, но на самом деле возвращаемого назад злоумышленнику, что позволит ему компрометировать сеть. Исходящая маршрутизация очень редко используется по назначению, так что безопаснее ее отключить.
328

Настольная книга по безопасности Gentoo
Листинг 5: Отключение приема перенаправлений
# /bin/echo "0" > /proc/sys/net/ipv4/conf/all/accept_redirects
# /bin/echo "0" > /proc/sys/net/ipv4/conf/all/secure_redirects
Не принимать ICMP-пакеты перенаправления. ICMP-перенаправления могут быть использованы злоумышленником для изменения таблиц маршрутизации.
Листинг 6: Защита против неправильных сообщений об ошибках
# /bin/echo "1" > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
Включить защиту против приходящих неправильных сообщений об ошибках.
Листинг 7: Включение фильтрации обратного пути
# for i in /proc/sys/net/ipv4/conf/*; do
/bin/echo "1" > $i/rp_filter done
Включает фильтрацию обратного пути. Это поможет быть уверенным, что в пакетах используются правомерные адреса, при этом входящие пакеты будут автоматически отброшены, если запись в таблице маршрутизации об адресе этих пакетов не соответствуют сетевому интерфейсу, с которого они пришли. Это позволит предотвратить подделку IP-адресов. Необходимо включить эту возможность для каждого net/ipv4/conf/*, иначе проверка исходящих пакетов не будет полностью функционировать.
Предупреждение: Тем не менее включение фильтрации обратного пути может стать проблемой при использовании асимметричной маршрутизации (исходящие пакеты идут отличным от входящих пакетов путем) или при использовании немаршрутизируемом узле с несколькими IP-адресами на различных интерфейсах.
Листинг 8: Регистрация всех поддельных, исходящих маршрутизированных и перенаправленных пакетов
# /bin/echo "1" > /proc/sys/net/ipv4/conf/all/log_martians
Регистрировать поддельные пакеты, пакеты с исходящей маршрутизацией и пакеты перенаправлений.
Все настройки будут сброшены после перезагрузки компьютера. Рекомендуется добавлять их в /etc/sysctl.conf, который будет автоматически загружен сценарием инициализации /etc/init.d/bootmisc.
Синтаксис /etc/sysctl.conf достаточно понятный. Удалите из указанных путей /proc/
sys/ и замените / на .:
Листинг 9: Переход к файлу sysctl.conf
(Вручную с помощью команды echo:)
/bin/echo "0" > /proc/sys/net/ipv4/ip_forward
(Автоматически в файле sysctl.conf:)
net.ipv4.ip_forward = 0 329

Настольная книга по безопасности Gentoo
9.c. Grsecurity
Заплатка от
Grsecurity входит в sys-kernel/hardened-sources, но по умолчанию отключена. Сначала сконфигурируйте ядро, а затем настройте параметры
Grsecurity. Подробное описание доступных параметров Grsecurity можно найти на странице проекта укрепленного Gentoo
Последние версии hardened-sources содержат Grsecurity версии 2.*. Для дополнительной информации о наборе патчей Grsecurity обратитесь к документации, доступной на домашнем сайте Grsecurity
9.d. Kerneli
Kerneli
— это заплатка, которая добавляет функции шифрования к существующему ядру. Наложив эту заплатку на ядро, вы получите такие новые параметры, как алгоритмы шифрования, дайджеста и фильтры к зашифрованным образам.
Предупреждение: В настоящий момент заплатка kerneli для последнего ядра нестабильна, поэтому будьте осторожны при ее использовании.
9.e. Другие заплатки к ядру

Проект OpenWall

Linux Intrusion Detection System

Rule Set Based Access Control

NSA's security enhanced kernel

Wolk
И множество других.
10. Безопасность служб
10.a. Apache
Apache поставляется с достаточно полным конфигурационным файлом по умолчанию, но опять же необходимо улучшить некоторые аспекты, например, использовать для Apache только один адрес. Ниже приведены параметры, которые вы должны внести в конфигурационный файл.
Если вы не отключали поддержку ssl в /etc/make.conf перед установкой Apache, то теперь вы должны иметь доступ к серверу с включенным SSL. Чтобы включить ее, просто добавьте следующую строку.
Листинг 1: /etc/conf.d/apache
HTTPD_OPTS="-D SSL"
Листинг 2: /etc/apache/conf/apache.conf
#Добавьте свой IP для прослушивания
Listen 127.0.0.1
BindAddress 127.0.0.1
#Не следует использовать nobody или nogroup для каждого сервиса, запущенного
#без административных привелегий
#(просто добавляем пользователя apache с группой apache)
User apache
330

Настольная книга по безопасности Gentoo
Group apache
#Не сообщать информацию о версии сервера
ServerSignature Off
ServerTokens Prod
Apache собран с параметрами --enable-shared=max и --enable-module=all. По умолчанию это включает все модули, поэтому вы должны закомментировать все неиспользуемые модули в разделе LoadModule (LoadModule и AddModule). Затем перезапустите сервис, выполнив /etc/init.d/apache restart.
Документация доступна по адресу http://www.apache.org
10.b. Bind
Документацию можно найти на сайте
Internet Software Consortium
. Руководство администратора BIND 9 также доступно каталоге doc/arm.
Новые сборочные файлы BIND поддерживают изменение корневого каталога из коробки. После установки bind следуйте этим простым инструкциям:
Листинг 3: Изолирование среды BIND
# emerge --config bind
(Перед запуском следующей команды вам может потребоваться изменить каталог chroot в файле /etc/conf.d/named. Иначе будет использован /chroot/dns.)
10.c. Djbdns
Djbdns — это реализация DNS, за обнаружение уязвимостей в которой автор готов выплачивать деньги
. Принцип работы сильно отличается от Bind 9, однако он работает. Дополнительная информация может быть получена на сайте http://www.djbdns.org
10.d. FTP
В общем случае использование FTP (File Transfer Protocol, протокол передачи файлов) является плохой идеей. Этот протокол отправляет данные незашифрованными (в том числе и пароли), прослушивает 2 порта (обычно это порты 20 и 21), и часто злоумышленники ищут анонимный доступ для обмена варезом. Так как протокол содержит ряд проблем безопасности, то следует использовать sftp или HTTP. Если это невозможно, то максимально обезопасьте свои сервисы и будьте готовы.
10.e. Mysql
Если вам необходимо предоставить доступ к базе данных mysql локальным приложениям, раскомментируйте следующую строку в /etc/mysql/my.cnf.
Листинг 4: Отключение доступа к сети skip-networking
Затем мы отключаем использование команды LOAD DATA LOCAL INFILE. Это предотвратит несанкционированное чтение локальных файлов. Это также подходит против SQL-инъекций в PHP-сценариях.
Листинг 5: Отключение LOAD DATA LOCAL INFILE в разделе [mysqld]
331

Настольная книга по безопасности Gentoo set-variable=local-infile=0
Затем необходимо удалить тестовую базу данных (test) и все учетные записи за исключением root.
Листинг 6: Удаление тестовой базы данных и всех ненужных пользователей mysql> drop database test;
mysql> use mysql;
mysql> delete from db;
mysql> delete from user where not (host="localhost" and user="root");
mysql> flush privileges;
Предупреждение: Если вас уже есть настроенные учетные записи, то будьте осторожны с этими командами.
Примечание: Если вы изменяли пароли в командной строке MySQL, то всегда очищайте
/.mysql_history и /var/log/mysql/mysql.log, так как они сохраняют список выполненных SQL-команд с открытыми паролями.
10.f. Proftpd
У proftpd было несколько проблем с безопасностью, но большинство из них было исправлено. Тем не менее, неплохо внести некоторые улучшения:
Листинг 7: /etc/proftpd/proftpd.conf
ServerName "My ftp daemon"
# Не показывать ident сервера
ServerIdent on "Go away"
# Упрощаем создание виртуальных пользователей
RequireValidShell off
# Использовать альтернативные файлы паролей и групп (в формате passwd)
AuthUserFile "/etc/proftpd/passwd"
AuthGroupFile "/etc/proftpd/group"
# Разрешения
Umask 077
# Таймауты и ограничения
MaxInstances 30
MaxClients 10 "Only 10 connections allowed"
MaxClientsPerHost 1 "You have already logged on once"
MaxClientsPerUser 1 "You have already logged on once"
TimeoutStalled 10
TimeoutNoTransfer 20
TimeoutLogin 20
# Все входят в изолированную оболочку
DefaultRoot
# Не запускать с правами администратора
User nobody
Group nogroup
# Регистрировать любые передачи
332

Настольная книга по безопасности Gentoo
TransferLog /var/log/transferlog
# Проблемы с универсализацией имен файлов
DenyFilter \*.*/
Дополнительная информация может быть найдена на http://www.proftpd.org
10.g. Pure-ftpd
Pure-ftpd является ответвлением оригинального trollftpd с модификациями Фрэнка
Денниса по части безопасности и функциональности.
Используйте виртуальных пользователей (и никогда не применяйте системные учетные записи), включив параметр AUTH. Установите его для
-lpuredb:/etc/pureftpd.pdb и создайте пользователей при помощи команды
/usr/bin/pure-pw.
Листинг 8: /etc/conf.d/pure-ftpd
AUTH="-lpuredb:/etc/pureftpd.pdb"
## Misc. Others ##
MISC_OTHER="-A -E -X -U 177:077 -d -4 -L100:5 -I 15"
Добавьте к переменной MISC_OTHER параметры запрета на подключение анонимных пользователей (-E), изменения корневого каталога для всех (-A), запрета записи и чтения файлов, начинающихся с точки (-X), максимального периода бездействия (-I), ограничения рекурсии (-L) и подходящего umask.
Предупреждение: Не используйте параметры -w или -W! Если же вы хотите, чтобы у вас был сайт с варезом, то перестаньте читать это руководство!
Дополнительная информация может быть найдена на http://www.pureftpd.org
10.h. Vsftpd
Vsftpd (сокращение от very secure ftp) — это небольшой FTP-демон, который может запускаться с настройками по умолчанию. Он прост и не имеет множества возможностей, присущих pureftp и proftp.
Листинг 9: /etc/vsftpd anonymous_enable=NO
local_enable=YES
#read only write_enable=NO
#enable logging of transfers xferlog_std_format=YES
idle_session_timeout=20
data_connection_timeout=20
nopriv_user=nobody chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chrootlist
333

Настольная книга по безопасности Gentoo ls_recurse_enable=NO
Как вы можете видеть, нет возможности установить для данного сервиса индивидуальные разрешения, но если используется настройки для анонимного доступа, то это он не так уж плох. Иногда неплохо иметь анонимный FTP-сервер
(для доступа к открытому ПО), и vsftpd неплохо подходит для этой работы.
10.i. Netqmail
Netqmail часто признается наиболее безопасным почтовым сервером. Он написан с прицелом на безопасность (и паранойю). По умолчанию он не разрешает релей и, начиная с 1996 года, не имеет никаких уязвимостей безопасности. Просто наберите emerge netqmail и настройте его!
10.j. Samba
Samba — это протокол, предоставляющий файлы в сетях Microsoft/Novell, и он не должен использоваться в интернете. Его необходимо обезопасить.
Листинг 10: /etc/samba/smb.conf
[global]
#Прослушивать определенный интерфейс interfaces = eth0 10.0.0.1/32
#Использовать зашифрованные пароли encrypt passwords = yes directory security mask = 0700
#Разрешить трафик из подсети 10.0.0.*
hosts allow = 10.0.0.
#Включить аутентификацию
#(не используйте режим share)
security = user
#Запретить привелигерованные учетные записи invalid users = root @wheel
#Максимальный отображаемый размер ресурса (не является ограничителем)
max disk size = 102400
#Ужесточить политики паролей min password length = 8
null passwords = no
#Использовать PAM (если была добавлена поддержка)
obey pam restrictions = yes pam password change = yes
Проверьте, что для каждого ресурса выставлены правильные разрешения и не забудьте прочитать документацию
Теперь перезапустите сервер и добавьте пользователей, которым необходим доступ к этому сервису. Это можно сделать с помощью команды
/usr/bin/smbpasswd с параметром -a.
334

Настольная книга по безопасности Gentoo
10.k. ssh
Для OpenSSH необходимо лишь одно улучшение — использование более надежного механизма аутентификации, основанного на шифровании с использованием открытого ключа. Очень много сайтов (например, http://www.sourceforge.net
, http://www.php.net и http://www.apache.org
) было подвержено несанкционированному доступу из-за пустых или слабых паролей.
Листинг 11: /etc/ssh/sshd_config
#Включаем только версию 2
Protocol 2
#Отключаем вход администратора. Пользователи могут использовать su для входа
PermitRootLogin no
#Включаем аутентификацию по открытому ключу
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
#Отключаем .rhost и обычную аутентификацию по паролю
HostbasedAuthentication no
PasswordAuthentication no
PermitEmptyPasswords no
#Разрешаем подключаться только пользователям из групп wheel или admin
AllowGroups wheel admin
#Из этих групп разрешаем подключаться только следующим пользователям
#@ не обязательна, но заменяет старую директиву
#AllowHosts
AllowUsers kn@gentoo.org bs@gentoo.org
#Вход в систему
SyslogFacility AUTH
LogLevel INFO
(Измените адрес на свой)
ListenAddress 127.0.0.1
Также проверьте, что в конфигурационном файле нет параметра UsePAM yes, который перекрывает механизм аутентификации с помощью открытого ключа.
Теперь создайте для каждого пользователя ключ (на компьютере, с которого они будут регистрироваться) с помощью следующей команды:
Листинг 12: Создание пар ключей DSA
# /usr/bin/ssh-keygen -t dsa
И введите пароль.
Листинг 13: Вывод ssh-keygen
Generating public/private dsa key pair.
Enter file in which to save the key (/home/kn/.ssh/id_dsa):[Press enter]
Created directory '/home/kn/.ssh'.
Enter passphrase (empty for no passphrase): [Enter passphrase]
Enter same passphrase again: [Enter passphrase again]
Your identification has been saved in /home/kn/.ssh/id_dsa.
Your public key has been saved in /home/kn/.ssh/id_dsa.pub.
335

Настольная книга по безопасности Gentoo
The key fingerprint is:
07:24:a9:12:7f:83:7e:af:b8:1f:89:a3:48:29:e2:a4 kn@knielsen
После этого в каталоге
/.ssh/ появятся два файла с названием id_dsa и id_dsa.pub. Файл id_dsa является секретным ключом и должен оберегаться от других. Другой файл, id_dsa.pub, должен быть размещен на каждом сервере, к которому необходим доступ. Добавьте этот ключ в каталог
/.ssh/authorized_keys в домашнем каталоге пользователя. Теперь пользователь должен иметь доступ к подключению:
Листинг 14: Adding the id_dsa.pub file to the authorized_keys file
$ scp id_dsa.pub other-host:/var/tmp/currenthostname.pub
$ ssh other-host password:
$ cat /var/tmp/currenthostname.pub >>
/.ssh/authorized_keys
Теперь ваши пользователи должны тщательно оберегать свои секретные ключи.
Поместите их на сменный носитель, который они будут всегда носить с собой, или спрячьте их на рабочих станциях пользователей (поместите их под правила паролей
).
Для дальнейшей информации посетите веб-сайт
OpenSSH
10.l. Использование xinetd
xinetd является заменой inetd (которого в Gentoo нет), демона сетевых сервисов.
Он поддерживает контроль доступа, основанный на адресе удаленного узла и времени доступа. Он также предоставляет расширенные возможности регистрации событий, включая время запуска сервера, адрес удаленного узла, имя удаленного пользователя, время работы сервера и выполненные запросы.
Как в случае с другими сервисами, важно создать хорошую конфигурацию по умолчанию. Но так как xinetd запускается с правами администратора и поддерживает протоколы, о работе которых вы можете не знать, рекомендуется не использовать его. Но если вы все равно хотите использовать его, то вы можете укрепить его безопасность:
Листинг 15: Установка xinetd
# emerge xinetd tcp-wrappers
И отредактируйте конфигурационный файл:
Листинг 16: /etc/xinetd.conf defaults
{
only_from = localhost instances = 10
log_type = SYSLOG authpriv info log_on_success = HOST PID
log_on_failure = HOST
cps = 25 30
}
# Это установит работу pserver (cvs) через xinetd со следующими:
# настройками:
# максимум 10 обработчиков (10 подключений одновременно)
336

Настольная книга по безопасности Gentoo
# использовать только TCP
# использовать пользователя cvs для запуска сервиса
# использовать только 1 IP
# разрешать доступ с 10.0.0.*
# разработчики могут пользоваться cvs только с 8 до 17 часов
# использовать упаковщики tpcd (контроль доступа через
# /etc/hosts.allow и /etc/hosts.deny)
# max_load для компьютера 1.0
# Отключающий флаг для настроек по умолчанию, я предпочитаю,
# чтобы он был отключен service cvspserver
{
socket_type = stream protocol = tcp instances = 10
protocol = tcp wait = no user = cvs bind = 10.0.0.2
only_from = 10.0.0.0
access_times = 8:00-17:00
server = /usr/sbin/tcpd server_args = /usr/bin/cvs --allow-root=/mnt/cvsdisk/cvsroot pserver max_load = 1.0
log_on_failure += RECORD
disable = no
}
Для большей информации см. man 5 xinetd.conf.
10.m. X
По умолчанию Xorg настроен функционировать в качестве Xserver. Это может быть опасным, так как X использует не зашифрованные TCP-соединения и прослушивает подключения xclient.
Важно: Если вам не нужен этот сервис, отключите его!
Но если вам требуется использовать рабочую станцию в качестве X-сервера, используйте команду /usr/X11R6/bin/xhost с большой осторожностью. Эта команда позволит клиентам других узлов подключаться к вашему экрану. Это может быть полезно при необходимости запуска приложения X с другого компьютера, и это возможно лишь через сеть, но это может быть использовано и злоумышленником.
Синтаксис этой команды — /usr/X11R6/bin/xhost +hostname.
Предупреждение: Не используйте возможность xhost +! Эта возможность позволит любому клиенту подключиться к X-серверу и взять контроль над ним.
Если злоумышленник может получить доступ к X, то сможет регистрировать нажатия на клавиши, что позволит ему взять контроль над вашим компьютером.
Если вы все же используете ее, то всегда указывайте узел.
Более безопасным решением является полное отключение этой возможности при старте X-сервера с помощью startx -- -nolisten tcp или отключение ее навсегда в файлах конфигурации.
Листинг 17: /usr/X11R6/bin/startx defaultserverargs="-nolisten tcp"
337

Настольная книга по безопасности Gentoo
Вы должны защитить startx, чтобы не допустить его перезаписи при установке новой версии Xorg. Добавьте следующую строку в /etc/make.conf:
Листинг 18: /etc/make.conf
CONFIG_PROTECT_MASK="/usr/X11R6/bin/startx"
Если вы используете графический диспетчер входа в систему, вам понадобится другой подход.
Для gdm (Gnome Display Manager)
Листинг 19: /etc/X11/gdm/gdm.conf
[server-Standard]
command=/usr/X11R6/bin/X -nolisten tcp
Для xdm (X Display Manager) и kdm (Kde Display Manager)
Листинг 20: /etc/X11/xdm/Xservers
:0 local /usr/bin/X11/X -nolisten tcp
11. Изменение корневого каталога и виртуальные серверы
11.a. Изменение корневого каталога
Изменение корневого каталога для службы является способом ограничения среды службы (или пользователя), в которой она имеет доступ лишь к необходимым ресурсам. Запущенная служба под пользователем, отличном от суперпользователя (nobody, apache, named) может предоставить злоумышленнику доступ лишь к тем файлам, к которым имеет доступ пользователь, от имени которого запущена служба. Это означает, что злоумышленник не сможет получить права root, даже если служба подвержена различным уязвимостям.
Некоторые службы, например pure-ftpd и bind, могут быть заключены в chroot.
Если служба поддерживает эту возможность, используйте ее, иначе вы можете можете создать среду собственноручно. Давайте рассмотрим пример создания chroot. Чтобы изучить работу механизма chroot, мы будем экспериментировать с bash (простейший для изучения случай).
Создайте каталог /chroot, выполнив команду mkdir /chroot. Затем определите, какие динамические библиотеки необходимы для работы bash (если он собран с параметром -static, этот шаг можно пропустить):
Следующая команда создаст список библиотек, необходимых для bash.
Листинг 1: Получение списка используемых библиотек
# ldd /bin/bash libncurses.so.5 => /lib/libncurses.so.5 (0x4001b000)
libdl.so.2 => /lib/libdl.so.2 (0x40060000)
libc.so.6 => /lib/libc.so.6 (0x40063000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
Теперь создадим изолированную среду для bash.
Листинг 2: Создание изолированной среды для bash
# mkdir /chroot/bash
338

Настольная книга по безопасности Gentoo
# mkdir /chroot/bash/bin
# mkdir /chroot/bash/lib
Затем скопируем файлы, используемые bash (/lib) в изолированный lib и скопируем файл bash в изолированный каталог bin. Этим мы создадим ту же самую среду, но с ограниченными возможностями. После этого попробуйте выполнить команду chroot /chroot/bash /bin/bash. Если вы получите строку приглашения, гласящую /, то у вас все получилось! Иначе вам сообщат, какого файла не хватает. Некоторые разделяемые библиотеки могут использовать другие файлы.
Как вы можете заметить, внутри изолированной среды ничего, кроме echo, не работает. Это потому что в внутри среды chroot кроме bash нет никаких других команд, а echo является встроенной командой.
Подобным образом вы можете создать службу в изолированной среде.
Единственное различие в том, что служба может время от времени обращаться к устройствам и файлам настроек в /etc. Просто скопируйте их (файлы устройств можно скопировать с помощью команды cp -a) в изолированную среду, отредактируйте сценарий инициализации перед тем, как заключить службу в среду. Может быть сложным определить, какие устройства и файлы конфигурации могут понадобиться. Здесь может пригодиться команда strace. Запустите службу вместе с /usr/bin/strace и отследите все вызовы open, read, stat и, возможно, connect. Это подскажет вам, что нужно копировать. Но в большинстве случаев вам понадобится скопировать файл passwd (отредактируйте копию, удалив из него всех пользователей, не нужных для запуска службы), /dev/zero, /dev/log и
/dev/random.
11.b. Пользовательский режим Linux
Другим способом создания безопасной среды является запуск виртуальной машины. Виртуальная машина — это процесс, выглядящий как отдельная ОС и работающий в реальной операционной системе, которая предоставляет ему необходимые системные ресурсы. Безопасность достигается в том, что если сервер, запущенный внутри виртуальной машины, будет взломан, то будет затронут только виртуальный сервер, а не родительская установка.
Для дальнейшей информации по установке пользовательского режима Linux, обратитесь к руководству по пользовательскому режиму Linux
12. Межсетевые экраны
12.a. Межсетевой экран
Люди часто думают, что межсетевой экран окончательно защитит их систему, но они ошибаются. В большинстве случаев плохо настроенный межсетевой экран предоставляет еще меньше безопасен, чем его отсутствие. Он тоже является программой, и с ним нужно обращаться так же, как и с остальными программами, так как он может содержать уязвимости.
А теперь подумайте перед реализацией межсетевого экрана! Так ли он вам нужен? Если да, то вам нужно написать правила, определяющие его работу, тип межсетевого экрана и кто должен им управлять. Но сначала прочитайте это
339

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

Для защиты извне (черви/злоумышленники)

Для защиты изнутри (сотрудники/дети)
В основном есть три типа межсетевых экранов:

Фильтрование пакетов

Прокси

Программный шлюз
Межсетевой экран должен работать на выделенном компьютере без лишних запущенных сервисов (или же только с sshd) и обезопасен такими способами, которые описаны в этом руководстве.
12.b. Фильтрование пакетов
Весь сетевой трафик передается в виде пакетов. Непрерывный поток разделяется на маленькие, легко управляемые пакеты, которые собираются в точке назначения. В заголовке каждого пакета содержится информация о способе и месте его назначения. Также эта информация используется работы межсетевого экрана. Фильтрация основана на:

разрешении или запрещении пакетов на основании IP-адреса отправителя/
получателя

разрешении или запрещении пакетов на основании порта отправителя/получателя

разрешении или запрещении пакетов на основании протокола

разрешении или запрещении пакетов на основании параметров, специфичных для каждого из протоколов
Другими словами, фильтрация основана на содержимом заголовка пакета, а не самого пакета.
Недостатки:

адрес в пакете может быть ненастоящим адресом IP (или подделанным отправителем)

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

критично к сбоям
Преимущества:

простая реализация

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

хорош против предотвращения SYN-атак
Вот примеры свободных фильтров пакетов для Linux:

Iptables

Ipchains

SmoothWall
Примечание: Рекомендуется использовать iptables. ipchains устарел.
340

Настольная книга по безопасности Gentoo
12.c. Прокси
Шлюз сеансового уровня является межсетевым экраном, проверяющим соединения перед разрешением обмена данных. Это значит, что он не только разрешает или запрещает пересылку пакетов на основании их заголовка, но и определяет перед открытием сессии на основании настраиваемых правил, что оба адресата реально существуют. Фильтрация основывается на:

IP-адресе отправителя/получателя

порте отправителя/получателя

времени

протоколе

пользователе

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

Взаимодействует на транспортном уровне и может потребовать изменения программ, предоставляющих транспортные функции.
12.d. Программный шлюз
Шлюзы уровня приложений являются прокси-серверами для приложений, обменивающимися вместо клиентов данными с удаленными системами. Это позволяет находиться вне доступа извне за ДМЗ (демилитаризованной зоной, частью частной сети, видимой сквозь межсетевой экран) или разрешать межсетевому экрану предотвращать соединения извне. Фильтрация основывается на:

разрешении или запрещении на основании IP-адреса источника/назначения

на содержимом пакетов

ограничения доступа к файлу на основе типа файла и расширения
Преимущества:

Может кэшировать файлы, увеличивая производительность сети

Детализированная регистрация всех подключений

Хорошая расширяемость (некотрые прокси могут распределять кэшированные данные между собой)

Нет прямого доступа извне

Может изменять содержимое пакета на лету
Недостатки:

Конфигурация является комплексной
Программные шлюзы принято считать наиболее безопасным решением, так как они не запускаются с правами администратора, и все узлы за ними будут недоступными из интернета.
Пример свободного шлюза:

Squid
12.e. Iptables
Для нормального функционирования iptables должен быть включен в ядро. Я
341

Настольная книга по безопасности Gentoo включил поддержку iptables модулей (команда iptables загрузит их по мере необходимости) и пересобрал ядро (но вы можете включить их в само ядро, если намереваетесь отказаться от загружаемых модулей ядра, как сказано выше). Для более детальной информации по настройке iptables в ядре обратитесь к странице
Iptables Tutorial Chapter 5: Preparations
. После пересборки нового ядра (или во время компиляции) вы должны добавить команду iptables. Для этого просто наберите emerge iptables.
Теперь проверим свою работу, запустив iptables -L. Если команда завершилась ошибкой, значит, что-то не так, поэтому проверьте еще раз настройки. iptables — новый и весьма улучшенный межсетевой экран в ядрах Linux 2.4.x. Он является наследником ipchains для ядер Linux 2.2.x. Одним из значительных нововведений является то, что iptables способен совершать полноценную фильтрацию пакетов. С ее помощью стало возможным следить за каждым установленным TCP-соединением.
TCP-соединение содержит в себе серию пакетов, содержащих информацию IP- адресе и порте отправителя и получателя, а также последовательное число, поэтому пакеты могут быть воссозданы без потери данных. TCP является протоколом, ориентированном на подключение, в отличии от UDP, который не гарантирует доставку.
Изучая заголовок TCP-пакета, межсетевой экран может может определить, является ли полученный пакет частью уже установленного соединения или нет, и принять решение, принять или отбросить этот пакет.
При использовании межсетевого экрана, не отслеживающего соединения, возможно провести его и заставить с помощью манипулирования заголовками
TCP-пакета принимать пакеты, которые необходимо отбросить. Это может быть сделано с помощью установки SYN или других флагов заголовка TCP и создания поддельного пакета, который будет считаться частью уже установленного соединения (ведь межсетевой экран не будет отслеживать состояние соединения). При использовании фильтрации пакетов, отслеживающих соединения, можно отбрасывать подобные пакеты, если они не являются частью уже установленного соединения. Это также предотвратит «stealth-сканирование», разновидности сканирования, с помощью которого сканер отправляет пакеты с такой комбинацией флагов, при которых они не будут зарегистрированы межсетевым экраном, полагающим, что это — обычные SYN-пакеты.
В iptables также есть различные возможности, как например NAT (Network Address
Translation, сетевая трансляция адресов) и ограничения по частоте. Ограничение по частоте весьма полезна для предотвращения DoS-атак (Denial of Service, отказ от обслуживания), например SYN-наводнений.
TCP-соединения устанавливаются после так называемого троекратного рукопожатия. При установлении TCP-соединения клиент отправляет серверу пакет с установленным флагом SYN. При получении сервер возвращает клиенту пакет с установленными SYN+ACK. При его получении клиент отвечает третьим пакетом с ACK для подтверждения соединения.
SYN-наводнения основаны на отправке SYN-пакетов с одновременным запретом отправки пакетов SYN+ACK. Клиент может создать пакет с поддельным IP- адресом отправителя, так как ему не нужно на что-либо отвечать. Сервер заполнит очередь подключений полуоткрытыми соединениями, ожидающими окончательного пакета с ACK, до того, как удалит их из очереди. Очередь
342

Настольная книга по безопасности Gentoo ограничена определенным числом, и когда она заполнится, то станет невозможным принимать новые подключения. Если пакет с ACK не будет получен по истечении определенного временного интервала, то он будет автоматически удален из очереди. Настройки таймаута могут быть различными, но обычно они находятся в пределах 30—60 секунд или даже больше. Клиент инициирует атаку, создавая множество SYN-пакетов с различных IP-адресов и отправляя их на адрес цели как можно чаще, заполняя тем самым очередь полуоткрытыми соединениями и не позволяя другим клиентам устанавливать легитимные подключения к серверу.
В данном случае может быть полезным ограничение отправки. Можно ограничить частоту отправки принятых SYN-пакетов с помощью -m limit --limit 1/s, тем самым ограничив число SYN-пакетов до одного в секунду и оградив свои ресурсы от
SYN-наводнений.
Примечание: Другим решением, предотвращающим SYN-наводнения является использование
SYN cookies
, которые позволят вашему компьютеру отвечать на
SYN-пакеты без заполнения очереди подключений. SYN cookies могут быть включены при конфигурировании ядра Linux, однако на данный момент эта поддержка считается экспериментальной.
А теперь немного практических занятий!
Будучи загруженным в ядро, iptables предоставляет 5 ловушек, в которые вы можете поместить свои правила. Они называются INPUT, OUTPUT, FORWARD,
PREROUTING и POSTROUTING. Каждая из них называется цепочкой и содержит список правил. Каждое правило описывает, что если заголовок пакета выглядит как образец, то делать с этим пакетом нужно то-то и то-то. Если правило не подходит под пакет, то пакет переходит к следующему правилу в цепочке.
Вы можете поместить правила в 5 цепочках напрямую или создать новые цепочки и добавлять в них правила таким же способом, как и в обычную цепочку. Iptables поддерживает следующие параметры.
Параметр:
Описание:
-A
Добавление
-D
Удаление
-I
Вставка
-R
Замена
-L
Просмотр
-F
Удалить все правила в цепочке или все цепочки
-Z
Обнулить счетчики во всех цепочках
-C
Проверить этот пакет в цепочке
-N
Создать новую пользовательскую цепочку
-X
Удалить пользовательскую цепочку
-P
Изменить политику цепочки для цели
-E
Изменить имя цепочки
-p протоколе
343

Настольная книга по безопасности Gentoo
-s
Адрес/маска источника
-d
Адрес/маска назначения
-i
Входящее имя (имя ethernet)
-o
Исходящее имя (имя ethernet)
-j
Перейти (цель для правила)
-m
Расширенные сравнения (могут использовать внешние расширения)
-n
Числовой вывод адресов и портов
-t
Таблица для обработки
-v
Расширенный режим
-x
Расширить числа (вывести все значения)
-f
Проверять только второй и последующие фрагменты
-V
Версия пакета
--line-numbers Указывать номера строк при выводе
Сначала попробуем заблокировать все ICMP-пакеты, идущие на наш компьютер, просто для того, чтобы познакомиться с iptables поближе.
Листинг 1: Блокировка всех пакетов ICMP
# iptables -A INPUT -p icmp -j DROP
Сначала мы указываем цепочку, в которую хотим поместить правило, затем протокол проверяемого пакета и в конце цель. Цель может быть именем пользовательской цепочки или одной из специальных целей — ACCEPT, DROP,
REJECT, LOG, QUEUE или MASQUERADE. В случае, если мы укажем DROP, то пакет будет отброшен без уведомления клиента.
Примечание: LOG является «необрывающей» целью. Если пакет подпадает под правило с целью LOG, то он будет передан следующему правилу в цепочке, а не обработан только этим правилом. Это позволяет регистрировать пакеты и при этом их обрабатывать.
Теперь попробуйте выполнить ping localhost. Вы не должны получить ответа, так как iptables будет отбрасывать все входящие ICMP-сообщения. Вы также не сможете проверить и другие компьютеры, так как ответные ICMP-пакеты тоже будут отбрасываться. А теперь, чтобы вновь получать ICMP, очистим цепочку.
Листинг 2: Сбросить все правила
# iptables -F
Теперь взглянем на полноценную фильтрацию пакетов с помощью iptables. Если нужно полноценное исследование входящих пакетов на интерфейсе eth0, то выполним следующую команду:
Листинг 3: Принимать пакеты от уже установленных соединений
# iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
Это разрешит принимать любой пакет из уже установленного соединения или связанного в цепочке INPUT. Вы можете отбросить любой пакет, не
344

Настольная книга по безопасности Gentoo соответствующий состоянию таблицы, выполнив команду iptables -A INPUT -i eth0
-m state --state INVALID -j DROP сразу же после предыдущей. Эта команда включит фильтрацию пакетов на основании состояния, подключив внешнее расширение «state». Если вам необходимо разрешить подключаться клиентам к компьютеру, то вы можете использовать флаг --state NEW. Iptables содержит несколько модулей различного назначения. Вот некоторые из них:
Модуль/срав
нение
Описание
Расширенные параметры
mac
Расширение для проверки
MAC-адресов входящих пакетов.
--mac-source state
Включение проверки состояния соединения
--state (состоянием может быть
ESTABLISHED,RELATED, INVALID,
NEW)
limit
Частотное ограничение
--limit, --limit-burst owner
Попытка проверить различные характеристики создателя пакета
--uid-owner userid --gid-owner groupid
--pid-owner processid --sid-owner sessionid unclean
Различные случайны проверки пакетов на правильность
Теперь попробуем создать пользовательскую цепочку и применить ее для одного из существующих:
Листинг 4: Создание пользовательской цепочки
(Создаем новую цепочку с одним правилом)
# iptables -X mychain
# iptables -N mychain
# iptables -A mychain -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
(Разрешающая политика по умолчанию для всего исходящего трафика. Входящий будет отброшен.)
# iptables -P OUTPUT ACCEPT
# iptables -P INPUT DROP
(И добавление ее в цепочку INPUT)
# iptables -A INPUT -j mychain
Применив правило к входящей цепочке, мы получим следующую политику: все исходящие пакеты будут пропущены, а все входящие — отброшены.
Документация может быть найдена по адресу
Netfilter/iptables documentation
Теперь взглянем на полный пример. Мои правила для межсетевого экрана/шлюза будут следующими:

Подключения к межсетевому экрану разрешены только через SSH (порт 22)

Локальная сеть должна иметь доступ к HTTP, HTTPS и SSH (также должен быть разрешен DNS)

ICMP может содержать постороннюю информацию и не должен быть разрешен. Конечно же, мы разрешаем некоторые ICMP-сообщения.

Сканирование портов должно быть определено и зарегистрировано

SYN-атаки должны быть пресечены

Весь остальной трафик должен быть отброшен и запротоколирован
345

Настольная книга по безопасности Gentoo

Листинг 5: /etc/init.d/firewall
#!/sbin/runscript
IPTABLES=/sbin/iptables
IPTABLESSAVE=/sbin/iptables-save
IPTABLESRESTORE=/sbin/iptables-restore
FIREWALL=/etc/firewall.rules
DNS1=212.242.40.3
DNS2=212.242.40.51
#inside
IIP=10.0.0.2
IINTERFACE=eth0
LOCAL_NETWORK=10.0.0.0/24
#outside
OIP=217.157.156.144
OINTERFACE=eth1
opts="${opts} showstatus panic save restore showoptions rules"
depend() {
need net
}
rules() {
stop ebegin "Setting internal rules"
einfo "Setting default rule to drop"
$IPTABLES -P FORWARD DROP
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
#default rule einfo "Creating states chain"
$IPTABLES -N allowed-connection
$IPTABLES -F allowed-connection
$IPTABLES -A allowed-connection -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A allowed-connection -i $IINTERFACE -m limit -j LOG --log-prefix \
"Bad packet from ${IINTERFACE}:"
$IPTABLES -A allowed-connection -j DROP
#ICMP traffic einfo "Creating icmp chain"
$IPTABLES -N icmp_allowed
$IPTABLES -F icmp_allowed
$IPTABLES -A icmp_allowed -m state --state NEW -p icmp --icmp-type \
time-exceeded -j ACCEPT
$IPTABLES -A icmp_allowed -m state --state NEW -p icmp --icmp-type \
destination-unreachable -j ACCEPT
$IPTABLES -A icmp_allowed -p icmp -j LOG --log-prefix "Bad ICMP traffic:"
$IPTABLES -A icmp_allowed -p icmp -j DROP
#Incoming traffic einfo "Creating incoming ssh traffic chain"
$IPTABLES -N allow-ssh-traffic-in
$IPTABLES -F allow-ssh-traffic-in
#Flood protection
$IPTABLES -A allow-ssh-traffic-in -m limit --limit 1/second -p tcp --tcp-flags \
ALL RST --dport ssh -j ACCEPT
$IPTABLES -A allow-ssh-traffic-in -m limit --limit 1/second -p tcp --tcp-flags \
ALL FIN --dport ssh -j ACCEPT
$IPTABLES -A allow-ssh-traffic-in -m limit --limit 1/second -p tcp --tcp-flags \
ALL SYN --dport ssh -j ACCEPT
$IPTABLES -A allow-ssh-traffic-in -m state --state RELATED,ESTABLISHED -p tcp --dport ssh -j
ACCEPT
#outgoing traffic einfo "Creating outgoing ssh traffic chain"
$IPTABLES -N allow-ssh-traffic-out
$IPTABLES -F allow-ssh-traffic-out
$IPTABLES -A allow-ssh-traffic-out -p tcp --dport ssh -j ACCEPT
346

Настольная книга по безопасности Gentoo einfo "Creating outgoing dns traffic chain"
$IPTABLES -N allow-dns-traffic-out
$IPTABLES -F allow-dns-traffic-out
$IPTABLES -A allow-dns-traffic-out -p udp -d $DNS1 --dport domain \
-j ACCEPT
$IPTABLES -A allow-dns-traffic-out -p udp -d $DNS2 --dport domain \
-j ACCEPT
einfo "Creating outgoing http/https traffic chain"
$IPTABLES -N allow-www-traffic-out
$IPTABLES -F allow-www-traffic-out
$IPTABLES -A allow-www-traffic-out -p tcp --dport www -j ACCEPT
$IPTABLES -A allow-www-traffic-out -p tcp --dport https -j ACCEPT
#Catch portscanners einfo "Creating portscan detection chain"
$IPTABLES -N check-flags
$IPTABLES -F check-flags
$IPTABLES -A check-flags -p tcp --tcp-flags ALL FIN,URG,PSH -m limit \
--limit 5/minute -j LOG --log-level alert --log-prefix "NMAP-XMAS:"
$IPTABLES -A check-flags -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
$IPTABLES -A check-flags -p tcp --tcp-flags ALL ALL -m limit --limit \
5/minute -j LOG --log-level 1 --log-prefix "XMAS:"
$IPTABLES -A check-flags -p tcp --tcp-flags ALL ALL -j DROP
$IPTABLES -A check-flags -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG \
-m limit --limit 5/minute -j LOG --log-level 1 --log-prefix "XMAS-PSH:"
$IPTABLES -A check-flags -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
$IPTABLES -A check-flags -p tcp --tcp-flags ALL NONE -m limit \
--limit 5/minute -j LOG --log-level 1 --log-prefix "NULL_SCAN:"
$IPTABLES -A check-flags -p tcp --tcp-flags ALL NONE -j DROP
$IPTABLES -A check-flags -p tcp --tcp-flags SYN,RST SYN,RST -m limit \
--limit 5/minute -j LOG --log-level 5 --log-prefix "SYN/RST:"
$IPTABLES -A check-flags -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
$IPTABLES -A check-flags -p tcp --tcp-flags SYN,FIN SYN,FIN -m limit \
--limit 5/minute -j LOG --log-level 5 --log-prefix "SYN/FIN:"
$IPTABLES -A check-flags -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
# Apply and add invalid states to the chains einfo "Applying chains to INPUT"
$IPTABLES -A INPUT -m state --state INVALID -j DROP
$IPTABLES -A INPUT -p icmp -j icmp_allowed
$IPTABLES -A INPUT -j check-flags
$IPTABLES -A INPUT -i lo -j ACCEPT
$IPTABLES -A INPUT -j allow-ssh-traffic-in
$IPTABLES -A INPUT -j allowed-connection einfo "Applying chains to FORWARD"
$IPTABLES -A FORWARD -m state --state INVALID -j DROP
$IPTABLES -A FORWARD -p icmp -j icmp_allowed
$IPTABLES -A FORWARD -j check-flags
$IPTABLES -A FORWARD -o lo -j ACCEPT
$IPTABLES -A FORWARD -j allow-ssh-traffic-in
$IPTABLES -A FORWARD -j allow-www-traffic-out
$IPTABLES -A FORWARD -j allowed-connection einfo "Applying chains to OUTPUT"
$IPTABLES -A OUTPUT -m state --state INVALID -j DROP
$IPTABLES -A OUTPUT -p icmp -j icmp_allowed
$IPTABLES -A OUTPUT -j check-flags
$IPTABLES -A OUTPUT -o lo -j ACCEPT
$IPTABLES -A OUTPUT -j allow-ssh-traffic-out
$IPTABLES -A OUTPUT -j allow-dns-traffic-out
$IPTABLES -A OUTPUT -j allow-www-traffic-out
$IPTABLES -A OUTPUT -j allowed-connection
#Allow client to route through via NAT (Network Address Translation)
$IPTABLES -t nat -A POSTROUTING -o $OINTERFACE -j MASQUERADE
eend $?
}
start() {
ebegin "Starting firewall"
if [ -e "${FIREWALL}" ]; then restore
347

Настольная книга по безопасности Gentoo else einfo "${FIREWALL} does not exists. Using default rules."
rules fi eend $?
}
stop() {
ebegin "Stopping firewall"
$IPTABLES -F
$IPTABLES -t nat -F
$IPTABLES -X
$IPTABLES -P FORWARD ACCEPT
$IPTABLES -P INPUT ACCEPT
$IPTABLES -P OUTPUT ACCEPT
eend $?
}
showstatus() {
ebegin "Status"
$IPTABLES -L -n -v --line-numbers einfo "NAT status"
$IPTABLES -L -n -v --line-numbers -t nat eend $?
}
panic() {
ebegin "Setting panic rules"
$IPTABLES -F
$IPTABLES -X
$IPTABLES -t nat -F
$IPTABLES -P FORWARD DROP
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -A INPUT -i lo -j ACCEPT
$IPTABLES -A OUTPUT -o lo -j ACCEPT
eend $?
}
save() {
ebegin "Saving Firewall rules"
$IPTABLESSAVE > $FIREWALL
eend $?
}
restore() {
ebegin "Restoring Firewall rules"
$IPTABLESRESTORE < $FIREWALL
eend $?
}
restart() {
svc_stop; svc_start
}
showoptions() {
echo "Usage: $0 {start|save|restore|panic|stop|restart|showstatus}"
echo "start) will restore setting if exists else force rules"
echo "stop) delete all rules and set all to accept"
echo "rules) force settings of new rules"
echo "save) will store settings in ${FIREWALL}"
echo "restore) will restore settings from ${FIREWALL}"
echo "showstatus) Shows the status"
}
Вот несколько советов при создании правил для межсетевого экрана:
1. Создайте политику межсетевого экрана до того, как ее реализуете
2. Сделайте ее простой
3. Знайте принцип работы каждого протокола (прочитайте подходящий
RFC
)
4. Всегда помните, что межсетевой экран — это просто программа,
348

Настольная книга по безопасности Gentoo запускаемая с правами администратора.
5. Проверьте свой межсетевой экран
Если вам кажется, что iptables труден для понимания или нужно слишком много времени для настройки межсетевого экрана, то вы можете попробовать
Shorewall
Для генерации правил межсетевого экрана он использует iptables, но акцентируется на правилах и не указывает протокол.
12.f. Squid
Squid является очень хорошим прокси-сервером. Он может фильтровать трафик на основании времени, регулярных выражений в пути/URI, IP-адреса получателя и отправителя, домена, браузера, имени зарегистрированного пользователя, типа
MIME и номера порта (протокола). Некоторые возможности не указаны, но трудно перечислить их всех.
В следующем примере я добавил фильтр баннеров вместо фильтра, основанного на фильтрации порносайтов. По этой причине gentoo.org не должен быть перечислен в списке порносайтов. И я не собираюсь тратить свое время на поиски хороших сайтов для вас.
В данном случае, вот мои правила:

Веб-серфинг (HTTP/HTTPS) разрешен только в рабочее время (с понедельника по пятницу с 8 до 17 часов и в субботу с 8 до 13 часов), но если служащие остаются, то они должны работать, а не сидеть в интернете.

Скачивание файлов не разрешено (.exe, .com, .arj, .zip, .asf, .avi, .mpg, .mpeg и так далее)

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

Все остальные подключения в/из Интернета запрещены.
Все это реализуется в 4 простых шага.
Листинг 6: /etc/squid/squid.conf
# Указываем IP и порт http_port 10.0.2.1:3128
# Стандартная конфигурация hierarchy_stoplist cgi-bin ?
acl QUERY urlpath_regex cgi-bin \?
no_cache deny QUERY
# Добавляем основные списки контроля доступа acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object acl localhost src 127.0.0.1/255.255.255.255
# Добавляем тех, кто может пользоваться прокси acl localnet src 10.0.0.0/255.255.0.0
# Добавляем порты acl SSL_ports port 443
acl Safe_ports port 80
acl Safe_ports port 443
acl purge method PURGE
# Добавляем список контроля доступа, основанного на регулярных
349

Настольная книга по безопасности Gentoo
# выражениях, встречаемых в URL
acl archives urlpath_regex "/etc/squid/files.acl"
acl url_ads url_regex "/etc/squid/banner-ads.acl"
# Добавляем список контроля доступа, основанного на времени и дате acl restricted_weekdays time MTWHF 8:00-17:00
acl restricted_weekends time A 8:00-13:00
acl CONNECT method CONNECT
# Разрешаем менеджеру подключаться с localhost http_access allow manager localhost http_access deny manager
# Разрешать очищать запросы только с localhost http_access allow purge localhost http_access deny purge
# Запрещать запросы на неизвестные порты http_access deny !Safe_ports
# Запрещать подключение к портам, не относящимся к SSL
http_access deny CONNECT !SSL_ports
# Мои собственные правила
# Добавляем страницу, отображаемую на месте
# удаленного баннера deny_info NOTE_ADS_FILTERED url_ads
# Запрещаем баннеры http_access deny url_ads
# Запрещаем любые архивы http_access deny archives
# Ограничиваем доступ в рабочим временем http_access allow localnet restricted_weekdays http_access allow localnet restricted_weekends
# Запрещаем все остальное http_access deny all
Далее перечислим типы запрещенных к скачиванию файлов. Я добавил zip, viv, exe, mp3, rar, ace, avi, mov, mpg, mpeg, au, ra, arj, tar, gz и z файлы.
Листинг 7: /etc/squid/files.acl
\.[Zz][Ii][pP]$
\.[Vv][Ii][Vv].*
\.[Ee][Xx][Ee]$
\.[Mm][Pp]3$
\.[Rr][Aa][Rr]$
\.[Aa][Cc][Ee]$
\.[Aa][Ss][Ff]$
\.[Aa][Vv][Ii]$
\.[Mm][Oo][Vv]$
\.[Mm][Pp][Gg]$
\.[Mm][Pp][Ee][Gg]$
350

Настольная книга по безопасности Gentoo
\.[Aa][Uu]$
\.[Rr][Aa]$
\.[Aa][Rr][Jj]$
\.[Tt][Aa][Rr]$
\.[Gg][Zz]$
\.[Zz]$
Примечание: Обратите внимание на [] с заглавными и строчными буквами. Это сделано для того, чтобы никто не смог обмануть наш фильтр, пытаясь скачать файл с расширением AvI вместо avi.
Далее добавим регулярные выражения для определения баннеров. Вы, возможно, будете более изобретательнее меня:
Листинг 8: /etc/squid/banner-ads.acl
/adv/.*\.gif$
/[Aa]ds/.*\.gif$
/[Aa]d[Pp]ix/
/[Aa]d[Ss]erver
/[Aa][Dd]/.*\.[GgJj][IiPp][FfGg]$
/[Bb]annerads/
/adbanner.*\.[GgJj][IiPp][FfGg]$
/images/ad/
/reklame/
/RealMedia/ads/.*
^http://www\.submit-it.*
^http://www\.eads.*
^http://ads\.
^http://ad\.
^http://ads02\.
^http://adaver.*\.
^http://adforce\.
adbot\.com
/ads/.*\.gif.*
_ad\..*cgi
/Banners/
/SmartBanner/
/Ads/Media/Images/
^http://static\.wired\.com/advertising/
^http://*\.dejanews\.com/ads/
^http://adfu\.blockstackers\.com/
^http://ads2\.zdnet\.com/adverts
^http://www2\.burstnet\.com/gifs/
^http://www.\.valueclick\.com/cgi-bin/cycle
^http://www\.altavista\.com/av/gifs/ie_horiz\.gif
И в заключении мы хотим, чтобы отображался следующий файл вместо удаленного баннера. Он основан половине HTML-файла с прозрачным GIF- изображением размером 4х4.
Листинг 9: /etc/squid/errors/NOTE_ADS_FILTERED



ERROR: The requested URL could not be retrieved


351
1   ...   27   28   29   30   31   32   33   34   ...   79


База данных защищена авторским правом ©nethash.ru 2019
обратиться к администрации

войти | регистрация
    Главная страница


загрузить материал