Cisco AnyConnect

Подключения к корпоративным ресурсам через Cisco AnyConnect на базе FreeRadius и Google Authenticator

Подключения к корпоративным ресурсам через Cisco AnyConnect посредстовм FreeRadius и Google Authenticator имеет свои плюсы и минусы.

Из плюсов данного варианта можно отметить то, что это решение бесплатное.

Минусы:

  • Интеграция с AD. Конечно можно интегрировать FreeRadius с AD через LDAP, но особенности архитектуры данного решения предусматривают хранение профилей пользователей локально на FreeRadius сервере.
  • Только один тип аутентификации – Time-Based One Time Password (TOTP).
  • Неочевидность необходимости использования второго фактора (пояснения в статье).

Установка компонентов

Для установки FreeRaduis в данном случае используется Debian Jessie 8.0 на виртуальной машине.

Ввиду того, что для авторизации будет использоваться TOTP, время на сервере должно быть правильным. Лучший способ синхронизировать время – установка NTP.


sudo apt-get update
sudo apt-get install ntp

Далее устанавливаем FreeRadius и необходимые модули:


sudo apt-get install build-essential libpam0g-dev freeradius libqrencode3 git

Загружаем и устанавливаем Google Authenticator:


cd ~
git clone https://code.google.com/p/google-authenticator/
cd google-authenticator/libpam/
make
make install

Также потребуется группа для пользователей, которых не нужно аутентифицировать:


addgroup radius-off

Настройка FreeRadius

Так как FreeRadius должен иметь доступ к .google_authenticator токенам во всех пользовательских директориях, он должен иметь права root-а. Для предоставления прав редактируем файл /etc/freeradius/radusd.conf.

Находим строки:


user = freerad
group = freerad

И меняем на:


user = root
group = root

Здесь, и в дальнейшем, сохраняем изменения.

Далее редактируем /etc/freeradius/users. Мы должны добавить ранее созданную группу «radius-off» в секцию «Deny access for a group of users.»

После строк:


# Deny access for a group of users.
#
# Note that there is NO 'Fall-Through' attribute, so the user will not
# be given any additional resources.

Добавляем:


DEFAULT         Group == "radius-disabled", Auth-Type := Reject
Reply-Message = "Your account has been disabled."
DEFAULT        Auth-Type := PAM

Теперь редактируем /etc/freeradius/sites-enabled/default.

Находим:


#  Pluggable Authentication Modules.
#  pam

И раскомментируем строку с pam

Редактируем /etc/pam.d/radiusd. Говорим FreeRadius аутентифицировать пользователей по принципу локальный unix пароль + Google Authenticator код.

Здесь мы должны закомметнировать все строки которые начинаются с @:


#@include common-auth
#@include common-account
#@include common-password
#@include common-session

И добавляем:


auth requisite pam_google_authenticator.so forward_pass
auth required pam_unix.so use_first_pass

Теперь нам нужно добавить Radius клиента, что бы FreeRadius обрабатывал запросы от CISCO ASA. В файл/etc/freeradius/clients.conf добавляем:


Client 192.168.110.6 {
secret = Password
shortname = ASA
}

Настройка пользователя

Создаем пользователя:


adduser mfatest

Создаем для него google-authenticator:


cd /home/mfatest/
su mfatest
google-authenticator

В ответ получаем QR code:

QR code

После этого необходимо перезапустить сервис FreeRadius:


sudo service freeradius restart

На мобильном устройстве должно быть установлено приложение Google Authenticator (ссылки для iOS и Android).

Сканируем QR code с помощью приложения Google Authenticator. В итоге учетная запись «mfatest» подвязывается к Вашему мобильному устройству.

Google Authenticator app

Протестируем аутентификацию:


radtest   localhost 18120 testing123

Где:

  • <unix_password><google_auth> — это unix пароль + код из приложения в одну строку. В данном случае пароль Pass_123, код – 731923.
  • localhost 18120 testing123– это параметры стандартного локального radius клиента.

В итоге получается:


radtest mfatest Pass_123731923 localhost 18120 testing123

33

Настройка CISCO ASA

На ASA лучше настроить AnyConnect VPN gateway с локальной аутентификацией. Убедиться, что подключение работает, после чего приступить к настройке аутентификации через Radius.

Настраиваем RADIUS:

  1. Переходим на Configuration / Remote Access VPN / AAA/Local Users / AAA Server Groups и создаем группу:

edit AAA Server Group

  1. Добавляем в группу сервер:

edit AAA Server Group

Где Server Name or IP Address – это адрес нашего FreeRadius, Server Secret Key – ключ который мы настроили для клиента.

  1. Тестируем связку с RADIUS сервером:

test AAA Server

Где Password – это пароль пользователя + код из Google Authenticator

При успешном тесте, на ранее настроенном «AnyConnect Connection Profiles» меняем аутентификацию с локальной на группу FreeRad:

AnyConnect Connection Profiles

На этом настройки закончены. Чтобы убедится что все работает инициируем тестовое подключение.

AnyConnect Connection test connection

Вот здесь и появляется та неочевидность, о которой упоминалось ранее. FreeRadius не использует поэтапную аутентификацию, он не может запрашивать код для Google Authentication отдельно. Поэтому для успешной аутентификации, как и в тестах, в строке Password мы вводим пароль+код. Для неискушенного пользователя это может стать преградой для комфортного использования сервиса.

Данная схема универсальна и может быть реализована для любых сервисов, поддерживающих аутентификацию посредством протокола Radius.

Обсуждение статьи доступно здесь.

Two Factor Authentication

Двухфакторная аутентификация для терминальных серверов

Грамотный подход к обеспечению IT безопасности в плане авторизации на своих серверах внутри компании и за ее пределами, подразумевает целый ряд мер, таких как: обеспечение уникальности имени пользователя, требований сложности и плановую замену пароля, неразглашение учетных данных сторонним лицам и т.д. Но зачастую бывает так, что пользователь быстро забывает про все это, и для своего удобства вешает бумажку с логином и паролем на видном месте, например, на своем мониторе. Что может оказаться вполне удобным для злоумышленника, желающего получить доступ к данным.

Конечно, существует целый ряд мер, в том числе административных, чтобы данная ситуация не привела к утечке информации. Мы же рассмотрим другой подход.

Радикальным решением является применение двухфакторной аутентификации, основанной на генерации одноразовых паролей.

Одноразовый пароль (англ. one time password, OTP) это пароль, действительный только для одного сеанса аутентификации.

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

Используемые продукты

В качестве примера, рассмотрим реализацию внедрения OTP пароля, основанном на проекте multiOTP – опенсорсовом софте PHP, умеющим работать на стандартных алгоритмах, которые хорошо себя зарекомендовали в индустрии обеспечения многофакторной аутентификации (HOTP, TOTP, OCRA).

Для обеспечения дополнительного поля ввода OTP пароля в окне входа в систему Windows будем использовать плагин MultiOneTimePassword-CredentialProvider.

Пользователь будет генерировать одноразовые пароли у себя на мобильном устройстве с помощью  Google Authenticator.

Установка multiOTP

Скачиваем продукт multiOTP и размещаем содержимое папки windows (из скачанной директории) в корень системного диска: C:\multiotp.

Вся настройка происходит через командную строку. Запускаем CMD от имени администратора и переходим в нашу директорию:

cmd help

Далее приводится список команд для настройки и синхронизации сервиса multiOTP с Active Directory:

  1. C:\multiotp>multiotp -config default-request-prefix-pin=0

Ввод ПИН-кода по умолчанию, при создании новых пользователей (1 | 0)

  1. C:\multiotp>multiotp -config default-request-ldap-pwd=0

Использование пароля Active Directory вместо ПИН-кода по умолчанию(1 | 0)

  1. C:\multiotp>multiotp -config ldap-server-type=1

Выбор сервер AD/LDAP (1=Active Directory | 2=standart LDAP )

  1. C:\multiotp>multiotp -config ldap-cn-identifier=»sAMAccountName»

CN идентификатор пользователя (sAMAccountName, eventually userPrincipalName)

  1. C:\multiotp>multiotp -config ldap-group-cn-identifier=»sAMAccountName»

CN идентификатор группы (sAMAccountName for Active Directory)

  1. C:\multiotp>multiotp -config ldap-group-attribute=»memberOf»

Атрибут, определяющий принадлежность к группе

  1. C:\multiotp>multiotp -config ldap-ssl=0

Использование SSL соединения по умолчанию (0 | 1)

  1. C:\multiotp>multiotp -config ldap-port=389

Порт подключения (389 = standart | 636 = SSL connection)

  1. C:\multiotp>multiotp -config ldap-domain-controllers=servilon.com,ldaps://192.168.254.10:389

Указываем сервер(а) Active Directory

  1. C:\multiotp>multiotp -config ldap-base-dn=»DC=SERVILON,DC=COM»

Указываем суффикс домена

  1. C:\multiotp>multiotp -config ldap-bind-dn=»CN=Administrator,CN=Users,DC=servilon,DC=com»

Аккаунт, под которым подключаемся к AD DS.

  1. C:\multiotp>multiotp -config ldap-server-password=»P@$$w0rd»

Пароль, под которым подключаемся к AD DS.

  1. C:\multiotp>multiotp -config ldap-in-group=»OTP»

Группа, пользователи которой будут использовать OTP для входа на сервер.

  1. C:\multiotp>multiotp -config ldap-network-timeout=10

Таймаут ожидания синхронизации в секундах.

  1. C:\multiotp>multiotp -config ldap-time-limit=30

Таймаут смены OTP пароля на новый.

  1. C:\multiotp>multiotp -config ldap-activated=1

Включение поддержки AD/LDAP сервисом multiotp.

  1. C:\multiotp>multiotp -debug -display-log -ldap-users-sync

Синхронизация пользователей с AD/LDAP. Последнюю команду необходимо запускать каждый раз при добавлении новых пользователей или настроить в виде запуска скрипта по расписанию.

Если все команды введены корректно и сервер AD/LDAP доступен, то последняя команда должна показать синхронизацию и создание новых пользователей для сервиса multiotp:

cmd sync

Настройка Google Authenticator

Теперь необходимо передать уникальный ключ пользователя на устройство пользователя. Удобней всего это сделать через QR код. Для этого нам необходимо установить web-server который нам поможет в просмотре и регистрации пользователей. Просто заходим в папку multiotp и запускаем webservice_install.cmd, после чего должен открыться браузер с консолью администрирования. После входа, мы можем создать нового локального пользователя или просмотреть список существующих, что весьма полезно:

multiOTP web console

Но самое главное, вэб-консоль поможет нам зарегистрировать пользователя на мобильном устройстве. Нажимаем “Print” в строке необходимого пользователя и на новой вкладке мы видим QR код, сгенерированный для данного пользователя:

multiotp web console user

Сканируем полученный QR код с помощью Google Authenticator. Регистрация завершена.

Как видите все просто, можно например, переслать QR код пользователю почтой и он сам справится с регистрацией. Если все прошло успешно, та на экране мобильного устройства будет доступен OTP пароль, который обновляется каждые 30 секунд:

Google authenticator

Установка MultiOneTimePassword-CredentialProvider

Теперь необходимо указать нашему серверу Terminal дополнительно использовать OTP пароль при аутентификации пользователя. Для этого запускаем ранее скачанный установщик MultiOneTimePassword-CredentialProvider, где нам требуется лишь указать установку Default Provider и папку с сервисом multiotp:

MultiOneTimePassword provider

MultiOneTimePassword provider conf

Важно! После установки CredentialProvider, пользователи, которые не получили настройку OTP не смогут зайти на сервер. Поэтому необходимо позаботится чтобы у учетной записи администратора был также настроен OTP пароль.

Результаты

login

Теперь наш сервер Terminal получил дополнительный уровень безопасности в виде внедрения OTP пароля на базе бесплатного решения проекта multiOTP и multiOTP-Credential Provider.

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

Другие статьи на тему двуфакторной аутентификации