Ноя 10 2008

Безопасность сети.

Практически в любой, более-менее большой сети, обязательно заведутся «умные люди», которые попытаются оторвать себе кусок побольше, обойти шейп, миновать транспарент прокси, т.е. нарушить политику сети. И как правило оказывается, что оборудование, уже установленное и работающее не позволяет обеспечить, достаточно спокойную жизнь сисадмина. Приходится изобретать, что бы заставить пользователя использовать тот IP, который ему выдали. Для этого воспользуемся связкой из нескольких инструментов:

  1. isc-dhcpd — им мы будем выдавать статически назначенные адреса
  2. pf — с помойщью pf будем блокировать всех, кто не получает адреса по dhcp
  3. MySQL — тут будем хранить выданные ip и время выдачи ip
  4. Syslog — передает события dhcp перловым парсерам
  5. Плюс немного кода на перле

isc-dhcp установим из портов:

cd /usr/ports/net/isc-dhcp30-server/
 
make install clean

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

Для нашей задачи потреуется сконфигурировать dhcp сервер так, что бы он выдавал «честным» пользователям статические адреса из блока 192.168.0.1-192.168.0.128, этот блок мы запоминаем просто для себя. Для всех остальных(незарегестрированных) выдаем из блока 192.168.0.129-192.168.0.254, этот блок мы в настройках наших скриптов, запретим на добавление в таблицу.

Нистройки dhcpd (/usr/local/etc/dhcpd.conf) имеют такой вид:

option domain-name "hilik.org.ua";
option domain-name-servers 192.168.0.1;
 
default-lease-time 600;
max-lease-time 7200;
 
authoritative;
ddns-update-style ad-hoc;
log-facility local7;
 
subnet 192.168.0.0 netmask 255.255.255.0 {
range 192.168.0.129 192.168.0.254;
option domain-name-servers 192.168.0.1;
option domain-name "hilik.org.ua";
option routers 192.168.0.1;
option broadcast-address 192.168.0.255;
default-lease-time 600;
max-lease-time 7200;
}
 
host user1 {
hardware ethernet 00:CB:FB:EC:D6:DB;
fixed-address 192.168.0.2;
}
 
host user2 {
hardware ethernet 00:15:fe:ce:6e:1e;
fixed-address 192.168.0.3;
}
 
host user3 {
hardware ethernet 00:1c:f0:9e:56:ba;
fixed-address 192.168.0.4;
}

Настройки особых сложностей не вызывает.

Теперь приступим к установке базы MySQL:
Создадим базу:

CREATE DATABASE dhcp_user;

Настроим доступ к базе:

GRANT ALL ON dhcp_user.* TO 'hilik'@'localhost' IDENTIFIED BY 'hilik';

Теперь можно создать таблицу:

 CREATE TABLE `cur_users` (
  `ip` VARCHAR(15) NOT NULL,
  `time` INT(11) DEFAULT NULL,
  PRIMARY KEY  (`ip`),
  KEY `time_idx` (`time`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251

Теперь можно взять 2 скрипта, которые я написал и приступить к их настройке:
clearip
setip

в первую очередь установим модули перла, которые нужны для работы скриптов. Устанавливаем из портов:
/usr/ports/net-mgmt/p5-Net-CIDR/ — он нужен, для того, что бы определить принадлежность ip к разрешенной сети
/usr/ports/databases/p5-DBD-mysql50/ — модуль подключения к MySQL, при установке, необходимо установить тот, что соответствует версии MySQL, установленной у вас на сервере.
Поместим скрипты в /root/bin/, при необходимости, создайте эту папку, и сделайте их исполняемыми.
Теперь настраиваем скрипты, в самих скриптах подробно описан каждый параметр, который нужно настроить.
setip.pl:

#Пользователь для соединения с базой mysql
$my_login="hilik";
#Пароль для соединения с mysql
$my_pass="hilik";
#Хост на котором находится dhcp сервер
$my_host="localhost";
#база которую мы будем использовать
$my_db="dhcp_users";
#таблица pf в которую будут заносится ip
$table="dhcp_hosts";
#Сеть, которую необходимо добавлять в таблицу
#разрешенная сеть
@net=("192.168.0.0/25");
#pfctl
$pfctl="/sbin/pfctl";
#Файл таблицы pf
$table_file="/etc/dhcp_hosts";

Указываем, все параметры, необходимые для работы, и теперь его можно установить для работы в syslog.conf.

!dhcpd
*.*                                             | exec /root/bin/setip.pl
!dhcpd
*.*                                             /var/log/dhcpd.log

Теперь любое событие dhcp сервера будет передаваться скрипту.
Для того, что бы видеть, какие события передаются, ниже установлена запись в файл, для контроля.
Второй скрипт clearip.pl, нужен для того, что бы убирать «просроченные» ip из таблицы pf и mysql, закрывая им доступ.
Настройки:

#Пользователь для соединения с базой mysql
$my_login="hilik";
#Пароль для соединения с mysql
$my_pass="hilik";
#Хост на котором находится dhcp сервер
$my_host="localhost";
#база которую мы будем использовать
$my_db="dhcp_users";
#таблица pf в которой находятся ip
$table="dhcp_hosts";
#pfctl
$pfctl="/sbin/pfctl";
#Время аренды ip + 1 минута
$live_time=300+60;
#Файл таблицы pf
$table_file="/etc/dhcp_hosts";

После того, как мы настроили clearip.pl, поставим его на cron, выполняться раз в минуту:

crontab -e

и вносим:

*       *       *       *       *       /root/bin/clearip.pl

Теперь можно подождать минут 5-10, что бы те ip, срок аренды которых истек, создали запрос на получение нового адреса. И проверяем, наличие адресов в таблице:

pfctl -t dhcp_hosts -T show

Если в выводе присутствуют ip, мы все настроили как надо.
Проверяем наличие файла таблици:

ls -la /etc/dhcp_hosts

Убедившись что и это работает как надо, можно присутпать к настройке pf.
Для того что бы настроить в ядре файервол необходимо добавить такие строки в конфиг ядра:

device          pf
device          pflog

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

table  <dhcp_hosts> persist file "/etc/dhcp_hosts"

Добавляем само правила:

pass in log quick on $int_if proto { tcp, udp, icmp } from 192.168.0.0/24 to 192.168.0.1
block in log on $int_if from !<dhcp_hosts> to any

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

pfctl -f /etc/pf.conf

Настройка окончена.

Необходимые файлы для работы:
clearip
setip

Добавить в закладки:

google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru
  • By dohlyi, 02.01.2009 @ 01:02

    Добавил в закладки.

Other Links to this Post


Украинская Баннерная Сеть