doc - goshaQ/iu-practice-as GitHub Wiki

##Создание и настройка HotSpot на оборудовании MikroTik Сервис HotSpot доступный на оборудовании MikroTik используется для ограничения сетевого трафика неавторизованным в системе пользователям, принудительного перенаправления на страницу авторизации при попытке подключения к web-ресурсу, контроля доступа к сетевым ресурсам согласно групповой политике предопределенной для конкретного пользователя и сбора различной статистики о каждом из пользователей системы.

Пункт HotSpot в меню RouterOS (/ip hotspot) содержит в себе несколько подпунктов, просмотреть которые можно нажав на клавишу Tab. Ниже перечислено краткое описание каждого из подпунктов:

  • /ip hotspot active: список авторизованных на данный момент пользователей. Список носит информативный характер, в нем ничего нельзя изменить.
  • /ip hotspot cookie: список cookie-файлов, отправленных клиентам, авторизованным с помощью метода "cookie". Cookie-файлы нельзя изменять, однако их можно удалять.
  • /ip hotspot host: список компьютеров, подключенных к системе. Список носит информативный характер, в нем ничего нельзя изменить.
  • /ip hotspot ip-binding: подпункт позволяет настраивать статичные One-to-One NAT преобразования, разрешать доступ к сетевым-ресурсам без авторизации для конкретных пользователей, а также запрещать конкретные хосты и подсети.
  • /ip hotspot service-port: иногда One-to-One NAT преобразования проходят некорректно из-за несовместимости некоторых протоколов. Для сохранения целостности этих протоколов необходимо использовать helper modules.
  • /ip hotspot profile: список доступных профилей HotSpot. Профили можно создавать/редактировать/удалять. Список и описание всех параметров для редактирования здесь.
  • /ip hotspot user: содержит в себе список локальных пользователей, хранимых на оборудовании MikroTik, и их локальные профили. Пользователей и их профили можно создавать/редактировать/удалять. Список и описание всех параметров для редактирования пользователей здесь., для редактирования профилей здесь.
  • /ip hotspot walled-garder: список web-ресурсов, доступ к которым разрешен не зависимо от того, авторизован пользователь в системе или нет. Web-ресурсы можно добавлять/удалять. Список и описание всех параметров для редактирования здесь.

В дальнейшем подразумевается, что работа происходит в директории /ip hotspot>


Самый простой способ создать HotSpot выполнить setup и запустить мастер конфигурации.

[admin@MikroTik] /ip hotspot> setup 
# Выберите интерфейс, на котором будет запущен HotSpot (В качестве интерфейса может выступать
# switch, bridge, wlan (AP либо Virtual AP), а также отдельно взятый порт)

hotspot interface: __INTERFACE__
# Укажите сеть, в которой будет работать HotSpot.

local address of network: __ADDRESS__
masquerade network: __YES/NO__
# Назначьте пул адресов, который будет выдаваться для устройств, подключенных к HotSpot.

address pool of network: __ADDRESSPOOL__
# Укажите путь к SSL-сертификату (необходимо для перехвата https-трафика
# неавторизованных пользователей для дальнейшего перенаправления на страницу авторизации)

select certificate: __CERNAME__
# Выберете SMTP-сервер (если не нужен, оставьте значение по умолчанию)

ip address of smtp server: __SMTPIP__
# Настройте DNS

dns servers: __DNSSERV__
# Введите имя DNS (необязательно)

dns name: __DNSNAME__
# Создайте локального пользователя HotSpot (после того, как будет настроен AAA-
# сервер необходимо будет удалить этого пользователя) 

name of local hotspot user: __USRNAME__
password for the user: __USRPASS__
[admin@MikroTik] /ip hotspot>

После того, как HotSpot создан, необходимо настроить автоматически созданный для него profile

# перейдите в подпункт меню profile

[admin@MikroTik] /ip hotspot> profile 
# узнайте имя только что созданного profile, учитывая, что параметр hotspot-address должен
# равняться назначенному ip-адресу HotSpot. 

[admin@MikroTik] /ip hotspot profile> print
# параметр login-by отвечает за метод аутентификации. 
# http-chap - CHAP challenge-response метод с использованием hash-алгоритма MD5 для защиты передачи пароля
# mac-cookie - сохраняет данные для авторизации, опираясь на mac-адрес пользователя
# https - организует обмен данных между клиентом и серверов по зашифрованному SSL-туннелю

[admin@MikroTik] /ip hotspot profile> set __PROFNAME__ login-by=http-chap,mac-cookie,https
# следующей командой укажите использование RADIUS для аутентификации и учета 

[admin@MikroTik] /ip hotspot profile> set __PROFNAME__ use-radius=yes radius-accounting=yes nas-port-type=__PORTTYPE__
[admin@MikroTik] /ip hotspot profile>

Если в дальнейшем планируется использовать авторизацию через Active Directory, обязательно заменить ...http-chap... на ...http-pap...!

######################################################################################################################################################

##Настройка AAA-сервера FreeRADIUS и его подключение к оборудованию MikroTik RADIUS - сетевой протокол, предназначенный для обеспечения централизованной аутентификации, авторизации и учёта пользователей, подключающихся к различным сетевым службам.

  • авторизация - процесс проверки AV пар пользователя. В ходе авторизации могут также устанавливаться определённые AV пары(для сервера freeradius), смысл авторизации заключается в проверке достаточности информации, предоставленной пользователем, для того, чтобы пользователь мог пройти аутентификацию.
  • аутентификация - процесс опроса внешних источников данных radius сервером для сравнения AV пар, предоставленных пользователем, и пар, хранящихся во внешнем источнике; выбор метода аутентификации определяется AV парой Auth-Type.
  • учет - процесс посылки NAS пакетов на radius-сервер, которые содержат информацию о текущем соединении(время, количество переданного трафика и так далее), на основании этой информации можно собирать различную статистику и строить отчеты.

Пакет FreeRADIUS может быть установлен выполнением следующей команды:
yum install freeradius freeradius-utils
Добавьте сразу FreeRADIUS сервер в автозапуск, добавив следующую строку в конец файла /etc/rc.local:
radiusd

После установки пакета FreeRADIUS необходимо провести настройку конфигурационных файлов. Конфигурационные файлы хранятся в директории /etc/raddb и отвечают за работу отдельных механизмов FreeRADIUS сервера.

Общие настройки сервера размещаются в файле radiusd.conf:

radiusd.conf
	prefix = /usr
	exec_prefix = /usr
	sysconfdir = /etc
	localstatedir = /var
	sbindir = /usr/sbin
	logdir = ${localstatedir}/log/radius
	raddbdir = ${sysconfdir}/raddb
	radacctdir = ${logdir}/radacct

	# имя FreeRADIUS сервера
	name = radiusd

	# расположение файлов конфигурации
	confdir = ${raddbdir}
	modconfdir = ${confdir}/mods-config
	certdir = ${confdir}/certs
	cadir   = ${confdir}/certs
	run_dir = ${localstatedir}/run/${name}
	db_dir = ${localstatedir}/lib/radiusd

	# расположение rlm_* модулей
	libdir = /usr/lib64/freeradius

	# расположение PID-файла для FreeRADIUS сервера
	pidfile = ${run_dir}/${name}.pid

	# максимальное время обработки запроса(в секундах), по истечение которого
	# клиенту будет послан пакет, сигнализирующий разрыв соединения
	max_request_time = 30
	# время ожидания отправленного ответа на NAS(в секундах), по истечение 
	# которого он удаляется из cache-файла
	cleanup_delay = 5

	# максимальное количество соединений для данного сервера. Обычно число
	# получается умножением числа NAS в сети на 256. Например, для 4 клиентов,
	# значение будет 4*256=1024
	max_requests = 1024

	# записывать ли в журнальный файл доменное имя узла или только его IP-адрес
	# например, www.freeradius.org (on) или 206.47.27.232 (off).
	hostname_lookups = no

	# секция, отвечающая за журналирование
	log {
		# назначение журнальных сообщений
		destination = files

		# расположение журнального файла
		file = ${logdir}/radius.log

		# заносить ли в файл журналирования данные о полном имени пользователя
		stripped_names = no

		# заносить ли в файл журналирования информацию о запросах на аутентификацию 
		auth = no

		# заносить ли в лог данные о переданных паролях(неправильных и правильных
		# соответственно)
		auth_badpass = no
		auth_goodpass = no

		# сообщение, которое должно вернуться, если превзойден лимит одновременных
		# пользователей для одного аккаунта
		msg_denied = "You are already logged in - access denied"
	}

	# программа для выполнения параллельных проверок
	checkrad = ${sbindir}/checkrad

	# секция, отвечающая за безопасность 
	security {
		# максимальное число AV пар в пакете. Если число пар больше, то
		# пакет не обрабатывается. Если указать данный параметр равным
		# нулю, то будут обрабатываться любые пакеты.
		max_attributes = 200

		# пакет отказа доступа может быть отправлен с некоторой задержкой(в
		# секундах). Такое поведение предотвращает применение DoS атаки. 
		# Если же указать значение, равное нулю, то отказ будет
		# посылаться без задержки.
		reject_delay = 1

		# посылать ответ на запрос NAS о статусе сервера. 
		status_server = yes
	}

	# файл, отвечающий за конфигурацию клиентов FreeRADIUS сервера
	$INCLUDE clients.conf


	# секция, отвечающая за конфигурацию пула потоков FreeRADIUS сервера 
	thread pool {
		#  начальное количество серверов для запуска
		start_servers = 5

		#  максимальное итоговое количество запущенных серверов
		max_servers = 32

		# нижняя и верхняя граница для запасных серверов, ожидающих запрос
		# если их меньше нижней границы - создаются новые сервера
		# если их больше верхней границы - отключаются простаивающие сервера
		min_spare_servers = 3
		max_spare_servers = 10
	}

	# секция, отвечающая за доступные модули
	modules {
		$INCLUDE mods-enabled/
	}

	# секция, отвечающая за модуль политик
	policy {
		$INCLUDE policy.d/
	}

	# файл содержащий виртуальные серверы для запуска при старте FreeRADIUS
	$INCLUDE sites-enabled/

Конфигурация клиентов производится в файле clients.conf:

clients.conf
	# в данном файле описываются клиенты (NAS устройства). Вначале идёт определение клиента:
	# ip-адрес, затем идёт список AV пар для данного клиента, заключённый в фигурные скобки. Также
	# можно определять клиентов для некоторой подсети, указывая вместо ip-адреса диапазон ip-адресов.
	client __CLIENTIP__ {
		# Пароль для идентификации клиента и обмена с ним данными. Данным
		# ключом также осуществляется проверка неизменности передаваемых
		# пакетов(подпись).
		secret = __RADSCRT__


		# Поле типа NAS, может принимать следующие значения:
		#	cisco
		#	computone
		#	livingston
		#	max40xx
		#	multitech
		#	netserver
		#	pathras
		#	patton
		#	portslave
		#	tc
		#	usrhiper
		#	other
		nastype     = __NASTYPE__
	}

	client __SUBNETIP/MASK__ {
		...
	}

Для завершения настройки и приведения изменений в силу необходимо перезапустить FreeRADIUS сервер

# завершите процесс FreeRADIUS, если он был запущен
ps -ax | grep radiusd
kill __PID__

# запустите FreeRADIUS
radiusd

После того, как конфигурационные файлы FreeRADIUS сервера настроены следует провести попытку авторизации на HotSpot с использованием данных пользователя, хранимых на сервере FreeRADIUS, с целью убедиться, что все настроено правильно.

Users основной файл,где хранятся данные о пользователях. Он расположен в директории /etc/raddb. Описание идёт так: вначале идёт без отступа имя пользователя, затем, отступая на табуляцию, идут AV пары(первой парой идёт пароль). Создайте пользователя HotSpot на серевре FreeRADIUS:

users
	test	Cleartext-Password := "test"

Теперь подключитесь к оборудованию MikroTik и добавьте новый RADIUS сервер. Для этого выполните:

# перейдите в директорию RADIUS

[admin@MikroTik] /radius
# добавьте новый RADIUS сервер.
# параметр service отвечает за сервис, для авторизации в котором будет использоваться RADIUS сервер
# параметр address должен равняться ip-адресу FreeRADIUS сервера
# параметр secret должен равняться соответствующему клиенту секретному слову в clients.conf

[admin@MikroTik] /radius> add service=hotspot address=__RADADDR__ secret=__RADSCRT__ disabled=no

Поскольку локальные пользователи HotSpot не нужны больше, удалите их из соображений безопасности:

# перейдите в директорию RADIUS

[admin@MikroTik] /radius hotspot user
# выведите список всех текущих локальных пользователей HotSpot

[admin@MikroTik] /radius hotspot user> print
# удалите по одному каждого пользователя из выведенного списка выше

[admin@MikroTik] /radius hotspot user> remove __USRNAME__

Теперь авторизуйтесь на HotSpot. Для этого откройте web-браузер и попытайтесь подключиться к любому web-ресурсу. Вместо ожидаемой страницы вы должны попасть на страницу авторизации HotSpot, где введя данные пользователя, хранимые на сервере FreeRADIUS, получите доступ в интернет и будете перенаправлены на ожидаемую страницу.

######################################################################################################################################################


Помните о firewall
По умолчанию в дистрибутиве CentOS включен firewall, который может блокировать входящий интернет трафик. Убедитесь, что UDP порты 1812, 1813 и 9996 открыты для внешних источников. Выполнив следующую команду, проверьте цепь INPUT:
iptables -L
Если запрос на необходимые UDP порты не обрабатывается как исключение, добавьте следующие правила в firewall:

# __REJRUL__ - номер последнего правила в цепи INPUT
# порт, который прослушивает FreeRADIUS для получения запроса на авторизацию

iptables -I INPUT __REJRUL__ -p udp -m udp --dport 1812 -j ACCEPT
# порт, который прослушивает FreeRADIUS для получения данных учета

iptables -I INPUT (__REJRUL__ + 1) -p udp -m udp --dport 1813 -j ACCEPT
# порт, который прослушивает NetFlow коллектор 

iptables -I INPUT (__REJRUL__ + 2) -p udp -m udp --dport 9996 -j ACCEPT

######################################################################################################################################################

##Использование PostgreSQL как хранилище пользователей HotSpot FreeRADIUS может подключаться к SQL базе данных для того, чтобы получать информацию о пользователях. Хранить большое число пользователей HotSpot удобнее в SQL базе данных, ведь файл users не предназначен для такой цели, поэтому необходимо настроить FreeRADIUS для работы с SQL базой данных.

Предположим, что PostgreSQL еще не установлен на удаленной машине, где развернут FreeRADIUS сервер. Сначала необходимо будет установить, а затем настроить PostgreSQ с целью сделать его доступным для использования FreeRADIUS.

Установите пакет PostgreSQL выполнением следующей команды:
yum install postgresql95 postgresql95-server

Откройте файл pg_hba.conf, расположенный в каталоге /var/lib/pgsql/9.5/data, найдите и отредактируйте следующую строку:
hostall all 127.0.0.1/32 ̶p̶e̶e̶r md5

Необходимо создать пользователя __PGUSRNAME__ и базу данных __DBNAME__ в PostgreSQL:

# переключитесь на пользователя PostgreSQL по умолчанию

su - postgres
# создайте пользователя __PGUSRNAME__ без прав суперпользователя

createuser radius --no-superuser --no-createdb --no-createrole -P
# создайте базу данных __DBNAME__, в ней будут хранится данные пользователей HotSpot, данные учета и т.д.

createdb __DBNAME__ --owner=__PGUSRNAME__
exit

Теперь необходимо установить sql модуль, отвечающий за подключение к PostgreSQL:
yum install freeradius-postgresql

Экспортируйте в базу данных __DBNAME__ схему, содержащуюся в установленном sql модуле:

cd /etc/raddb/mods-config/sql/main/postgresql
psql -U __PGUSRNAME__ __DBNAME__ < schema.sql

Настроим конфигурационный файл sql модуля, находящийся в директории /etc/raddb/mods-available:

sql {
	# подмодуль для выполнения sql запросов
	driver = "rlm_sql_postgresql"

	# диалект SQL, который планируется использовать
	dialect = "postgresql"

	# информация для подключения к PostgreSQL
	server = "localhost"
	port = 5432
	login = "__PGUSRNAME__"
	password = "__PGUSRPASS__"

	# база данных предназначенная для FreeRADIUS
	radius_db = "__DBNAME__"

	# таблицы, содержащие журнальные записи, сгенерированные после того,
	# как пользователь вошел и вышел на HotSpot
	acct_table1 = "radacct"
	acct_table2 = "radacct"

	# таблица, содержащая данные, полученные после аутентификации
	postauth_table = "radpostauth"

	# таблицы, содержащие данные для проверки AV-пар при аутентификации
	authcheck_table = "radcheck"
	groupcheck_table = "radgroupcheck"

	# таблицы, содержащие данные для ответа после прохождения пользователем
 	# аутентификации
	authreply_table = "radreply"
	groupreply_table = "radgroupreply"

	# таблица, содержащая информацию о принадлежности пользователя к группе
	usergroup_table = "radusergroup"

	# стоит ли удалять просроченные сессии, если checkrad заметил
	# повторную авторизацию
	delete_stale_sessions = yes


	#  настройка пула соединений
	pool {
		# количество соединение при старте
		start = 5

		# минимальное количество соединений, которое следует держать открытыми
		min = 4

		# максимальное количество соединений
		max = ${thread[pool].max_servers}

		# количество запасных соединений, которые могут случайно закрыться
		spare = 3

		# количество использований соединения, перед тем, как оно закроется
		#(0 - бесконечность)
		uses = 0

		# время существования соединения в секундах (0 - бесконечность)
		lifetime = 0

		# время в секундах простаивания соединения свободным, после 
		# которого оно закроется
		idle_timeout = 60
	}

	# стоит ли хранить данные о клиентах FreeRADIUS в базе данных.
	# Рекомендуется использовать только если таких клиентов большое количество.
 	# После того, как атрибуту read_clients присвоено значение yes, следует
 	# удалить всех клиентов из файла clients.conf и добавить их по одному в базу
 	# данных следующим sql запросом:
 	# INSERT INTO  nas VALUES (NULL ,  '__CLIENTIP__',  '__SHORTNAME__',  '__NASTYPE__', NULL,
	# '__RADSCRT__', NULL , NULL ,  '__DESCRIPTION__');
	read_clients = __YES/NO__

	# таблица, содержащая информацию о клиентах FreeRADIUS
	client_table = "nas"

	# чтение специфичных sql запросов для указанного диалекта
	$INCLUDE ${modconfdir}/${.:name}/main/${dialect}/queries.conf
}

Убедитесь, что sql модуль подключен:

# выведите список всех подключенных модулей
ls /etc/raddb/mods-enabled

# если в выведенном списке не встречается упоминание sql модуля, добавьте
# его вручную, создав символьную ссылку в директории /etc/raddb/mods-enabled
ln -s /etc/raddb/mods-available/sql /etc/raddb/mods-enabled

Для завершения настройки и приведения изменений в силу необходимо перезапустить FreeRADIUS сервер.

Модуль sql подключен, теперь следует провести попытку авторизации на HotSpot с использованием данных пользователя, хранимых в базе данных PostgreSQL, с целью убедиться, что все настроено правильно.

Добавьте пользователя HotSpot в базу данных PostgreSQL

# запустите терминальную программу psql, исполняющую sql запросы

psql -U __PGUSRNAME__
# добавьте запись о пользователе

=>INSERT INTO radcheck VALUES (NULL, 'dbtest', 'Cleartext-Password', ':=', 'dbtest');
=>\q

Авторизуйтесь на HotSpot с использованием данных пользователя, хранимых в базе данных PostgreSQL.

######################################################################################################################################################

##Учет сетевого трафика посредством NetFlow Если говорить о сетевом трафике, данные учета, агрегируемые FeeRADIUS, не достаточно информативны, поэтому в системе они отдельно агрегируются с оборудования MikrtoTik по протоколу NetFlow. Ниже приведен список атрибутов, представляющих собой интерес, значение которых можно получить таким образом:

  • UNIX_SECS - временная отметка, указывающая на момент передачи данных
  • DPKTS - количество пакетов, переданных/полученных за промежуток
  • DOCTETS - количество байтов, переданных/полученных за промежуток
  • SRCADDR - IP-адрес источника
  • DSTADDR - IP-адрес назначения
  • SRCPORT - исходящий порт
  • DSTPORT - порт назначения
  • PROT - протокол передачи данных

NetFlow имеет два основных компонента:

  • Cенсор: MikroTik оборудование. Собирает статистику по проходящему через него трафику.
  • Коллектор: утилита flow-capture. Собирает получаемые от сенсора данные и сохраняет их в файл.

Настройка сенсора:
Включите опцию Traffic-Flow на оборудовании MikroTik:

[admin@MikroTik] /ip traffic-flow
# атрибут cache-entries отвечает за количество потоков, которые могут находиться
# в памяти устройства одновременно

[admin@MikroTik] /ip traffic-flow> set enabled=yes cache-entries=4M

Укажите IP-адрес и порт хоста, который будет принимать данные отправляемые Traffic-Flow:

[admin@MikroTik] /ip traffic-flow> target
[admin@MikroTik] /ip traffic-flow target> add address=__IPADDR__:9996 version=5

На этом все, теперь оборудование MikroTik будет собирать данные о трафике и отправлять их коллектору.

Настройка коллектора:
Скачайте и распакуйте в домашнюю директорию CentOS набор утилит flow-tools:

wget storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/flow-tools/flow-tools-0.68.5.1.tar.bz2
tar xfj flow-tools*

Перейдите в директорию с распакованными исходниками и выполните установку:

 ./configure --with-postgresql=/usr/pgsql-9.5/bin/pg_config
make
make install

Создайте директорию, где будут хранится временные файлы с агрегированными данными:
mkdir /var/flows
Запустите коллектор flow-capture из набора утилит flow-tools

# флаг -w указывает на директорию, куда коллектор будет сохранять полученные данные в виде файла.
# __DSTIP__ и __SRCIP__ указывают на ip-адрес получателя и ip-адрес отправителя соответственно
# (можно указать значение 0, что эквивалентно диапазону 0.0.0.0/32)

/usr/local/flow-tools/bin/flow-capture -w /var/flow/ -N 0 __DSTIP__/__SRCIP__/9996

Для того, чтобы добавить коллектор flow-capture в автозапуск, необходимо отредактировать файл /etc/rc.local, добавив в конец файла строку, которая запускает коллектор, и сделать его исполняемым следующей командой:
chmod +x /etc/rc.d/rc.local

На этом все, теперь коллектор flow-capture будет получать данные о трафике от оборудования MikroTik и сохранять их с периодичностью в 15 минут в новый файл в директории /var/flow.


Хранить данные, получаемые по протоколу NetFlow удобнее в базе данных, поскольку так упрощается работа с ними: построение выборок, создание отчетов и так далее. Следуйте инструкциям ниже, чтобы настроить экспорт данных о сетевом трафике, которые коллектор сохранил в файл, в базу данных.

Создайте таблицу netdata в __DBNAME__, в которой будут хранится данные учета о сетевом трафике:

psql -U __PGUSRNAME__
=>CREATE TABLE netdata (	
->	unix_secs BIGINT NOT NULL, 
->	dpkts BIGINT,
->	doctets BIGINT,
->	srcaddr INET NOT NULL,
->	dstaddr INET NOT NULL,
->	srcport INTEGER,
->	dstport INTEGER,
->	prot SMALLINT
->);
=>\q

Для экспорта данных, хранимых в файле, в базу данных создайте bash-скрипт exportToPostgreSQL.sh:

exportToPostgreSQL.sh
	#!/bin/bash

	#укажите директории, где находятся временные flow-файлы и flow-tools
	flowdir='/var/flow'
	tooldir='/usr/local/flow-tools/bin'

	#укажите данные для подключения к PostgreSQL
	usrname='__PGUSRNAME__'
	pass='__PGUSRPASS__'
	host='127.0.0.1'
	port='5432'
	dbname='__DBNAME__'
	table='netdata'

	#сформируйте параметры для sql запрос
	file=$(ls $flowdir/ | grep 'ft-*' | head -1)
	maskFields='UNIX_SECS,DPKTS,DOCTETS,SRCADDR,DSTADDR,SRCPORT,DSTPORT,PROT'

	#если переменная $file не пуста - экспортируем данные в базу данных и удаляем ненужный файл
	if [ ! -z $file ]
	then
		$tooldir/flow-export -f5 -m$maskFields -u"$usrname:$pass:$host:$port:$dbname:$table" < $flowdir/$file
		rm $flowdir/$file
	fi

Сделайте созданный bash-скрипт исполняемым:

chmod +x exportToPostgreSQL.sh

Добавьте bash-cкрипт в список задач cron, чтобы он выполнялся с периодичностью в 10 минут, вставив следующую строку в конец файла /etc/crontab:

*/10 * * * * root __PATHTOSCRIPT__/exportToPostgreSQL.sh

Запустите службу cron и добавьте ее в автозапуск:

/sbin/service crond start
chkconfig crond on

######################################################################################################################################################

##Использование Actieve Directory как хранилище пользователей HotSpot Конфигурирование FreeRADIUS сервера для использования Active Directory как хранилище пользователей HotSpot состоит из двух шагов:

  • конфигурирование Samba сервера и подключение к домену Active Directory
  • конфигурирование FreeRADIUS сервера для использования модуля ntlm_auth для аутентификации пользователей

Конфигурирование Samba:

Первым делом необходимо установить пакеты Samba и Winbind:
yum install samba samba-winbind samba-winbind-modules

Конфигурация Samba и Winbind производится в файле smb.conf, который расположен в директории /etc/samba:

smb.conf
	[global]
		# поддомен, выделенный для AD

		workgroup = __ADSUBDOM__
		# данные для журналирования

		log file = /var/log/samba/log.%m
		max log size = 50
		# параметр, указывающий на метод аутентификации  

		security = ADS
		# механизм для хранения информации о пользователях

		passdb backend = smbpasswd
		# url по которому доступен AD

		realm = __ADURL__
		# использовать ли шифрование при передачи паролей между сервером и клиентом

		encrypt passwords = yes
		# запретите samba становится контроллером AD

		domain master = no
	   	local master = no
	   	preferred master = no
	   	domain logons = no
		# отключите поддержку принтеров

		load printers = no
		show add printer wizard = no
	   	printcap name = /dev/null 
		# разрешите winbind использовать enum для пользователей и групп

		winbind enum users = yes
		winbind enum groups = yes
		# можно ли winbind управлять пользователями без доменной части в имени пользователя 

		winbind use default domain = yes
		# диапазон выдачи внутренних id
	 
		idmap uid = 600 - 20000
		idmap gid = 600 - 20000

Запустите службу winbind:
winbindd start

Добавьте службу winbind в автозапуск, добавив строку выше в конец файла /etc/rc.local .

Отредактируйте /etc/resolv.conf, определив Active Directory как DNS сервер:

resolv.conf
	...
	search edu.innopolis.ru
	domain edu.innopolis.ru
	nameserver __ADIPADDR__

Подключите Samba сервер к домену Active Directory:
net ads join -U Administrator

Настройте доступ пользователю, который запускает FreeRADIUS сервер:
chgrp radiusd /var/cache/samba/winbindd_privileged

Конфигурирование FreeRADIUS:

FreeRADIUS включает в себя файл, называемый ntlm_auth в директории /etc/raddb/mods-available. Это файл содержит в себе exec секцию, называемую ntlm_auth. Отредактируйте ее, указав путь к утилите ntlm_auth, входящей в состав Samba сервера:

ntlm_auth 
	exec ntlm_auth {
	wait = yes
	program = "/usr/bin/ntlm_auth --request-nt-key --domain=__ADURL__ --username=%{mschap:User-Name} --password=%{User-Password}"
	}

Отредактируйте файлы default и inner-tunnel, расположенныe в каталоге /etc/raddb/sites-available, чтобы добавить новый способ аутентификации через AD:

default/inner-tunnel
	...
	# секция, отвечающая за выбор метода аутентификации
	authorize {
		...
		#
		pap

		# если метод аутентификации не определен, назначьте аутентификацию используя AD
		if(!control:Auth-Type) {
			update control {
				Auth-Type = "ntlm_auth"
			}
		}
	}


	# секция, отвечающая за аутентификацию
	authenticate {
		...
		Auth-Type MS-CHAP {
			mschap
		}

		# вызовите модуль ntlm_auth, если был назначен тип аутентификации ntlm_auth
		Auth-Type NTLM_AUTH {
	 		ntlm_auth
		}
		...
	}
	...

Для завершения настройки и приведения изменений в силу необходимо перезапустить FreeRADIUS сервер.

Модуль, отвечающий за аутентификацию используя Active Directory, подключен, теперь следует провести попытку авторизации на HotSpot с использованием данных пользователя, хранимых в Active Directory, с целью убедиться, что все настроено правильно.

######################################################################################################################################################

##Создание и настройка групп пользователей HotSpot Разграничение групп пользователей по уровням доступа в интернет реализуется за счет поддержки HotSpot функции user profile. Принцип работы заключается в том, что после аутентификации FreeRADIUS сервер сообщает HotSpot, к какой группе принадлежит пользователь, и HotSpot применяет необходимые ограничения, описанные для соответствующей группы в user profile, на пользователя. Таким образом, сначала необходимо создать и настроить группы пользователей на оборудовании MikroTik, затем настроить FreeRADIUS так, чтобы после аутентификации он сообщал о принадлежности к группе.

Создайте в firewall оборудования MikroTik цепи, отвечающие за фильтрацию входящего/исходящего трафика, для каждой группы пользователей:

[admin@MikroTik] /ip firewall filter 
# укажите переход с цепи forward на цепь hotspot, которая будет содержать правила для
# фильтрации трафика для каждого пользователя в соответствии с его группой пользователя

[admin@MikroTik] /ip firewall filter> add chain=forward action=jump jump-target=hotspot
# ниже перечислены правила, необходимые для инициализации цепей, после настройки которых
# необходимо удалить эти правила 

[admin@MikroTik] /ip firewall filter> add chain=guest-input
[admin@MikroTik] /ip firewall filter> add chain=guest-output

[admin@MikroTik] /ip firewall filter> add chain=student-input
[admin@MikroTik] /ip firewall filter> add chain=student-output

[admin@MikroTik] /ip firewall filter> add chain=staff-input
[admin@MikroTik] /ip firewall filter> add chain=staff-output
[admin@MikroTik] /ip firewall filter>

Создайте в user profile группы пользователей HotSpot:

[admin@MikroTik] /ip hotspot user profile
# idle-timeout - интервал, в течении которого пользователь может оставаться неактивным.
# По истечении пользователя выбрасывает из системы
# keepalive-timeout - частота опроса пользователя для проверки, активен он или нет.
# mac-cookie-timeout - интервал, в течении которго mac-cookie действительны
# shared-users - количество одновременных устройств, авторизированных в системе под одним пользователем
# incoming-filter - фильтр на входящий трафик
# outgoing-filter - фильтр на исходящий трафик
# rate-limit - ограничение скорости на upload/download
# при создании HotSpot создается группа admin, которая имеет тип default, куда попадает любой
# пользователь, у которого не определена группа. Измените ее и сделайте группой с низшим уровнем доступа

[admin@MikroTik] /ip hotspot user profile> set admin name=guest idle-timeout=__INTERVAL__ shared-users=1 keepalive-timeout=__INTERVAL__ mac-cookie-timeout=__INTERVAL__ incoming-filter=guest-input outgoing-filter=guest-output rate-limit=10M/10M

[admin@MikroTik] /ip hotspot user profile> add name=student idle-timeout=__INTERVAL__ shared-users=3 keepalive-timeout=__INTERVAL__ mac-cookie-timeout=__INTERVAL__ incoming-filter=student-input outgoing-filter=student-output

[admin@MikroTik] /ip hotspot user profile> add name=staff idle-timeout=__INTERVAL__ shared-users=3 keepalive-timeout=__INTERVAL__ mac-cookie-timeout=__INTERVAL__ incoming-filter=staff-input outgoing-filter=staff-output
# профиль для администратора системы 

[admin@MikroTik] /ip hotspot user profile> add name=admin idle-timeout=__INTERVAL__ shared-users=3 keepalive-timeout=__INTERVAL__ mac-cookie-timeout=__INTERVAL__

Принадлежности к группе пользователей должна быть предопределена. В системе, при авторизации, используя SMS, VK или TG, пользователь автоматически попадает в группу guest, что подтверждает запись в базе данных в таблице radusergroup. Однако, если используется авторизация через Active Directory, принадлежность к группе пользователей HotSpot проверяется членством в соответствующей группе AD, то есть сначала необходимо создать группу AD student и staff и добавить туда пользователей в соответствии с необходимым уровнем доступа.

Укажите ответ, который должен отправить FreeRADIUS при успешной авторизации через SMS, VK или TG на HotSpot:

psql -U __PGUSRNAME__
# поскольку в базе данных хранятся данные пользователей, принадлежащих к группе guest,
# достаточно указать ответ при успешной авторизации только для этой группы

=>INSERT INTO radgroupreply VALUES (1, 'guest', 'Mikrotik-Group', ':=', 'guest');
\q

Создайте и подключите два новых модуля FreeRADIUS ответственных за проверку принадлежности пользователя к группе Active Directory при авторизации:

cp /etc/raddb/mods-available/ntlm_auth /home
mv /home/ntlm_auth /etc/raddb/mods-available/ntlm_auth.student
ln -s /etc/raddb/mods-available/ntlm_auth.student /etc/raddb/mods-enabled

cp /etc/raddb/mods-available/ntlm_auth /home
mv /home/ntlm_auth /etc/raddb/mods-available/ntlm_auth.staff
ln -s /etc/raddb/mods-available/ntlm_auth.staff /etc/raddb/mods-enabled

Отредактируйте их следующим образом:

ntlm_auth.student
	exec ntlm_auth.student {
	        wait = yes
        	program = "/usr/bin/ntlm_auth --request-nt-key --domain=EDU.INNOPOLIS.RU --username=%{mschap:User-Name} --password=%{User-Password} --require-membership-of=__ADSUBDOM__\\student"
	}
ntlm_auth.staff
	exec ntlm_auth.student {
        	wait = yes
        	program = "/usr/bin/ntlm_auth --request-nt-key --domain=EDU.INNOPOLIS.RU --username=%{mschap:User-Name} --password=%{User-Password} --require-membership-of=__ADSUBDOM__\\staff"
	}

Добавьте два новых способа авторизации и укажите ответ, который должен отправить FreeRADIUS при успешной авторизации через Active Directory на HotSpot, отредактировав файлы default и inner-tunnel, расположенныe в каталоге /etc/raddb/sites-available

default/inner-tunnel
	authorize {
		...
		# 
		pap
	
		# учтите, что лучше всего располагать проверку на принадлежность к группе в порядку возрастания
		# уровня доступа, так, если пользователь состоит одновременно в группах staff и student, он
		# получит максимальный уровень доступа для этих двух групп

		ntlm_auth.staff {
		        reject = 1
		}
		if (ok) {
		        update control {
		                Auth-Type = "ntlm_auth"
		        }
		        update reply {
		                Mikrotik-Group := "student"
		        }
		}

		ntlm_auth.student {
		        reject = 1
		}
		if (ok) {
		        update control {
		                Auth-Type = "ntlm_auth"
		        }
		        update reply {
		                Mikrotik-Group := "staff"
		        }

		}
	}

Для завершения настройки и приведения изменений в силу необходимо перезапустить FreeRADIUS сервер.

⚠️ **GitHub.com Fallback** ⚠️