27.05.2010 Squid+Sams+Samba+NTLM_AD на Gentoo

0.250 Предисловие:

Работал я пару тройку лет назад в конторке, которая занималась продажей интернет трафика, где был толстый канал и интернет раздавался через PPTP/PPPOE, все как положено шифрованный, канал статический айпишник. Подключил инет - начал платить бабло, отключил - перестал платить. И все бы ничего...
Но вот однажды, по счастливой случайности, мне пришлось сменить место работы - оказался я на небольшом заводике. Основная деятельность завода - оборонка: ракеты ремонтируем, каски для солдат клепаем, ничего интересного.... Только по соображениям безопасности или ущербности(не мне решать), на заводе стоял ADSL 2 Мбит/сек. И полный бардак в IT...

0.5 Имею:

2 дряхлых сервера под управлением Windows 2003(PDC,BDC) и писюк(Thunderbird 2.1 Ггц, 512 мб, 80гб IDE) с доисторическим RedHat`ом (kernel 2.4), который выполнял роль роутера(Бугага: управляли этим писюком через webmin Х_х). Начал я думать и гадать....

0.7 Надо:

1. Как накормить этим интернетом 500+ человек.
2. При возможности заблокировать ненужные ресурсы...
3. Порезать канал пользователям, дабы не скучно самому было сидеть в интернете.

1. Начнем:

Мною было решено поставить свою любимую Gentoo на Soft-raid. Интернет, после некоторых раздумий, было решено раздавать через прокси. И тут я задался вопросами: "Как резать? Как считать? Как ограничивать доступ?" При наличии биллинга все делается без проблем, но тут контора на IT вообще положила все свое "мужиство" и отказывалась покупать какой-либо софт. Сначала я перерыл все бесплатные биллинги - все кривые, у всех дебильный интерфейс и куча глюков, с которыми воевать не было сил. Потом я наткнулся на статью про SAMS, почитал - мне понравилось.
По счастливой случайности Sams(Squid account management system): бесплатный, обладает всеми перечисленными выше опциями, ставится под Gentoo! Впоследствии от антивирусной проверки HAVP+CLAMAV пришлось отказаться, за исключительной глючностью связки, да и зачем отбирать кусок хлеба у СТО(Служба Технического Обслуживания).
Сносим гамно,ставим Gentoo на софтварный рейд.

squid - самый известный\мощный кеширующий http\ftp прокси
sams - система учета пользователей сквид
samba - нам нужен winbindd для реализации ntlm аутентификации
mysql - база данных для хранения инфы о прошедшем через сквид трафе.

Все пакеты можно поставить ручками из исходников... но у нас же Gentoo поэтому

Внимание на момент написания статьи использовались следующие версии пакетов:

Squid Cache: Version 2.6.STABLE20
SAMS-1.0.4
samba 3.0.34
glibc-2.8_p20080602
gcc версия 4.1.2 (Gentoo 4.1.2 p1.1)
mysql  Ver 14.12 Distrib 5.0.60, for pc-linux-gnu (i686) using readline 5.2
libtool-2.2.6a


Теперь разберемся с настройками компилятора и USE-флагами:
Мне скрывать нечего, кушайте на здооровье...

# cat /etc/make.conf
CFLAGS="-march=prescott -O2 -pipe -fomit-frame-pointer"
CXXFLAGS="${CFLAGS)" //опечатка допущена намеренно, т.к. сайт сжирает содержимое
CHOST="i686-pc-linux-gnu"

APACHE2_MODULES="alias auth_basic authn_alias authn_anon authn_dbd authn_dbm authn_default authn_file authz_dbm authz_default authz_groupfile authz_owner authz_user autoindex dbd proxy_balancer vhost_alias authz_host dir mime rewrite speling auth_digest proxy proxy_connect proxy_ftp proxy_http"
USE="radius eap-tls java png jpeg snmp qos ctype ads ldap spell soap cli pcre xml zlib clamav curl curlwrappers truetype logrotate bzip2 cgi exif ftp gd json zip samba -cups winbind apache2 mysql php unicode slang -X -gnome -kde -kde4"
MAKEOPTS="-j9"
LINGUAS="ru en"
ACCEPT_KEYWORDS="~x86"
GENTOO_MIRRORS="ftp://linux4u.jinr.ru/pub/gentoo"
PORTDIR_OVERLAY="/usr/local/portage"


Так, определились где чего взять, где что почитать...

2. Определимся что хотим получить

Коротко - самс считывает логи сквида своим демоном через определенный интервал портирует данные в мускуль о количестве трафика, о посещенных страницах и времени посещения. Через веб-интерфейс SAMS`a мы редактируем пользователей, шаблоны с настройками, блокировки страниц через ключевые слова и регулярные выражения или баннеров. Доступны несколько вариантов аутентификации пользователей, но в условиях "заводика" актуальны два - ip и ntlm. Переконфигурацию сквида самс так же производит сам через веб-интерфейс, достаточно нажать кнопочку "реконфигурировать squid".
Для авторизации по ip фактически ничего не нужно, для того чтобы заработала авторизация NTLM в домене (2000-2008 проверено)необходимо ввести в домен нашу Gentoo`шную тачку. Для этого самбу надо скомпелить с поддержкой WinBindd.

Компилим Samba:
вот как это скомпилено у меня на рабочей телеге:

# eix net-fs/samba

     Available versions:  3.0.37 ~3.2.15 ~3.3.10 ~3.4.5 [M]~3.4.6 [M]~3.5.0 [M]~4.0.0_alpha11!m {acl addns ads aio async automount avahi caps cifsupcall client cluster cups debug doc dso examples fam gnutls ipv6 kernel_linux ldap ldb netapi oav pam python quota quotas readline selinux server smbclient smbsharemodes sqlite swat syslog threads tools winbind}
     Installed versions:  3.0.34(08:50:40 13.05.2009)(acl ads ipv6 kernel_linux ldap pam python readline winbind -async -automount -caps -cups -debug -doc -examples -fam -oav -quotas -selinux -swat -syslog)
     Homepage:            http://www.samba.org/
     Description:         Samba Server component


Если вам не нужно можете убрать всяческие тяжести типа CUPS, Kerberos. Вносим изменения либо в /etc/make.conf либо в /etc/portage/package.use в разделе net-fs/samba.

еще раз проверяем:

gate ~ #emerge -pv net-fs/samba

Всё устраивает?
gate ~ #emerge net-fs/samba

Всё ставим на gentoo, с помощью emerge
#emerge -s net-fs/samba


После того как выучили весь лог сборки можно продолжить... ;-)

Настроим Самбу?...:

Я сделал это так:
# cat /etc/samba/smb.conf | grep --invert-match ^# | grep --invert-match ^';'

[global]
   workgroup = ZAVOD  # Netbios имя группы если полное имя zavod.local
   netbios name = router 
   server string = Super Puper Gentoo Linux Server %v
   log file = /var/log/samba/log.%m
   max log size = 50
   log level = 3
   hosts allow = 10.0.0.0/8 127.0.0.1
   map to guest = bad user
   realm = oaodmz.local
   nt acl support = yes
   nt status support = yes

security = ads
   password server = 10.0.0.3 10.0.0.5
   encrypt passwords = yes
   winbind separator = +
   winbind uid = 10000-20000
   winbind gid = 10000-20000
   winbind enum groups = yes
   winbind enum users = yes
   template homedir = /home/%D/%U
   template shell = /bin/bash
   socket options = TCP_NODELAY SO_RCVBUF=16384 SO_SNDBUF=16384
   interfaces = 10.0.0.1/24
   local master = no
   os level = 0
   domain master = no
   preferred master = no
   domain logons = no
   name resolve order = host lmhosts bcast
   dns proxy = no
[public]
   comment = Public Stuff
   path = /home/public
   public = yes
   writable = yes
   browserable  = yes
   inherit acls = yes
   inherit permissions = yes
   create mask = 600
   directory mask = 600


Далее вносим изменения /etc/conf.d/samba

# nano /etc/conf.d/samba

daemon_list="smbd nmbd winbind"

#---------------------

# Daemons calls: _#---------------------
my_service_name="samba"
my_service_PRE="unset TMP TMPDIR"
my_service_POST=""

#---------------------

# Daemons calls: _#---------------------
smbd_start_options="-D"
smbd_start="start-stop-daemon --start --quiet --exec /usr/sbin/smbd -- ${smbd_start_options}"
smbd_stop="start-stop-daemon --stop --quiet --pidfile /var/run/samba/smbd.pid"
smbd_reload="killall -HUP smbd"

nmbd_start_options="-D"
nmbd_start="start-stop-daemon --start --quiet --exec /usr/sbin/nmbd -- ${nmbd_start_options}"
nmbd_stop="start-stop-daemon --stop --quiet --pidfile /var/run/samba/nmbd.pid"
nmbd_reload="killall -HUP nmbd"

winbind_start_options="-D"
winbind_start="start-stop-daemon --start --quiet --exec /usr/sbin/winbindd -- ${winbind_start_options}"
winbind_stop="start-stop-daemon --stop --quiet --oknodo --exec /usr/sbin/winbindd"
winbind_reload="killall -HUP winbindd"


Все? Пускаем самбу...

# /etc/init.d/samba start


Стартанула без проблем? Добавим в автозапуск...

# rc-update add samba default


Так как я выбрал способ авторизации самбы в домене ADS(можно было Domain, но что-то не срослось) нам предстоит настроить керберос

Настройка Kerberos:

# nano /etc/krb5.conf
[logging]
 default = FILE:/var/log/krb5libs.log
 kdc = FILE:/var/log/krb5kdc.log
 admin_server = FILE:/var/log/kadmind.log

[libdefaults]
 default_realm = ZAVOD.LOCAL
 dns_lookup_realm = false
 dns_lookup_kdc = false

[realms]
 ZAVOD.LOCAL = {
   kdc = pdc.ZAVOD.local
   admin_server = pdc.ZAVOD.local
   default_domain = zavod.local
 }

[domain_realm]
 .zavod.local = ZAVOD.LOCAL
 zavod.local = ZAVOD.LOCAL

[kdc]
 profile = /var/kerberos/krb5kdc/kdc.conf

[appdefaults]
 pam = {
   debug = false
   ticket_lifetime = 36000
   renew_lifetime = 36000
   forwardable = true
   krb4_convert = false
}


Внимание!!! Размер имеет значение!!! (Букофф)
Проверьте правельную выдачу FQDN имени вводимой телеги:
# hostname -f
router.zavod.local

Телега обязательно должна иметь принадлежность к локальному домену и нормально пинговать контроллеры домена по нетбиос имени:

Просто добавьте их в /etc/samba/lmhosts

# nano /etc/samba/lmhosts
127.0.0.1    localhost
10.0.0.1      router
10.0.0.3      pdc
10.0.0.5      bdc


Проверяем:

# ping pdc
PING pdc.zavod.local (10.0.0.3) 56(84) bytes of data.
64 bytes from pdc.zavod.local (10.0.0.3): icmp_seq=1 ttl=128 time=0.228 ms
64 bytes from pdc.zavod.local (10.0.0.3): icmp_seq=2 ttl=128 time=0.271 ms
64 bytes from pdc.zavod.local (10.0.0.3): icmp_seq=3 ttl=128 time=0.296 ms
64 bytes from pdc.zavod.local (10.0.0.3): icmp_seq=4 ttl=128 time=0.255 ms
^C
--- pdc.zavod.local ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2997ms
rtt min/avg/max/mdev = 0.228/0.262/0.296/0.029 ms


Yeah baby... yeah...
Двигаемся дальше...

Теперь самое время вогнать нашу тележку в домен...

# net join -U adminko
adminko's password:
Using short domain name -- ZAVOD
Joined 'ROUTER' to realm 'ZAVOD.LOCAL'


Можно проверить выдачу групп и пользователей:
# wbinfo -p
Ping to winbindd succeeded on fd 4
#  wbinfo -g
BUILTIN+administrators
BUILTIN+users
ZAVOD+владельцы-создатели групповой политики
ZAVOD+гости домена
ZAVOD+компьютеры домена
ZAVOD+администраторы домена
[...]
# wbinfo -t
checking the trust secret via RPC calls succeeded

Значит доверительные отношения нашего виндузятного домена и линуксовой телеги установлены.
Понравилось? А вообще у wbinfo куча опций проверить вот так:
# wbinfo --help



Если сервак не увидел контроллера домена можно добавить ключик -S <имя сервера> или -I
# net join -U adminko -S pdc.zavod.local

Халасо... Читаем логи самбы...
# tail -f /var/log/samba/*

И там все хорошо? Или просто непонятно? - ну да ладно потом разберетесь, а я продолжу...

Поставим и настроим Squid:
# eix squid

 [U] net-proxy/squid
     Available versions:  2.7.6-r2 2.7.7 3.0.18-r1 3.0.19 ~3.0.20-r1 [M]~3.1.0.14_beta [M]~3.1.0.15_beta-r1 {caps ecap elibc_uclibc epoll icap-client ipf-transparent ipv6 kerberos kernel_linux kqueue ldap logrotate mysql nis pam pf-transparent postgres radius samba sasl selinux snmp sqlite ssl test zero-penalty-hit}
     Installed versions:  2.6.20-r1(10:55:33 28.07.2008)(kernel_linux ldap logrotate pam qos samba snmp ssl -elibc_uclibc -ipf-transparent -nis -pf-transparent -sasl -selinux -zero-penalty-hit)
     Homepage:            http://www.squid-cache.org/
     Description:         A full-featured web proxy cache

Правим USE-флаги, инсталлируем
emerge -pv squid

Проверка номер 2..
emerge squid


Мой конфиг сквида:
ВНИМАНИЕ!!! Ни в коем слечае не удалять комментарии в конфиге сквида, не изменять порядок написания параметров, не стирать теги #TAG!!! Эти данный нужны для SAMS!!!
Оставлю только то, что нужно вам, для установки самсы, поскольку настройка сквид - отдельная огромная тема!

redirect_program /usr/local/bin/samsredir
redirect_children 5

auth_param ntlm program  /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp #NTLM аутентификатор
auth_param ntlm children 150 #Количество одновременно сидящих в инете Юзверей!
auth_param ntlm keep_alive on
auth_param basic program  /usr/bin/ntlm_auth --helper-protocol=squid-2.5-basic
auth_param basic children 20
auth_param basic realm Squid proxy-caching web server
auth_param basic credentialsttl 2 hours

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 to_localhost dst 127.0.0.0/8
acl SSL_ports port 443
acl Safe_ports port 80		# http
acl Safe_ports port 21		# ftp
acl Safe_ports port 443		# https
acl Safe_ports port 70		# gopher
acl Safe_ports port 210		# wais
acl Safe_ports port 1025-65535	# unregistered ports
acl Safe_ports port 280		# http-mgmt
acl Safe_ports port 488		# gss-http
acl Safe_ports port 591		# filemaker
acl Safe_ports port 777		# multiling http
acl Safe_ports port 901		# SWAT
acl purge method PURGE
acl CONNECT method CONNECT

http_access allow manager localhost
http_access deny manager
http_access allow purge localhost
http_access deny purge
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports

http_access allow localhost

http_access deny all

icp_access allow all

http_port 3128

hierarchy_stoplist cgi-bin ?

cache_mem 128 MB

maximum_object_size_in_memory 512 KB

cache_dir ufs /var/cache/squid 16384 16 256

maximum_object_size 8092 KB

access_log /var/log/squid/access.log squid

cache_log /var/log/squid/cache.log

cache_store_log /var/log/squid/store.log

mime_table /etc/squid/mime.conf

ftp_user anonymous@qwerty

acl QUERY urlpath_regex cgi-bin \?
cache deny QUERY

refresh_pattern ^ftp:		1440	20%	10080
refresh_pattern ^gopher:	1440	0%	1440
refresh_pattern .		0	20%	4320

acl apache rep_header Server ^Apache
broken_vary_encoding allow apache

dns_nameservers 10.0.0.3 10.0.0.5

forwarded_for off

coredump_dir /var/cache/squid


Установка mySQL (Мускуль):
# eix dev-db/mysql
[U] dev-db/mysql
     Available versions:  [M]3.23.58-r1 [M]4.0.27-r1 [M]4.1.22-r1 [M]5.0.54 5.0.70-r1 ~5.0.72 ~5.0.72-r1 ~5.0.76 ~5.0.76-r1 ~5.0.83 ~5.0.84 5.0.84-r1 ~5.0.87 ~5.0.88 ~5.0.90 ~5.0.90-r1 5.0.90-r2 ~5.1.39-r1 ~5.1.44 ~5.1.44-r1 [M]~5.4.3_beta [M]~5.5.1_alpha_pre2 {berkdb big-tables cluster community debug embedded extraengine innodb latin1 max-idx-128 minimal pbxt perl profiling raid readline selinux ssl static tcpd test xtradb}
     Installed versions:  5.0.60-r1(11:11:43 14.07.2008)(berkdb perl ssl -big-tables -cluster -debug -embedded -extraengine -latin1 -max-idx-128 -minimal -selinux -static)
     Homepage:            http://www.mysql.com/
     Description:         A fast, multi-threaded, multi-user SQL database server.

# emerge -pv mysql ;Ключ -pv служит для проверки зависимостей, USE-флагов и всего прочего, не стыдитесь, даже  если вы наизузть знаете какие пакеты кто за собой потянет, проверить знания еще раз. Ведь не зря говорил дядюшка Ленин... ;-)

# emerge mysql 


Итак, осталось поставить SAMS, посмотрим на то, что уже имеем...

Запустим Squid, добавим его в автозагрузку

# /etc/init.d/sqyud start
# rc-update add squid default


Посмотрим, что творится в логах, при попытке зайти на одну из страничек из под доменного пользователя (Само собой необходимо правильно настроить браузер 10.0.0.1:3128):

# tail -f /var/log/squid/access.log | grep adminko

1274955911.514    210 10.0.2.100 TCP_IMS_HIT/304 365 GET http://gnu.su/images/newspost_images/g.gif ZAVOD+adminko NONE/- image/gif


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

Установка SAMS:

На данный мемент sams-1.0.5 тогда ставил sams1.0.4 - стабильная...
Качаем в папочку /usr/portage/distfiles/...
Скачиваем ebuild отсюда: SAMS ebuild(Portage)
Распаковываем ebuild в папочку /usr/local/portage (Смотрим ссылку в make.conf GENTOO_OVERLAY="/usr/local/portage")
Далее как обычно:
# emerge -pv sams
# emerge sams

Смотрим настройки SAMS
# cat /etc/sams.conf
[client]
SQUID_DB=squidlog
SAMS_DB=squidctrl
MYSQLHOSTNAME=127.0.0.1
MYSQLUSER=sams
MYSQLPASSWORD=samspassword
MYSQLVERSION=5.0
SQUIDCACHEFILE=access.log
SQUIDROOTDIR=/etc/squid
SQUIDLOGDIR=/var/log/squid
SQUIDCACHEDIR=/var/cache/squid
SAMSPATH=/usr/
SQUIDPATH=/usr/sbin
SQUIDGUARDLOGPATH=/var/log
#SQUIDGUARDDBPATH=/var/db/squidguard
RECODECOMMAND=iconv -f UTF-8 -t 866 %finp > %fout #Указываем вместо UTF-8 свою кодировку...
#LDAPSERVER=stream
#LDAPBASEDN=ZAVOD.local
#LDAPUSER=Администратор
#LDAPUSERPASSWD=holykirka
#LDAPUSERSGROUP=Users
#REJIKPATH=/usr/local/rejik
SHUTDOWNCOMMAND=shutdown -h now
CACHENUM=0


То, что у вас должен стоять апач - это мы упускаем, т.к. отображать веб-морду чем-то надо... А настройка апача - тема отдельной статьи, кстати для sams подойдет апач из коробки...
# emerge -pv apache php
# emerge apache php

Далее делаем симлинк:
# ln -s /usr/local/share/sams/ /var/www/localhost/htdocs/sams


И делаем необходимые настройки в интерфейсе SAMS.
Вводим настройки AD, импортируем юзеров, делаем для них группы с шаблонами...
Тут подробно с картинками: http://sams.nixdev.net/wiki/ASPLinux

Чуть не зыбал самое главное: Список блокированных урл для Squid

От установки проксёвых антивирусов я отказался, ибо неблагодарное и глючное это дело.




Вас также может заинтересовать:

22.05.2010 Использование PackageSet в Gentoo (Или жизнь после установки Gentoo-Way)
Настройка РРТР в GENTOO консольный вариант (PPTP Gentoo-way)
01.05.2010 Установка Gentoo (x86 UTF-8 RUS)
12.06.2010 IPTables Gentoo
25.04.2010 Философия Gentoo
Представлен Gentoo LiveDVD 11.0