Установим и настроим RADIUS server на Debian. И настроим RADIUS-аутентификацию для OpenConnect VPN сервера. А для чего? А для того, чтобы один пользователь имел право на одну активную сессию VPN и не передавал свои логин/пароль другим людям для пользования.
RADIUS протокол
RADIUS протокол выполняет три основные функции:
- проверяет подлинность пользователя прежде, чем разрешить ему доступ к сети;
- авторизует пользователя для доступа к определенным сетевым сервисам;
- ведет учет и отслеживает использование этих сетевых сервисов.
RADIUS протокол еще называют протоколом ААА (Authentication, Authorization and Accounting), что расшифровывается как «Аутентификация, авторизация и учет».
Когда ААА не используется, архитектура описывается как «открытая», где любой может получить доступ и делать все, что угодно, без какого-либо отслеживания.
Может использоваться только часть ААА. Например, если счета пользователей за услуги компании не связаны с объемом переданного трафика через сеть компании, то компания может решить аутентифицировать и авторизовать пользователей, но игнорировать активность пользователей и не утруждать себя ведением учета. А, например, в системе мониторинга будет вестись учет и отслеживаться необычная активность пользователей, а задача по аутентификации и авторизации может быть передана другой системе сети.
RADIUS server
Самый популярный в мире RADIUS server с открытым исходным кодом — это FreeRADIUS.
Установка и настройка FreeRADIUS
Установка
Устанавливаем FreeRADIUS и СУБД PostgreSQL:
apt install freeradius freeradius-postgresql postgresql postgresql-contrib

Настройка PostgreSQL
При установке PostgreSQL автоматически создается пользователь postgres. Далее нам необходимо выполнить несколько команд от имени пользователя postgres. Для этого заходим под учетной записью пользователя postgres:
su - postgres
Создаем пользователя с именем radius:
createuser radius --no-superuser --no-createdb --no-createrole -P
При создании пользователя radius потребуется придумать его пароль. В дальнейшем этот пароль нам еще понадобится.
Создаем базу данных с именем radius:
createdb radius --owner=radius
Выходим из-под пользователя postgres:
exit
Импортируем схему (schema.sql) базы данных в базу radius, XXX — это версия FreeRADIUS:
psql -U radius radius < /etc/freeradius/XXX/mods-config/sql/main/postgresql/schema.sql
После импорта у меня в базе radius появилось 8 таблиц:

Настройка FreeRADIUS
Создаем ссылку на SQL-модуль, XXX — это версия FreeRADIUS:
ln -s /etc/freeradius/XXX/mods-available/sql /etc/freeradius/XXX/mods-enabled/
Настраиваем SQL-модуль (конфигурационный файл /etc/freeradius/XXX/mods-available/sql), меняя параметры подключения к базе данных в соответствии с нашими данными:
sql {
dialect = "postgresql"
driver = "rlm_sql_${dialect}"
# Connection info:
server = "localhost"
port = 5432
login = "radius"
password = "radius_password"
# Database table configuration for everything except Oracle
radius_db = "radius"
}
# Table to keep radius client info
client_table = "nas"
где radius_password
— это пароль пользователя radius, который мы придумали в предыдущем разделе статьи.
В конфигурационном файле /etc/freeradius/XXX/sites-enabled/default проверяем, что в секции authorize присутствует -sql и в секции accounting присутствует -sql:
authorize {
........
-sql
........
}
accounting {
........
-sql
........
}
Перезагружаем FreeRADIUS с помощью команды:
systemctl restart freeradius
Проверка работоспособности RADIUS server
Чтобы проверить работоспособность RADIUS server, добавим тестового пользователя и его пароль в базу radius. Заходим под учетной записью пользователя postgres:
su - postgres
Запускаем интерактивную оболочку PostgreSQL:
psql
Подключаемся к базе данных radius:
\c radius
Добавляем в базу radius, в таблицу radcheck тестового пользователя user01 с паролем pass01:
INSERT INTO radcheck (username, attribute, op, value) VALUES ('user01', 'Cleartext-Password', ':=', 'pass01');
Выходим из интерактивной оболочки PostgreSQL:
\q
Выходим из-под пользователя postgres:
exit
Останавливаем FreeRADIUS:
systemctl stop freeradius
Запускаем RADIUS server в режиме debug:
freeradius -X - debug mode
В новом терминальном окне запускаем команду:
radtest user01 pass01 127.0.0.1 0 testing123
Эта команда пытается выполнить тест аутентификации для пользователя user01 с паролем pass01 на локальной машине (127.0.0.1) через RADIUS server, прослушивающий стандартный порт (поэтому в команде указан порт 0), с использованием секретного пароля testing123. Секретный пароль задан по умолчанию в файле /etc/freeradius/XXX/clients.conf, XXX — это версия FreeRADIUS.
В случае успешной аутентификации будет выведено «Received Access-Accept«.

Чтобы остановить RADIUS server в режиме debug, нажимаем комбинацию клавиш Ctrl + C. И запускаем RADIUS server в обычном (рабочем) режиме:
systemctl start freeradius
RADIUS-аутентификация для OpenConnect VPN
Установка и настройка OpenConnect VPN описана в статье: «OpenConnect VPN. Подробное руководство«. В этой статье описывается аутентификация VPN клиентов по паролю силами OpenConnect VPN сервера. Сейчас же мы хотим передать задачу по аутентификации, авторизации и учету VPN пользователей RADIUS серверу. Для этого нам понадобится библиотека radcli.
Установка библиотеки radcli
Создаем директорию, куда будем скачивать библиотеку radcli:
mkdir /usr/local/src/radcli
Перемещаемся в эту директорию:
cd /usr/local/src/radcli/
Скачиваем библиотеку radcli, YYY — это версия библиотеки radcli:
wget https://github.com/radcli/radcli/releases/download/YYY/radcli-YYY.tar.gz
Распаковываем архив:
tar zxvf radcli-YYY.tar.gz
Переходим в директорию radcli-YYY, где YYY — это версия библиотеки radcli:
cd radcli-YYY
Компилируем и устанавливаем:
./configure --sysconfdir=/etc/ && make && make install
Готово! Библиотека radcli установлена.
Если понадобится удаление radcli, то это можно сделать:
cd /usr/local/src/radcli/radcli-YYY
make uninstall
Настройка radcli
У меня OpenConnect VPN сервер и FreeRADIUS находятся на одной машине.
Открываем конфигурационный файл /etc/radcli/radiusclient.conf и проверяем настройки:
authserver localhost
acctserver localhost
servers /etc/radcli/servers
dictionary /etc/radcli/dictionary
default_realm
radius_timeout 10
radius_retries 3
bindaddr *
Открываем конфигурационный файл /etc/radcli/servers и добавляем строку с секретным паролем testing123:
localhost/localhost testing123
Настройка OpenConnect VPN
Открываем конфигурационный файл /etc/ocserv/ocserv.conf и закомментируем с помощью символа # все строки, начинающиеся с auth.
Включаем RADIUS-аутентификацию с помощью следующей строки:
auth = "radius[config=/etc/radcli/radiusclient.conf,groupconfig=true]"
Включаем RADIUS-учет с помощью следующей строки:
acct = "radius[config=/etc/radcli/radiusclient.conf]"
Добавляем опцию stats-report-time, в которой указывается время в секундах, когда должна передаваться учетная информация.
stats-report-time = 360
У меня получилось вот так:

Сохраняем изменения в конфигурационном файле и перезагружаем OpenConnect VPN сервер:
systemctl restart ocserv
Проверка работоспособности RADIUS-аутентификации OpenConnect VPN
Проверить работоспособность RADIUS-аутентификации OpenConnect VPN сервера очень просто. Открываем OpenConnect VPN клиент, вводим логин user01 и пароль pass01. Если все настроено правильно, получите доступ к VPN.
Один VPN пользователь — одна сессия
Давайте настроим так, чтобы один VPN пользователь имел право лишь на одну активную сессию. Это для того, чтобы пользователи не передавали свои VPN аккаунты другим людям, а использовали только сами.
В конфигурационном файле /etc/freeradius/XXX/sites-enabled/default, где XXX — это версия FreeRADIUS, в секцию session добавляем sql:
session {
sql
}
В конфигурационный файл /etc/freeradius/XXX/users, в самый его конец, добавляем строку:
DEFAULT Simultaneous-Use := 1
Перезагружаем FreeRADIUS с помощью команды:
systemctl restart freeradius
Проверяем, что второе VPN соединение с тем же логином/паролем не устанавливается. Например, в этом случае AnyConnect VPN клиент выводит сообщение: «You are already logged in — access denied«, т.е. «Вы уже залогинены — доступ запрещен».

Выводы
С помощью RADIUS server теперь VPN клиент может иметь только одну активную сессию.
Жду вопросы в комментариях под статьей!
Комментарии
Уже промучился какое-то время с прикручиванием радиус-аутентификации и только наткнулся на вашу статью) У меня в роли радиуса Win server.