Squid на FreeBSD и домен Windows Server 2003

Для того, чтобы облегчить администрирование доступа к интернету на прокси-сервере Squid, было принято решение использовать доменные аккаунты пользователей и их пароли. Предлагаю пошаговое руководство по воду сервера под управлением FreeBSD в домен Windows и использование доменных аккаунтов и групп безопасности в Squid для доступа в интернет.

В примере будет использоваться имя компьютера – COMPUTER, домен – DOMAIN.RU, уполномоченный доменный пользователь – admin. Сервер под управлением FreeBSD 7.2-RELEASE, кэширующий прокси – squid-3.0.24, winbind в составе samba34-3.4.5_1.

1. Проверьте в Active Directory, не существует ли уже в домене компьютер с именем, который вы хотите сейчас присоединить к AD. Если имя уже используется, то выберите другое имя для нового члена AD. Так же необходимо синхронизировать время присоединяемого компьютера с временем домена. Сделать это можно командой ntpdate с указанием сервера времени вашего домена (в моем случае – это 192.168.0.1):

# ntpdate 192.168.0.1
10 Feb 14:37:44 ntpdate[61010]: step time server 192.168.0.1 offset -1.405955 sec

2. Установите в систему samba, с поддержкой ADS (Active Directory support) и WinBIND, как указано на рисунке:

Рис.1

# cd /usr/ports/net/samba34/
# make config
# make && make install && make clean

Вносим изменения в конфигурационный файл samba (в моем случае samba используется только для работы с доменом, расшаренных ресурсов на сервере нет):

# nano -w /usr/local/etc/smb.conf
[global]
 # указываем рабочую группу
        workgroup = DOMAIN
 # указываем домен
        realm = DOMAIN.RU
 # домен-контроллер
        password server = 192.168.0.2
 # имя нашего сервера с прокси
        netbios name = COMPUTER
 # комментарий к имени нашего компьютера в сети
        server string = computer
 # указываем сетевой интерфейс для работы samba
        interfaces = em0
 # принимать SMB-запросы только на указанных интерфейсах
        bind interfaces only = yes
 # IP-адрес нашего сервера
        socket address = 192.168.0.4
        socket options = SO_RCVBUF=8192 SO_SNDBUF=8192 TCP_NODELAY
 # порт для работы samba
        smb ports = 139
 # подсети, с которых принимаем SMB-запросы
        hosts allow = 192.168.0 127.
 # указываем режим работы samba (Active Directory support)
        security = ADS
        idmap backend = tdb
 # время в сек. хранения ответа на запрос winbind'ом (неделя)
        idmap cache time = 604800
 # диапазон пользовательских идентификаторов, полученных winbind'ом
        idmap uid = 1000000-2000000
 # диапазон идентификаторов для групп, полученных winbind'ом
        idmap gid = 1000000-2000000
 # использовать зашифрованные пароли при общении с AD
        encrypt passwords = yes
 # использовать этот разделитель пары DOMAIN / user
        winbind separator = +
 # заставляем winbind нумеровать доменных пользователей
        winbind enum users = yes
 # заставляем winbind нумеровать доменные группы
        winbind enum groups = yes
 # всех пользователей считать членами домена по-умолчанию
        winbind use default domain = yes
 # не загружать принтеры
        load printers = no
 # расположение и формат логов samba
        log file = /var/log/samba/log.%m
 # уровень логирования samba
        log level = 3
 # максимальный размер лога (в килобайтах)
        max log size = 1000
 # порядок сопоставления ip-адресов их именам
        name resolve order = host lmhost bcast
 # говорим samba не становиться мастер-браузером
        local master = no
 # говорим samba, что она не домен контроллер
        domain master = no
 # говорим samba, что она не wins-сервер
        dns proxy = no
 # говорим samba, что она не первичный мастер-браузер
        preferred master = no
 # кодировка для отображения сообщений на стандартном выводе
        display charset = koi8-r
 # кодировка при общении с другими SMB-клиентами
        unix charset = koi8-r
 # кодировка при общении с DOS-подобными системами
        dos charset = cp866
 # время неактивности, по истечении которого клиент отключается от samba
        deadtime = 5

Теперь внесем в файл /etc/rc.conf строку, разрешающую запуск winbind:

# nano -w /etc/rc.conf
winbindd_enable="YES"

После окончания конфигурирования samba дадим команду testparm, которая проверить наш конфигурационный файл smb.conf на возможные ошибки и выведет на экран параметры, которые установлены не по-умолчанию:

# testparm 
Load smb config files from /usr/local/etc/smb.conf
max_open_files: sysctl_max (11095) below minimum Windows limit (16384)
rlimit_max: rlimit_max (11095) below minimum Windows limit (16384)
Loaded services file OK.
'winbind separator = +' might cause problems with group membership.
Server role: ROLE_DOMAIN_MEMBER
Press enter to see a dump of your service definitions
[global]
        dos charset = cp866
        unix charset = koi8-r
        display charset = koi8-r
        workgroup = DOMAIN
        realm = DOMAIN.RU
        server string = computer
        interfaces = em0
        bind interfaces only = Yes
        security = ADS
        password server = 192.168.0.2
        log level = 3
        log file = /var/log/samba/log.%m
        max log size = 1000
        smb ports = 139
        read raw = No
        name resolve order = host lmhost bcast
        deadtime = 5
        socket options = SO_RCVBUF=8192 SO_SNDBUF=8192 TCP_NODELAY
        load printers = No
        local master = No
        domain master = No
        dns proxy = No
        socket address = 192.168.0.4
        idmap uid = 1000000-2000000
        idmap gid = 1000000-2000000
        winbind separator = +
        winbind enum users = Yes
        winbind enum groups = Yes
        winbind use default domain = Yes
        hosts allow = 192.168.0, 127.

Нам осталось запустить samba и проверить ее работу:

# /usr/local/etc/rc.d/samba start
Removing stale Samba tdb files: ... done
Starting winbindd.

3. Теперь введем наш сервер в домен. Командой kinit получаем билетик для kerberos, чтобы подключиться к домену. Необходимо указать доменного пользователя, который имеет право на присоединение компьютера к домену, а так же его доменный пароль:

# kinit admin
admin@DOMAIN.RU's Password:
kinit: NOTICE: ticket renewable lifetime is 1 week

4. Командой klist проверяем наличие билетика:

#  klist
Credentials cache: FILE:/tmp/krb5cc_0
        Principal: admin@DOMAIN.RU
    Issued               Expires              Principal
Feb 10 14:18:04  Feb 11 00:18:04  krbtgt/DOMAIN.RU@DOMAIN.RU

5. Теперь с помощью команды net производим присоединение компьютера к домену, указав имя доменного пользователя и его пароль, которого мы указывали при получении билетика для kerberos.

#  net join -U admin
Enter admins's password:
Using short domain name -- DOMAIN
Joined 'COMPUTER' to realm 'domain.ru'

6. Теперь необходимо внести изменения в конфигурационный файл системных баз данных и переключателя сервисов имен/etc/nsswitch.conf, чтобы указать системе, каким образом искать базы с именами доменных пользователей и доменными группами безопасности.

 

# nano -w /etc/nsswitch.conf
group: files winbind
passwd: files winbind
shadow: files winbind

 

group_compat: nis
hosts: files dns
networks: files
passwd_compat: nis
shells: files
services: compat
services_compat: nis
protocols: files
rpc: files

 

Первые три строки теперь говорят системе, что пользователей и группы нужно искать с помощью winbind.

7. На этом этапе нам надо проверить работу winbind командой wbinfo:

# wbinfo -p
Ping to winbindd succeeded

Если вы видите такое же сообщение – то демон winbind успешно запущен. Теперь произведем отображение существующих в домене пользователей и групп. Команда

# wbinfo -g

выведет список всех групп. Команда

# wbinfo -u

выведет список всех пользователей. Командой id вы сможете узнать принадлежность какого-либо пользователя к группам:

# id admin
uid=1000001(admin) gid=1000000(пользователи домена) groups=1000000(пользователи домена),
1000005(администраторы домена),1000006(владельцы-создатели групповой политики),
1000008(dnsupdateproxy),1000010(издатели сертификатов),1000021(debugger users),1000022(olap administrators),
1000038(администраторы exchange),1000043(dnsadmins),1000045(exchange organization administrators),
1000050(администраторы предприятия),1000051(администраторы схемы)

8. Осталось установить squid и внести изменения в его конфигурационный файл. Делаем:

# cd /usr/ports/www/squid30
# make config
# make install && make clean

Теперь надо внести в файл /etc/rc.conf строку squid_enable=“YES, разрешающую запуск собранного нами порта squid.

#  nano -w /etc/rc.conf
squid_enable="YES"

Теперь нам необходимо внести в конфигурационный файл прокси-сервера squid необходимые нам изменения, чтобы дать нашим доменным пользователям право на доступ в интернет. Редактируем файл /usr/local/etc/squid/squid.conf

# nano -w /usr/local/etc/squid/squid.conf

Находим секцию OPTIONS FOR AUTHENTICATION и производим в ней следующие изменения (конфигурируем squid на работу с winbind (ntlm, basic) авторизацией). Для этого раскомментирываем указанные ниже строки и добавляем свои настройки:

 # указываем инструменту ntlm_auth от winbind'а какой использовать хелпер для ntlm-аутентификации
 # доменных пользователей
auth_param ntlm         program /usr/local/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp
 # указываем, сколько данных хелперов запускать (исходить надо из численности вашей организации,
 # при их нехватке, добавляйте число хелперов)
auth_param ntlm         children 15
 # говорим squid поддерживать соединение, при начальном подключении браузера
auth_param ntlm         keep_alive on
 # указываем инструменту ntlm_auth от winbind'а какой использовать хелпер для при basic-аутентификации
 # доменных пользователей
auth_param basic        program /usr/local/bin/ntlm_auth --helper-protocol=squid-2.5-basic
 # указываем количество хелперов данной аутентификации
auth_param basic        children 10
 # указываем часть текста, который будет виден пользователю при запросе от него имени / пароля
auth_param basic        realm Squid proxy-caching web server
 # определяет, как долго squid не будет переспрашивать у хелпера пару логин / пароль
auth_param basic        credentialsttl 2 hours
 # не учитывать регистр в именах пользователей
auth_param basic        casesensitive off

Теперь надо объявить некоторые минимальные ACL в конфигурационном файле squid:

 # описываем диапазон нашей сети
acl our_network         src             192.168.10.0/24
 # описываем диапазон сетей нашего домена
acl our_domain          dst             192.168.0.0/16
 # пускаем через squid нашу подсеть ко всем ресурсам нашего домена
http_access             allow           our_domain      our_network
 # описываем, каким образом будет осуществляться аутентификация на squid
 # требуем от пользователей аутентификацию
acl SQUID proxy_auth REQUIRED
 # указываем, где брать сопоставление логин / паролей и как проводить проверку
external_acl_type nt_group ttl=10 %LOGIN /usr/local/libexec/squid/wbinfo_group.pl
 # объявляем две простейшие ACL
 # deny - группа пользователей в домене, кому мы запрещаем доступ в интернет
acl     deny_inet      external nt_group       deny
 # full - группа пользователей в домене, кому мы разрешаем доступ в интернет
acl     full_inet      external nt_group       full
 # объявляем правила доступа для этих групп
http_access             deny            all     deny_inet
http_access             allow           all     full_inet
 # и наконец запрещаем всем остальным доступ к интернету через наш squid
http_access deny all

Теперь дадим команду squid проверить написанный нами конфигурационный файл:

#squid -f /usr/local/etc/squid/squid.conf -k parse
2010/02/19 12:43:03| Processing Configuration File: /usr/local/etc/squid/squid.conf (depth 0)

Если в результате работы команды мы не видим никаких ошибок – то теперь нам надо проинициализировать swap-каталоги squid командой:

# squid -z

А еще надо дать права squid на рекурсивный доступ к каталогу /var/db/samba34/winbindd_privileged:

# chown -R root:squid /var/db/samba34/winbindd_privileged

Все. Запускаем squid командой:

# /usr/local/etc/rc.d/squid start

Ставим в известность пользователей о доступности прокси-сервера и смотрим в реальном режиме времени логи squid по пути:

# tail -f /usr/local/squid/logs/access.log
# tail -f /usr/local/squid/logs/cache.log

В результате проделанной работы мы получили сервер FreeBSD в домене с настроенным прокси-сервером squid с доступом в интернет для доменных пользователей.