Ключевые слова:iptables, ldap, firewall, linux, gateway, dhcp, samba, (найти похожие документы)
From: Першин Сергей <029ah@mail.ru.>
Date: Wed, 2 Aug 2007 18:21:07 +0000 (UTC)
Subject: LDAP + динамические iptables
Оригинал: http://www.invask.ru/linuxtools/ldap-iptables/
Введение
--------
Дано:
* Центральный сервер под linux, на котором установлены
[main.org.int]:
* База данных LDAP
* Контроллер домена на Samba 3.x.x, со списком пользователей в БД
LDAP
* DHCP-сервер с конфигом в БД LDAP
Шлюз в интернет под linux + прозрачный прокси [gate.org.int]
Итак, все настроено и работает через обычный NAT, но хочется большего
+). Задача состояла в том, чтобы пользователь, садясь за любую машину
в домене, входил под своим именем и паролем, и шлюз тут же получал
информацию о том, можно ли этому пользователю пользоваться интернетом,
и с какими правилами.
Настройка шлюза
Подготовка iptables
Для динамического переконфигурирования необходимо создать 6 цепочек, в
которые скриптом будут добавляться правила, не влияя на общие
настройки. Цепочки, оканчивающиеся на _fixed - для хостов, которые
всегда должны иметь доступ в интернет (сервера, машины, не входящие в
домен, ...). Остальные - для машин в домене Samba.
root# iptables -N dynamic_squid_fixed
root# iptables -N dynamic_squid
root# iptables -I dynamic_squid 1 -j REJECT
root# iptables -t nat -N dynamic_nat_prerouting
root# iptables -t nat -N dynamic_nat_prerouting_fixed
root# iptables -t nat -N dynamic_nat_postrouting
root# iptables -t nat -N dynamic_nat_postrouting_fixed
root# iptables -t nat -I PREROUTING 1 -j dynamic_nat_prerouting_fixed
root# iptables -t nat -I PREROUTING 2 -j dynamic_nat_prerouting
root# iptables -t nat -I POSTROUTING 1 -j
dynamic_nat_postrouting_fixed
root# iptables -t nat -I POSTROUTING 2 -j dynamic_nat_postrouting
В цепочки dynamic_squid и dynamic_squid_fixed будут добавляться хосты,
которым разрешено выходить в интернет и, соостетственно, пользоваться
прокси. Поэтому в цепочке INPUT нужно сделать ссылку на них, чтобы
проверить, разрешено ли соединение.
Важен порядок прохождения - сначала все соединения на порт squid'а
3128 нужно завернуть в цепочку dynamic_squid_fixed, в которой все
разрешенные хосты будут приняты правилом -j ACCEPT. Остальные -
вернутся и должны быть завернуты в цепочку dynamic_squid. В ней все
разрешенные хосты будут возвращены из цепочки правилом -j RETURN, а
остальные - обработаны правилом -j REJECT, которое было добавлено при
создании цепочки. Поэтому после ссылок на цепочки нужно разрешить
соединения на порт 3128. $INET_IF - имя сетевого интерфейса,
смотрящего в интернет.
iptables -A INPUT -i ! $INET_IF -p tcp --dport 3128 -j dynamic_squid_fixed
iptables -A INPUT -i ! $INET_IF -p tcp --dport 3128 -j dynamic_squid
iptables -A INPUT -i ! $INET_IF -p tcp --dport 3128 -j ACCEPT
Цепочки dynamic_nat_* - будут содержать правила MASQUERADE для простых
хостов, DNAT, SNAT для хостов с реальными IP, и REDIRECT для
прозрачного прокси.
не забудьте сохранить настройки iptables +)
Статически разрешенные хосты
Первый скрипт - /usr/local/sbin/[1]ldap-inet-fixed отвечает за
занесение хостов с постоянно разрешенным интернетом в цепочки
iptables. Эти хосты должны быть записаны в БД LDAP как объекты с
классами dhcpHost и hostInternetAccess, имеющие фиксированный IP
(атрибут dhcpStatements, со значением "fixed-address: xx.xx.xx.xx").
Класс hostInternetAccess - дополнительный класс, который приведен
ниже, в настройках основного сервера.
Его конфигурационный файл - /etc/ldap-inet/ldap-inet-fixed.conf:
host main.org.int
dn cn=ldaptools,ou=Services,dc=org,dc=int
password SECRET_WORD
base cn=Network,dc=org,dc=int
inet_if eth1
здесь dn - имя учетной записи в БД LDAP, имеющая права чтения на ветку
с конфигурацией DHCP, password - пароль, base - ветка с конфигурацией,
inet_if - интерфейс, смотрящий в интернет
Запускать этот скрипт имеет смысл при загрузке системы, и раз в сутки,
ночью.
Динамически разрешенные хосты
Скрипт /usr/local/sbin/ldap-inet-dynamic - должен запускаться при
входе пользователя в домен. Ему передаются два параметра - логин
пользователя, и IP-адрес хоста, на котором он залогинился.
Его конфигурационный файл - /etc/ldap-inet/ldap-inet-dynamic.conf:
host main.org.int
dn cn=ldaptools,ou=Services,dc=org,dc=int
password SECRET_WORD
base cn=People,dc=org,dc=int
inet_if eth1
Совпадает с конфигом предыдущего хоста, за исключением base - здесь
указывается ветка, в которой Samba хранит пользователей домена.
Удаленный запуск скрипта
Скрипт /usr/local/sbin/ldap-inet-dynamic будет вызываться
пользователем rpc, заведенным на сервере специально для этих целей.
Для того, чтобы запустить скрипт как суперпользователь, нужно
настроить утилиту sudo. Добавим в файл /etc/sudoers запись:
rpc gate.org.int=NOPASSWD: /usr/local/sbin/ldap-inet-dynamic
Теперь нужно настроить ssh для того, чтобы основной сервер выполнял
команды на шлюзе. Выполняем (на основном сервере!):
root# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx [email protected]
Passphrase задавать не нужно. Файл /home/root/.ssh/id_rsa.pub копируем
на шлюз в файл /home/rpc/.ssh/authorized_keys, и все, настройка шлюза
закончена.
Настройка основного сервера
Настройка LDAP
В первую очередь необходимо в схему LDAP включить дополнительное
описание. Создаем файл /etc/openldap/schema/internet-access.schema
attributetype ( 1.1.2.1.1.12
NAME 'hostAllowInternet'
DESC 'Allow internet'
EQUALITY booleanMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )
attributetype ( 1.1.2.2.1.3
NAME 'hostRealIP'
EQUALITY caseIgnoreIA5Match
DESC 'Real IP address'
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
attributetype ( 1.1.2.1.1.4
NAME 'hostForceProxy'
DESC 'Transparent proxy control'
EQUALITY booleanMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )
objectclass ( 1.1.2.2.1.1
NAME 'hostInternetAccess'
SUP top AUXILIARY
DESC 'Allow internet access to this object'
MUST (hostAllowInternet)
MAY (hostRealIP $ hostForceProxy))
Здесь атрибуты hostAllowInternet - возможность доступа в интернет и к
прокси-серверу. hostRealIP - реальный IP-адрес, выдаваемый хосту.
Выдается он через DNAT+SNAT - пробросом соединений на указанный адрес
из интернета на хост, куда залогинился пользователь (или на
фискированный адрес DHCP). hostForceProxy - дополнительный атрибут, с
помощью которого можно отключить прозрачный прокси для пользователя.
Если он не указан, соединения идут через прокси.
в файл /etc/openldap/slapd.conf добавляем:
include /etc/openldap/schema/internet-access.schema
Далее нужно добавить этот objectClass DHCP- и Samba- записям в БД.
Через консоль мне это делать немного лень, поэтому я использовал
phpLdapAdmin, где все достаточно просто - выбираем самбовскую учетную
запись cn=testuser,ou=People,dc=org,dc=int, нажимаем "добавить
значение" около classObject, выбираем hostInternetAccess, указываем
атрибуту hostAllowInternet значение TRUE, и сохраняемся. Впрочем, если
вы настроили LDAP+Samba+DHCP, то вам наверняка известно, как это
сделать, не хуже меня +)
Настройка Samba
Создаем скрипт, который будет вызываться при входе пользователя (или
модифицируем тот, который уже есть +):
/var/lib/samba/login.sh
#!/bin/sh
ssh [email protected] "sudo /usr/local/sbin/ldap-inet-dynamic \"$1\" \"$3\""
Правим секцию шары [profiles] в файле /etc/samba/smb.conf (а именно -
добавляем последнюю строку):
[profiles]
comment = Profiles
path = /var/lib/samba/profiles
read only = no
create mask = 0600
directory mask = 0700
browseable = no
root preexec = /var/lib/samba/login.sh "%u" "%g" "%I"
Заключение
Если я нигде не опечатался, это все должно заработать +). Но важна,
наверное, не конкретно эта реализация, а то, что централизованное
управление на основе БД LDAP - потрясающая штука! Так, например,
помимо динамических iptables, я достаточно легко прикрутил и систему
учета трафика, которая теперь считает не на основе IP-адреса, а на
основе доменного имени пользователя.
029ah <029ah@mail.ru.>