Linux Slackware Энциклопедия от А до Я
Сайт посвящен свободно распространяемому ПО и Linux Slackware в частности.
Разделы:
Раздел/Тема
Главная -> Программы -> SAMS
Перед администратором средней компании всегда стоит проблема организации доступа сотрудников в интернет, а так-же подсчет, управление и ограничение их трафика. Решений тому масса, какие-то из них лучше какие-то хуже... В целом проблема разбивается на две составляющих:
  • Собственно подсчет трафика
  • Ограничение и управление трафиком
Ограничивать трафик достаточно просто, для этого вполне подойдут решения на базе iptables + mysql, но тут есть один недостаток, нет контроля над трафиком. Вышеуказанное решение (iptables + mysql) даст вам набор ip адресов с которых обращались из вашей локальной сети и куда обращались в интернет. Учитывая то, что часто в локалке применяется DHCP, разбор такого лога дело совершенно не реальное. Хорошим решением в таком случае станет прокси сервер с авторизацией. Он умеет вести лог посещений сайтов в виде URL + имя авторизовавшегося пользователя. Остается прикрутить все это дело к mysql, а управлять всем этим хозяйством через вэб интерфейс. В принципе mysql как база данных вовсе не обязательна, просто ее очень любят PHP-кодеры Итак решение такого рода уже есть!!! Называется оно SAMS. Домашняя страница проекта: http://sams.perm.ru Что умеет SAMS:
  1. Администрирование системы через web интерфейс
  2. Ограничение объема трафика пользователей на определенный период
  3. Автоматическое отключение пользователей, превысивших лимит.
  4. Ведение списков запрещенных для доступа пользователей ресурсов интернет.
  5. Настройка доступа пользователей через механизм шаблонов.
  6. Разбиение пользователей на группы для удобства администрирования системы
  7. Формирование отчетов по трафику пользователей за любой отрезок времени
  8. Поддержка видов авторизации SQUID: -NTLM авторизация в домене Windows -NCSA авторизация - доступ по ip адресу
  9. Поддержка использования редиректоров
  10. И много другое...
Пользуясь случаем, хочу выразить свою признательность автору SAMS. Некоторые оговорки: Эта статья написана с целью показать как устанавливать SAMS именно на Slackware. Мною предполагается, что SAMS устанавливается на только, что установленную Слаку и никакие конфигурационные файлы серверов используемых SAMS еще не были изменены. Также мной предполагается, что Windows домен работает в смешанном режиме. Итак начнем! Для работы SAMS требуются пакеты:
  • squid
  • mysql
  • apache
  • samba (можно и без нее)
  • mod_php (модуль к apache)
  • php
  • php-mysql
  • ibgd
  • php-gd
  • libpcre
Я вас поздравляю!!! В Slackware все это кроме самого squid есть!!!! Дело за малым, установить squid и заставить все это работать.

Apache.

Для начала научим apache работать с php, это совсем не сложно.
  • Открываем конфиг апача: sudo vi /etc/apache/httpd.conf Добавляем
    DirectoryIndex index.html index.php
    Раскомментируем строчку
    Include /etc/apache/mod_php.conf
  • Делаем стартовый скрипт апача запускаемым (если это не было сделано при установке) sudo chmod 744 /etc/rc.d/rc.httpd
  • Запускаем апач: sudo /etc/rc.d/rc.httpd start
  • Готово!

MySQL

Принимаемся за mysql В /etc лежат четыре файла:
  • my-huge.cnf
  • my-large.cnf
  • my-medium.cnf
  • my-small.cnf
Смысл понятен? Выбираем my-medium.cnf, переименовываем его в my.cnf. Теперь делаем стартовый скрипт mysql запукаемым: sudo chmod 744 /etc/rc.d/rc.mysqld Если к базе планируется подключаться из сети в стартовом скрипте надо разремарить SKIP="--skip-networking" Дальше создаем системные таблицы mysql: su mysql mysql_install_db Теперь необходимо запустить базу и поменять пароль пользователя root. При создании системых таблиц, этот пользователь создается с пустым паролем, что не есть гуд! sudo /etc/rc.d/rc.mysqld start Меняем пароль рута: sudo mysqladmin -u root password 'new-password' Потом можно будет поставить PhpMyAdmin, или любой другой фронтэнд к mysql, но настоящие джедаи пользуются консолью, а попутно учат синтаксис языка sql Ну чтож теперь мы встали у развилки дорог... Нам надо принять стратегическое решение какой тип авторизации мы будем использовать. Собственно прокси сервер squid умеет авторизовать пользователей по самым разнообразным схемам. Мне представляется самым логичным использовать авторизацию NTLM с использованием хелпера из самбы. Для этого нам предстоит поднять самбу и ввести нашу Линукс машину в Win домен. Что ж начнем это увлекательное занятие...

Samba.

Samba в Slackware 11.0 собрана с поддержкой winbind и LDAP, но стартовый скрипт написан так, чтоб winbindd не запускался. Исправим это. Открываем скрипт и приводим его к такому виду: sudo vi /etc/rc.d/rc.samba #!/bin/sh # # /etc/rc.d/rc.samba # # Start/stop/restart the Samba SMB file/print server. # # To make Samba start automatically at boot, make this # file executable: chmod 755 /etc/rc.d/rc.samba # samba_start() { if [ -x /usr/sbin/smbd -a -x /usr/sbin/nmbd -a -r /etc/samba/smb.conf ]; then echo "Starting Samba: /usr/sbin/smbd -D" /usr/sbin/smbd -D echo " /usr/sbin/nmbd -D" /usr/sbin/nmbd -D echo " /usr/sbin/winbindd" /usr/sbin/winbindd fi } samba_stop() { killall smbd nmbd winbindd } samba_restart() { samba_stop sleep 2 samba_start } case "$1" in 'start') samba_start ;; 'stop') samba_stop ;; 'restart') samba_restart ;; *) # Default is "start", for backwards compatibility with previous # Slackware versions. This may change to a 'usage' error someday. samba_start esac Переименовываем файл /etc/samba/smb.conf.sample в /etc/samba/smb.conf: cp /etc/samba/smb.conf.sample /etc/samba/smb.conf Открываем и правим: sudo vi /etc/samba/smb.conf [global] workgroup = _ИМЯ_ВАШЕГО_ДОМЕНА server string = Samba Server security = DOMAIN auth methods = winbind password server = IP_ВАШЕГО_КОНТРОЛЛЕРА_ДОМЕНА enable privileges = Yes client NTLMv2 auth = Yes client lanman auth = No client plaintext auth = No log file = /var/log/samba.%m max log size = 50 server signing = auto dns proxy = No idmap uid = 10000-20000 idmap gid = 10000-20000 winbind use default domain = Yes Вот конфиг моей самбы. Вполне рабочий, больше года работы и ни одного глюка. Мною предполагается что домен работает в смешанном режиме. Если это не так, то танцы с бубном вокруг самбы вам обеспечены, и я тут уж ничего не могу вам посоветовать лучшего, чем чтение манов ибо они рулеззз. У меня же в сети работают разные операционки, соответственно домен работает в смешанном режиме. И в силу того, что я не конфигурировал самбу для работы с нативным режимом домена, я не буду описывать как это сделать. Боюсь быть не точным и ввести вас в заблуждение. Далее правим файл /etc/nsswitch.conf. Для тех кто не в курсе, этот файл позволяет для каждого типа административной информации указывать явный путь поиска. sudo vi /etc/nsswitch.conf Приводим его к такому виду: passwd: files winbind shadow: files winbind group: files winbind hosts: files dns networks: files services: files protocols: files rpc: files ethers: files netmasks: files netgroup: files bootparams: files automount: files aliases: files Каждая строка соответствует отдельному типу информации, источники просматриваются слева направо. Заводим самбу в домен: sudo net join -W _ВАШ_ДОМЕН -U _логин_пользователя_с_правами_администратора_домена Вводим пароль Если получилось можно радоваться, если нет, читаем логи ибо там все написано. Проверяем как работает winbindd: sudo wbinfo -u #Выдаст список пользователей домена sudo wbinfo -g #Выдаст список групп домена

Squid.

Пришла очередь squid.
  • Для начала скачаем squid и установим. Качаем: wget http://www.squid-cache.org/Versions/v2/2.6/squid-2.6.STABLE9.tar.bz2 Распаковываем: tar xjvf squid-2.6.STABLE9.tar.bz2 Переходим в распакованый каталог: cd ./squid-2.6.STABLE9 Конфигурируем ./configure \ --enable-storeio="ufs,aufs,diskd" \ --enable-removal-policies="lru,heap" \ --enable-heap-replacement \ --enable-delay-pools \ --disable-wccp \ --disable-wccpv2 \ --enable-arp-acl \ --enable-large-cache-files \ --disable-ident-lookups \ --enable-auth="basic,digest,ntlm,negotiate" За подробным описанием опций конфигурации советую сходить по этой ссылке: http://bog.pp.ru/work/squid.html Собираем: sudo make Теперь делаем финт ушами. Мы ведь не станем засорять систему установленными в ручную программами. Мы сделаем пакет, для того, чтобы если будет необходимость мы смогли его снести средствами пакетного менеджера. Установим squid временно в /tmp. sudo make install DESTDIR=/tmp/squid-2.6.STABLE9 Переходим туда: cd /tmp/squid-2.6.STABLE9 Собираем .tgz пакет: sudo makepkg squid-2.6.STABLE9-486-1my.tgz Собрали, теперь установим: sudo installpkg squid-2.6.STABLE9-486-1my.tgz Готово! Для более продвинутых можно написать SlackBuilb скрипт, но это не в моде. Теперь все хотят только мышкой кликать, и чтоб само все устанавливалось, сносилось и обновлялось... Все-же я рекомендую почитать вот эту статью: "Создание слакбилд скрипта" Отдельное спасибо Danhuu за перевод.
  • Итак мы установили squid в /usr/local/squid. Теперь нам необходимо завести в системе бесправного пользователя с правами которого будет работать прокси сервер. По умолчанию squid работает от пользователя nobody, но я предпочитаю завести для него отдельного пользователя squid.file: Делаем это руками: sudo vi /etc/passwd Добавляем туда строчку:
    squid:x:1003:2::/bin/else
    1003 это id, он может быть любым лишь бы был уникальным. /bin/else указывает на то что у пользователя нет шелла. Дальше sudo vi /etc/group Tуда добавляем
    squid:x:1012:squid
    Т.е. группа squid у которой id 1012 и один член squid. Этого вполне хватит.
  • Открывем конфиг сквида: vi /usr/local/squid/etc/squid.conf Ищем там строки:
    cache_effective_user
    cache_effective_group
    Соответственно должно быть:
    cache_effective_user squid
    cache_effective_group squid
    Включаем использование редиректора SAMS.
    url_rewrite_program /usr/local/bin/samsredir
    url_rewrite_children 5
    (количество запускаемых процессов samsredir)
    Включаем авторизацию NTLM
    auth_param ntlm program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp
    auth_param ntlm children 5
    auth_param ntlm keep_alive on
    Не все браузеры умеют авторизоваться по NTLM, даем возможность вводить пароль вручную, эти строчки должны обязательно быть после верхних.
    auth_param basic program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-basic
    auth_param basic children 5
    auth_param basic realm Squid proxy-caching web server
    auth_param basic credentialsttl 2 hours
  • Теперь один маленький штрих. Для того чтоб заработала NTLM авторизация squid должен иметь доступ к файлу /var/cache/samba/winbindd_privileged/pipe. Сам файл имеет права доступа: srwxrwxrwx 1 root root 0 2007-02-07 23:14 pipe А каталог в котором он находится: drwxr-x--- 2 root root 72 2007-02-07 23:14 winbindd_privileged Так что squid не сможет получить доступ к этому файлу... Если сменить права на 775, то самба упадет при старте. Решается эта проблема просто, меняем владельца каталога на пользователь root группа squid
    chown root:squid /var/cache/samba/winbindd_privileged
  • Теперь надо написать стартовый скрипт и добавить его в /etc/rc.d/rc.inet2
    Это я оставлю вам на домашнее задание...
Можно использовать в качестве примера приведенный выше стартовый скрипт самбы. Но запускать squid пока рано, он не запустится, у нас ведь нет редиректора samsredir. Это минимум. Для более тонкой настройки squid идем на www.squid-cache.org и читаем документацию. На русском отличное описание параметров конфига squid есть на сайте Богомолова: www.bog.pp.ru. Советую туда зайти и все внимательно почитать. Теперь осталость создать кэш. Squid держит кэш в каталоге /usr/local/squid/var/cache и логи в каталоге /usr/local/squid/var/logs, хозяином кэша и логов должен быть пользователь от которого работает squid, поэтому меняем владельца этих каталогов: sudo chmod squid:squid /usr/local/squid/var/cache
sudo chmod squid:squid /usr/local/squid/var/logs
Создаем кэш /usr/local/squid/sbin/squid -z Запускаем squid /usr/local/squid/sbin/squid Если демон не может запуститься по каким либо причинам, он выводит сообщения об ошибках прямо на консоль. Детальный лог будет лежать в /usr/local/squid/var/logs/cache.log. Если не запустилось смотрим туда внимательно и разбираемся.

SAMS

Настала очередь собственно SAMS.
  • Качаем: wget http://sams.perm.ru/downloads/sams-20070129.tar.gz Распаковываем: tar xzvf sams-20070129.tar.gz Переходим в распакованый каталог: cd ./sams-20070129 Дальше: ./configure sudo make sudo make install DESTDIR тут не прокатит поэтому ставим SAMS в /usr/local, в Слаке эти каталоги пустые, так что проблем с удалением не будет.
  • Создаем пользователя MySQL на будущие базы SAMS: mysql -u root -p Пишем пароль Далее в консоли MySQL выполняем: GRANT ALL ON squidctrl.* TO sams@localhost IDENTIFIED BY "yourpassword"; GRANT ALL ON squidlog.* TO sams@localhost IDENTIFIED BY "yourpassword"; Теперь необходимо создать базы SAMS. Для этого предназначены скрипты create_sams_db и create_squid_db. Они находятся в каталоге /sams-20070129/mysql их надо выполнить и при запросе ввести пароль только что созданного нами пользователя MySQL sams.
  • Правим конфиг sams. sudo vi /etc/sams.conf SQUID_DB=squidlog SAMS_DB=squidctrl MYSQLHOSTNAME=localhost #ip иди имя машины где лежит база MYSQLUSER=sams #пользователь базы MYSQLPASSWORD=pass #пароль к базе SQUIDCACHEFILE=access.log #имя файла логов squid SQUIDROOTDIR=/usr/local/squid/etc #путь к конфигу squid SQUIDLOGDIR=/usr/local/squid/var/logs #путь к логам squid SAMSPATH=/usr/local #путь к бинарникам sams SQUIDPATH=/usr/local/squid/sbin #путь к файлу демона squid RECODECOMMAND=iconv -f KOI8-R -t 866 %finp > %fout При установке sams должен создать симлинк из root каталога http сервера на каталог web-интерфейса sams. Если этого не произошло исправляем это безобразие: sudo n -s /usr/local/share/sams /our/path/www/htdocd/sams
  • Настраиваем периодические процессы Логи будут обрабатываться каждую минуту. В принципе sams это и сам делать умеет, но по крону все-же надежнее будет. Добавляем в /var/spool/cron/crontabs/root
    */1 * * * * /usr/local/bin/sams
    Каждый месяц трафик пользователей должен обнуляться. Добавим для этого еще одно задание:
    0 0 1 * * /usr/local/sams/bin/sams -c
  • Запускаем демон sams: /usr/local/bin/samsdaemon Для того чтоб запускать демон при загрузке добавим эту команду в /etc/rc.d/rc.local
samsdaemon к сожалению не умеет вести логов, но его можно запустить в режиме дебага, с ключом -d, так что если не запустилось пользуемся этой возможностью и разбираемся в чем дело. Ну вот собственно и все. Теперь в своем любимом браузере набираем http://ip_сервера/sams/, в системе по умолчанию зарегестрирован пользователь Admin с паролем Admin. SAMS установлен.
Basmach 03.09.2007