Прокси сервер Squid3 + SAMS 1.0.5 + авторизация через AD (Kerberos) на Ubuntu Server

Автор статьи: Виталий (obsession)

Первоисточник статьи: http://tranz-it.net

Перепечатка и размещение данных материалов на других ресурсах только с указанием ссылки на первоисточник.

Видимо есть еще админы, которым необходима все же мощный клубок сервисов в виде прокси сервера SQUID + веб морды SAMS + авторизация через Active Directory. Если честно признаться никакого желания нет писать статьи, только с расчетом, в случае чего самому обратиться можно к этим запискам и вспомнить что делал. А так писать на всеобщее обозрение, которые потом копипастят статьи, но обидно не за это, а за то что они выдают их за свои, и почитав на форумах, всех их возносят до небес, говоря какие они суперские сисадмины. Мне не нужно жертвоприношений и признания, но если по совести признаться, очень приятно читать позитивные отзывы людей которым данные статьи очень помогли в реальной жизни. Поэтому по просьбе трудящихся, напишу еще одну статью про прокси сервер SQUID 3, SAMS 1.0.5 с авторизацией через Active Directory. В одной компании уже давно, месяцев 5 уже стоит такая система, и работает хорошо. Буду писать по памяти, с выборкой из истории моих команд с сервера. Так что сильно не пинайте.

 

Что самое главное из всей статьи, это правильно настроить Kerberos, службу которая умеет понимать Active Directory и получать тикеты от нее. Соответственно, пну вас в сторону хорошей статьи от моего друга mr.bublik - Хочу самбу под АД

Так же опишу ее здесь, в читабельном виде, если mr.bublik не возражает.

ШАГ 1. Установка операционной системы

Думаю все справятся этим, и установят себе Ubuntu Server 12.10. Я описываю именно ту систему на которой я все и делал.

Установка была произведена стандартным способом.

Начальные данные:

IP адрес: 192.168.0.8

Маска подсети: 255.255.255.0

Сеть: 192.168.0.0

Широковещательный адрес: 192.168.0.255

Шлюз: 192.168.0.1

DNS сервер: 192.168.0.1

Пользователь в БД MySQL: dude

Пароль для пользователя БД MySQL: dudeproxy

 

Редактируем файл/etc/network/interfaces и вписываем следующие строчки

auto lo

iface lo inet loopback

auto eth0

iface eth0 inet static

address 192.168.0.8

netmask 255.255.255.0

network 192.168.0.0

gateway 192.168.0.1

dns-nameserver 192.168.0.1 192.168.0.10

dns-domain example.local

 

Редактируем файл/etc/resolv.conf удаляем все и прописываем

search example.local

nameserver 192.168.0.1

nameserver 192.169.0.10

Проверяем имя хоста в/ets/hostname ->>proxy
Проверяем записи в/etc/hosts

127.0.0.1 localhost proxy
192.168.0.8 proxy proxy.example.local

Записи, относящиеся к ipv6 можно удалить …

Проверяем установки времени командой:

# date

Если нужно изменить, курим маны командой# man date

А лучше всего установить NTP клиент, и настроить получение даты и времени с контроллера домена.

Теперь пришло время обновить систему.

Даем команды в консоли:

# sudo aptitude update

#sudo aptitude upgrade

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

Перезагрузимся, что бы наверняка. :)

# sudo reboot

Как видите я взял основные настройки из своей старой статьи, зачем перепечатывать если есть то же самое, но обязательно все что написано нужно почитать, так как для AD есть изменения.

ШАГ 2. Установка и настройка служб для авторизации в Active Directory

Ну что начнем вкусно готовить Kerberos для авторизации в Active Directory, конечно по статье дорогого mr.bublika

# apt-get install samba krb5-user winbind

# nano /etc/krb5.conf

И приводим файл в соответствии нижеизложенному.
[logging]
default = FILE:/var/log/krb5.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmin.log

[libdefaults]
default_realm = EXAMPLE.LOCAL
dns_lookup_realm = false
dns_lookup_kdc = true
ticket_lifetime = 24000

[realms]
EXAMPLE.LOCAL = {
kdc = yourdomaincontroller.example.local
admin_server = yourdomaincontroller.example.local
default_domain = EXAMPLE.LOCAL
}

[domain_realm]
.example.local = EXAMPLE.LOCAL
example.local = EXAMPLE.LOCAL
[kdc]
profile = /var/kerberos/krb5kdc/kdc.conf

[appdefaults]
pam = {
debug = true
ticket_lifetime = 36000
renew_lifetime = 36000
forwardable = false
krb4_convert = false
}
Теперь правим конфиг /etc/samba/smb.conf
 
[global]
workgroup = EXAMPLE
realm = EXAMPLE.LOCAL
security = ADS
encrypt passwords = true
dns proxy = no
socket options = TCP_NODELAY IPTOS_LOWDELAY SO_RCVBUF=8192 SO_SNDBUF=8192
domain master = no
local master = no
preferred master = no
os level = 0
domain logons = no
load printers = no
show add printer wizard = no
printcap name = /dev/null
disable spoolss = yes
idmap uid = 10000 - 40000
idmap gid = 10000 - 40000
winbind enum groups = yes
winbind enum users = yes
winbind use default domain = yes
template shell = /bin/bash

# /etc/init.d/winbind stop
# /etc/init.d/samba restart #(может быть smbd)
# /etc/init.d/winbind start

 

Проверяем:

# kinit Administrator@EXAMPLE.LOCAL ##типа дай билетик,если пароль спросила и не ругалась, значит дала.

Cмотрим командой klist , выдать должно что-то вроде
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: Administrator@EXAMPLE.LOCAL
Valid starting Expires Service principal
08/06/09 12:09:34 08/06/09 22:09:39 krbtgt/ EXAMPLE.LOCAL@EXAMPLE.LOCAL
renew until 08/07/09 12:09:34
Kerberos 4 ticket cache: /tmp/tkt0
klist: You have no tickets cached
 
 
Теперь самое интересное, вводим в домен:
# net ads join -U Administrator# имя домена не нужно оно по умолчанию стоит @EXAMPLE.LOCAL
если ругнуласьDNS update failed! - Парадокс, но вы в домене.
Ручками впишите машину в виндовый ДНС, что бы логинились виндопользователи
# nano /etc/nsswitch.conf
passwd: compat winbind
group: compat winbind
shadow: compat winbind

hosts: files dns wins
networks: files dns

protocols: db files
services: db files
ethers: db files
rpc: db files

netgroup: nis

Проверяем:
# wbinfo -u # список пользователей
# wbinfo -g # список групп
# net ads info # вообще о домене

дальше работаем и наслаждаемся.
 

ШАГ 3. Установка основных пакетов

 
# sudo su
# aptitude install mc htop openssh-server make
# aptitude install apache2 apache2-doc apache2-utils ssl-cert mysql-server \
libmysqlclient15-dev libapache2-mod-php5 php5 php5-common php5-dev \
php5-mcrypt php5-imagick php5-mysql php5-gd libpcre3 libpcre3-dev php5-ldap \
php-fpdf squid3 squidguard gcc make 
libgd2-xpm 
 
В течении скачивания и начала установки будет запрос на ввод пароля пользователя root для MySQL его обязательно вводим,
и обязательно запоминаем.
 

ШАГ 4. Установка SAMS

 

Скачиваем SAMS.

Переходим в папку /usr/src

# cd /usr/src/

# wget http://sams.perm.ru/download/sams-1.0.5.tar.bz2

Распаковываем его

# tar xvf sams-1.0.5.tar.bz2

Переходим в папку sams-1.0.5

# cd sams-1.0.5

И стандартно конфигурируем его и устанавливаем:

# ./configure

# make && make install

ВНИМАНИЕ!!! Если при конфигурировании выдает ошибки такого вида "checking for libmysqlclient in /usr/lib… configure: error: Cannot find MySQL’s libmysqlclient in /usr/lib" и

"checking for libpcre in /usr/lib… configure: error: Cannot find PCRE’s libpcre in /usr/lib" то команду на конфигурирование sams даем следующим образом:

# ./configure --with-mysql-libpath=/usr/lib/i386-linux-gnu/ –with-pcre-libpath=/usr/lib/i386-linux-gnu/

после чего собираем и устанавливаем обычно:

# make && make install

Далее делаем симлинк:

# ln -s /usr/local/share/sams /var/www/sams


С текущей версии SAMS научился работать с PHP в режиме safe_mode=On. Но это требует дополнительной настройки конфигурации.

Для этого редактируем файл конфигурации php /etc/php5/apache2/php.ini

Включаем режим safe mode. Для этого выставляем параметр safe_mode. Если такого параметра нет, то ничего не добавляем.

safe_mode = On

SAMS для некоторых функций WEB интерфейса использует системные команды, например wbinfo. В режиме safe_mode php блокирует доступ к системным командам.

Php позволяет выполнять системные команды, расположенные в каталоге, заданном параметром safe_mode_exec_dir. Изменяем этот параметр:

safe_mode_exec_dir = “/usr/local/share/sams/bin”

Далее разрешаем исполнение системных скриптов из кода php.

Ищем в файле конфигурации параметр и убираем из него запрет вызова функций phpinfo system shell_exec exec:

disable_functions = “chdir,dl,ini_get_all,popen,proc_open,passthru,pcntl_exec”

В /etc/sams.conf приводим примерно к следующему виду:

[client]
SQUID_DB=squidlog
SAMS_DB=squidctrl
MYSQLHOSTNAME=127.0.0.1
MYSQLUSER=dude<---Сюда прописываете своего пользователя
MYSQLPASSWORD=dudeproxy<---Сюда прописывате пароль пользователя dude
MYSQLVERSION=5.0
SQUIDCACHEFILE=access.log
SQUIDROOTDIR=/etc/squid3
SQUIDLOGDIR=/var/log/squid3
SQUIDCACHEDIR=/var/spool/squid3
SAMSPATH=/usr/local
SQUIDPATH=/usr/sbin
SQUIDGUARDLOGPATH=/var/log
SQUIDGUARDDBPATH=/var/db/squidguard
RECODECOMMAND=iconv -f KOI8-R -t 866 %finp > %fout
LDAPSERVER=192.168.0.10 <<--Сюда вписывается IP адрес контроллера домена
LDAPBASEDN=example.local
LDAPUSER=NameUserAdminPrivilegesINAD <<--Сюда вписываем имя пользователя с правами администратора AD, лучше создать отдельного с правами админа.
LDAPUSERPASSWD=PasswordUserAdmin <<--Сюда вписываем пароль от этого пользователя
LDAPUSERSGROUP=domain users
REJIKPATH=/usr/local/rejik
SHUTDOWNCOMMAND=shutdown -h now
CACHENUM=0

В файле /usr/src/sams-1.0.5/mysql/create_sams_user.sql прописываем вышеназначенного пользователя.

GRANT ALL ON squidctrl.* TO dude@localhost IDENTIFIED BY “dudeproxy”;

GRANT ALL ON squidlog.* TO dude@localhost IDENTIFIED BY “dudeproxy”;

Сохраняемся.

 

ШАГ 5. Создание базы данных и MySQL пользователя SAMSа

Переходим в каталог/usr/local/src/sams-1.0.5/mysql/
# cd /usr/local/src/sams-1.0.5/mysql/
Редактируем файл squid_db.sql и в конце каждой процедуры создания таблицы убираем TYPE=MyISAM,
таким образом в процедуре создания каждой таблицы не должно быть TYPE=MyISAM.
Пример, БЫЛО:
DROP TABLE IF EXISTS `cache`;
CREATE TABLE `cache` (
`date` date,
`time` time,
`user` char(25),
`domain` char(25),
`size` BIGINT UNSIGNED NULL,
`ipaddr` char(15) NOT NULL,
`period` BIGINT UNSIGNED NULL,
`url` char(100) NOT NULL,
`hit` BIGINT UNSIGNED NULL,
`method` char(15) NOT NULL
) TYPE=MyISAM;<<--Убираем то что выделено красным
 
СТАЛО:
 
DROP TABLE IF EXISTS `cache`;
CREATE TABLE `cache` (
`date` date,
`time` time,
`user` char(25),
`domain` char(25),
`size` BIGINT UNSIGNED NULL,
`ipaddr` char(15) NOT NULL,
`period` BIGINT UNSIGNED NULL,
`url` char(100) NOT NULL,
`hit` BIGINT UNSIGNED NULL,
`method` char(15) NOT NULL
);
 
И так убираем для всех таблиц в этом файле.
После сохранения импортируем файлы в MySQL

# mysql -u root -p < sams_db.sql

# mysql -u root -p < squid_db.sql

# mysql -u root -p < create_sams_user.sql

ШАГ 6. Конфигурирование SQUID

Настраиваем конфиг squid под свои нужды

# mcedit /etc/squid3/squid.conf

ВНИМАНИЕ!!! Ни в коем случае не менять структуру файла и не удалять коменты

Расскомментируем следующие строки и приведем в определенный вид, но не менять структуру.

[...]

auth_param basic casesensitive off

[...]

auth_param ntlm program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmmssp

auth_param ntlm children 100

auth_param ntlm keep_alive off

[...]

auth_param basic program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-basic

auth_param basic children 100

auth_param basic realm Squid proxy-caching web server

auth_param basic credentialsttl 2 hours

[...]

http_port 3128

[...]

сache_dir ufs /var/spool/squid 100 16 256

[...]

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

[...]

pid_filename /var/run/squid3.pid

[...]
 
После настройки конф файла сквида, нужно создать (SWAP) для прокси сервера
# squid -z
После чего даем команду:
#ps axw | grep squid
 
Должно быть примерно вот так:
 
21403 ?? Is 0:00,18 (ntlm_auth) --helper-protocol=squid-2.5-ntlmssp (ntlm_auth)
21607 ?? Is 0:00,15 (ntlm_auth) --helper-protocol=squid-2.5-ntlmssp (ntlm_auth)
21608 ?? Is 0:00,15
(ntlm_auth) --helper-protocol=squid-2.5-ntlmssp (ntlm_auth)
21609 ?? Is 0:00,15 (ntlm_auth) --helper-protocol=squid-2.5-ntlmssp (ntlm_auth)
21610 ?? Is 0:00,15 (ntlm_auth) --helper-protocol=squid-2.5-ntlmssp (ntlm_auth)
21611 ?? Is 0:00,15 (ntlm_auth) --helper-protocol=squid-2.5-basic (ntlm_auth)
21612 ?? Is 0:00,15 (ntlm_auth) --helper-protocol=squid-2.5-basic (ntlm_auth)
21613 ?? Is 0:00,15 (ntlm_auth) --helper-protocol=squid-2.5-basic (ntlm_auth)
21614 ?? Is 0:00,15 (ntlm_auth) --helper-protocol=squid-2.5-basic (ntlm_auth)
21615 ?? Is 0:00,15 (ntlm_auth) --helper-protocol=squid-2.5-basic (ntlm_auth)


 
Если происходят какие либо проблемы с запуском squid, то запсутите squid c помощью команды squid -d и посмотрите какие ошибки он выдает.

ШАГ 7. Изменение скрипта запуска SAMS

 

Изменим скрипт запуска и остановки SAMS.

# mcedit /etc/init.d/sams

Удаляем все содержимое и копипастим данный скрипт

#!/bin/sh -e

### BEGIN INIT INFO
# Provides: sams
# Required-Start: $local_fs $network $time
# Required-Stop:
# Should-Start: $named $mysql $squid
# Should-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Starting sams daemon
# Description: Squid Account Management System (SAMS)
# Starting sams management daemon - samsdaemon
### END INIT INFO
#
# Author: Pavel Vinogradov
#
# /etc/init.d/sams: start and stop the sams daemon

SAMSPATH=`cat /etc/sams.conf | grep SAMSPATH | tr "SAMSPATH=" "\0"`
NAME="sams"
DAEMON=$SAMSPATH/bin/samsdaemon
LOCKFILE=/var/lock/samsd
PIDFILE=/var/run/samsdaemon.pid
RETVAL=0
SAMS_ENABLE=true

test -x $DAEMON || exit 0

if ! [ -x "/lib/lsb/init-functions" ]; then
. /lib/lsb/init-functions
else
echo "E: /lib/lsb/init-functions not found, lsb-base (>= 3.0-6) needed"
exit 1
fi

. /etc/default/rcS

case "$1" in
start)
if "$SAMS_ENABLE"; then
log_daemon_msg "Starting $NAME daemon" "$NAME"
if [ -s $PIDFILE ] && kill -0 $(cat $PIDFILE) >/dev/null 2>&1; then
log_progress_msg "apparently already running"
log_end_msg 0
exit 0
fi

start-stop-daemon --start --quiet --background \
--pidfile $PIDFILE \
--exec $DAEMON
RETVAL=$?
[ $RETVAL -eq 0 ] && touch "$LOCKFILE"
log_end_msg $RETVAL
else
[ "VERBOSE" != no ] && log_warning_msg "$NAME daemon not enabled, not starting. Please read /usr/share/doc/sams/README.Debian."
fi
;;

stop)
if "$SAMS_ENABLE"; then
log_daemon_msg "Stopping $NAME daemon" "$NAME"
start-stop-daemon --stop --quiet --oknodo --pidfile $PIDFILE
RETVAL=$?
[ $RETVAL -eq 0 ] && rm -f "$LOCKFILE"
log_end_msg $RETVAL
else
[ "VERBOSE" != no ] && log_warning_msg "$NAME daemon not enabled, not stoping..."
fi

;;

restart|force-reload)
/etc/init.d/sams stop
/etc/init.d/sams start
;;

*)
echo "Usage: ${0##*/} {start|stop|restart}"
RETVAL=1
;;
esac

 

Сохраняемся.

Далее даем команду:

# update-rc.d sams defaults

Для закрепления всего перезагружаем сервер.

# reboot

Переходим в директорию /usr/local/share
 
# cd /usr/local/share
# chown -R www-data:www-data ./sams
# cd /sams
# chmod -R 777 ./data
 

ЗАМЕТКА. Для установленной версии php5 и сервера mysql-5.1 и выше в WEB интерфейсе будут проблемы с настройками. 

Необходимо сделать следующее.

1. В файле/usr/local/share/sams/src/webconfigtray.php закомментировать таким образом следующие строчки.

/* function GetHostName()

* {

* if (!($value=getenv('SERVER_NAME')))

* { $value="N.A.";  }

* return($value);

*}

*/

2. В файле /usr/local/share/sams/src/configtray.php закомментировать таким образом следующие строчки.

/* function GetHostName()

* {

* if (!($value=getenv('SERVER_NAME')))

* {  $value="N.A."; }

* return($value);

*}

*/

ШАГ 8. Настройка через Web морду SAMS

На компьютере запускаем веб браузер, любой, какой душе угодно, я люблю Mozilla Firefox

набираем в адресной строке:

http://192.168.0.8/sams

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

1. Администратор

Login: admin

PSWD: qwerty

2. Аудитор/Статистика

Login: auditor

PSWD: audit

Нажимаем в нижнем окне на иконку с двумя человечками, и входим под администратором.

squid
Выставляем примерно следующие параметры интерфейса
squid
Это примерные настройки, которые стоят сейчас на рабочем сервере и работают. С ними нужно быть очень аккуратными.
squid
Кнопку "Тестировать ответ PDC" лучше нажимать после того как вы сохраните все настройки SAMS, иначе SAMS возьмет старые настройки.
squid
И когда сохраните настройки, можно снова зайти в Администрирование SAMS нажать ключ с отверткой и нажать кнопку "Тесторивать ответ PDC"
squid
aquid
Здесь вы выбираете пользователя, выбираете группу в SAMS, и назначаете шаблон для пользователя. Ну остальное по SAMS делается как и раньше
Делаются шаблоны и прочее. Более подробней в предыдушей статье по настройке SQUID + SAMS + NCSA авторизация.
Сильно не ругайтесь, писал все по памяти и конфигам.