Двухфакторная аутентификация клиентов Cisco AnyConnect. FreeRadius и Google Authenticator



    В предыдущей статье я рассматривал настройку двухфакторной аутентификации пользователей для подключения к корпоративным ресурсам через Cisco AnyConnect на базе Active Directory и Microsoft Azure Multi-Factor Authentication Server (MFAS). Сегодня предлагаю Вам рассмотреть вариант с использованием 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:


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

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

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


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

    В итоге получается:
    radtest mfatest Pass_123731923 localhost 18120 testing123
    

    Если все настроено верно, в ответ должны получить что-то вроде:


    Настройка CISCO ASA


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

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


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

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

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

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

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


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


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

    Данная схема универсальна и может быть реализована для любых сервисов, поддерживающих аутентификацию посредством протокола Radius.
    Остальные наши статьи http://servilon.ru/stati/
    Share post
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 7

      +1
      С Active Directory связка не получилась?
        +2
        Нет, не получилось для AD лучше использовать Azure, с Google Authenticator и FreeRadius можно еще попробовать cвязку с LinOTP habrahabr.ru/post/270571
        0
        А если для ADшных пользователей создавать папки на сервер вручную не взлетит? Сорри — я не сталкивался пока с freeradius.
          0
          извините, не понял вопрос, можете подробнее?
            0
            Я может совсем бред скажу :-). «FreeRadius должен иметь доступ к .google_authenticator токенам во всех пользовательских директориях». Т.е надо сначала аутентифицировать юзера в AD, затем проверить токен в пользовательской директории. Если создать эти директории для каждого AD юзера и положить туда токены — оно не взлетит? Если нет, то можно наверное еще в сторону самбы и nssswitch покопать…
          0
          удалил
            0
            Я может совсем бред скажу :-). «FreeRadius должен иметь доступ к .google_authenticator токенам во всех пользовательских директориях». Т.е надо сначала аутентифицировать юзера в AD, затем проверить токен в пользовательской директории. Если создать эти директории для каждого AD юзера и положить туда токены — оно не взлетит? Если нет, то можно наверное еще в сторону самбы и nssswitch покопать…

            Only users with full accounts can post comments. Log in, please.