freeradius авторизация в AD с учетом нескольких групп

Проблемы с установкой, настройкой и работой системных и сетевых программ.

Модераторы: GRooVE, alexco

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
bossded
проходил мимо
Сообщения: 3
Зарегистрирован: 2012-08-09 9:24:51

freeradius авторизация в AD с учетом нескольких групп

Непрочитанное сообщение bossded » 2012-08-09 11:14:36

Доброго времени суток.
Есть Freeradius сервер на Freebsd 9.0, авторизующий пользователей через ntlm_auth. Настроено все по статье из вики на freeradius.org (http://deployingradius.com/documents/co ... ctory.html) Все хорошо, пока я не хочу разграничить возможность прохождения авторизации в зависимости от того, в какой группе находится пользователь.
Например, мне надо, чтобы пользователи, находящиеся в одной группе, могли пройти авторизацию только до 22 часов, в то время как пользователи из другой группы имели доступ в любое время. ntlm_auth позволяет проверить принадлежность к группе, но там нельзя задать условие нахождения юзера ЛИБО в одной группе, ЛИБО в другой. Но это еще полбеды. Я был крайне озадачен, но нормальной документации по политикам freeradius просто не нашел. Т.е. я пока не могу понять даже как передать политике имя пользователя, пришедшее на входе. Путем некоторого шаманства я создал политику, проверяющую сколько сейчас времени и в зависимости от этого выдающую accept или reject, однако по факту к реализации доступа по группам я приблизился не сильно, поскольку непонятно как проверить находится пользователь в группе или нет.
В принципе можно воткнуть в cron скрипт, который бы менял в зависимости от времени файл ../raddb/modules/mschap, но это получаются какие-то костыли.

Может кто подскажет где найти подробную документацию по этой штуке? Ну или какую-то информацию по решению данной конкретной проблемы...

А вообще, может возможно прикрутить к freeradius авторизацию по типу:

Код: Выделить всё

/usr/local/libexec/squid/squid_ldap_group -R -b "dc=domain,dc=local" -f "(&(samaccountname=%v)(memberof=cn=%a,cn=users,dc=domain,DC=local))" -D user@domain.local -W /usr/local/etc/squid/authpw -K -h dc.domain.local -d
Ибо как раз сквид то у меня работает нормально...

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

bossded
проходил мимо
Сообщения: 3
Зарегистрирован: 2012-08-09 9:24:51

Re: freeradius авторизация в AD с учетом нескольких групп

Непрочитанное сообщение bossded » 2012-08-09 13:15:25

На данный момент работает с помощью такого нехитрого костыля (вдруг кому пригодится):

Код: Выделить всё

DIR="/usr/local/etc/raddb/modules"
date=`date '+%H%M'`
echo $date
if [ $date -gt 2155 ] 
then
	cp $DIR/temp/mschap_it $DIR/mschap
else
	cp $DIR/temp/mschap_all $DIR/mschap
fi

/usr/local/etc/rc.d/radiusd stop
sleep 2
/usr/local/etc/rc.d/radiusd start
При этом содержимое файла mschap различается строчкой

Код: Выделить всё

ntlm_auth = "/usr/local/bin/ntlm_auth --request-nt-key --username=%{mschap:User-Name:-None} --domain=%{%{mschap:NT-Domain}:-MYDOMAIN} --challenge=%{mschap:Challenge:-00} --nt-response=%{mschap:NT-Response:-00} --require-membership-of=%{%{mschap:Group}:-MYDOMAIN+VPN_ALL}"
Соответственно в другом файле - другая группа.
Скрипт запускается через crontab.

bossded
проходил мимо
Сообщения: 3
Зарегистрирован: 2012-08-09 9:24:51

Re: freeradius авторизация в AD с учетом нескольких групп

Непрочитанное сообщение bossded » 2012-08-13 13:43:58

Проблему свою я решил.
На всякий случай, вдруг кому пригодится:
Авторизация пользователей настраивается по мануалам через mschap.
В policy.conf создаем политику, вызывающую внешний sh скрипт.
В sites-enabled\default в секции post-auth добавляем нашу политику.
Содержание скрипта у меня получилось следующее:

Код: Выделить всё

#!/bin/sh

# Убираем кавычки из имени пользователя (freeradius передает имя пользователя с кавычками, они не нужны)
USER_NAME=`echo $USER_NAME|tr -d [\"]`
echo $USER_NAME
# Узнаем сколько сейчас времени
date=`date '+%H%M'`
# Узнаем какой сейчас день недели
day=`date '+%u'`
# Указываем когда у нас начинается и заканчивается время возможности подключаться
morning=1000
evening=2200
# Строка для сравнения (можно было сделать красивее, но так было быстрее)
test_string="sAMAccountName: "$USER_NAME

# Функция, проверяющая можно ли подключаться в данный момент
itstime()
	{
		# Если понедельник - можно подключиться в любое время
		if [ $day -eq 1 ]
		then
			return 0
		# Если среда, пятница или воскресенье можно подключиться если время больше верхнего значения
		elif [ $day -eq 3 -o 5 -o 7 ]
		then
			if [ $date -gt $morning ]
			then
				return 0
			else
				return 1
			fi
		# Если вторник, четверг или суббота можно подключиться если раньше нижнего значения
		elif [ $day -eq 2 -o 4 -o 6 ]
		then
			if [ $date -gt $evening ]
			then
				return 1
			else
				return 0
			fi
		fi
	}
# Узнаем, состоит ли пользователь в группе администраторов
string=`/usr/local/bin/ldapsearch -x -b "dc=mydomain,dc=local" -D "testuser@mydomain.local" -y "/usr/local/etc/raddb/authpw" -h "dc.mydomain.local" "(&(samaccountname=$USER_NAME)(memberof=cn=VPN_IT,ou=My groups,dc=mydomain,dc=local))" | grep sAMAccountName`
# Если состоит разрешаем подключиться
 if [ "$string" = "$test_string" ]
 then
	 echo "user is admin"
	 return 0
 else
	# Если не состоит проверяем есть ли он в группе пользователей, которым разрешен VPN
	 string2=`/usr/local/bin/ldapsearch -x -b "dc=mydomain,dc=local" -D "testuser@mydomain.local" -y "/usr/local/etc/raddb/authpw" -h "dc.mydomain.local" "(&(samaccountname=$USER_NAME)(memberof=cn=Ras users,ou=My groups,dc=mydomain,dc=local))" | grep sAMAccountName`
	# Если разрешен - проверяем можно ли подключиться в это время
	if [ "$string2" = "$test_string" ]
	then
		if itstime 
		then		
			echo "user is same user"
			return 0
		else 
			echo "not right time"
		return 1
		fi
	else 
	# Если не разрешен - запрет подключения
		echo "VPN not allowed!"
		return 1
	fi
 fi
Скорее всего это можно было сделать политиками самого Freeradius, но у меня так и не получилось настроить корректную работу такой двойной проверки в самом фрирадиусе.