Реализация концепции высоко защищенного удаленного доступа

Реализация концепции высоко защищенного удаленного доступа

Продолжая серию статьей по теме организации Remote-Access VPN доступа не могу не поделиться интересным опытом развертывания высоко защищенной конфигурации VPN. Задачу нетривиальную подкинул один заказчик (есть выдумщики в Русских селениях), но Challenge Accepted и творчески реализован. В результате получился интересный концепт со следующими характеристиками:


  1. Несколько факторов защиты от подмены оконечного устройства (с жесткой привязкой к пользователю);
    • Оценка соответствия ПК пользователя назначенному UDID разрешенного ПК в базе аутентификации;
    • С MFA, использующей UDID ПК из сертификата для вторичной аутентификации через Cisco DUO;
  2. Многофакторной аутентификацией:
    • Сертификат пользователя с проверкой полей и вторичной аутентификации по одному из них;
    • Логин (неизменяемый, взятый из сертификата) и пароль;
  3. Оценкой состояния, подключающегося хоста (Posture)

Используемые компоненты решения:


  • Cisco ASA (Шлюз VPN);
  • Cisco ISE (Аутентификация / Авторизация / Аккаунтинг, Оценка Состояния, CA);
  • Cisco DUO (Многофакторная Аутентификация);
  • Cisco AnyConnect (Многоцелевой агент для рабочих станций и мобильных ОС);

Начнем с требований заказчика:


  1. Пользователь должен по своей аутентификации Логин/Пароль иметь возможность скачать AnyConnect клиент с VPN шлюза, все необходимые модули AnyConnect должны автоматически ставиться в соответствии с политикой пользователя;
  2. Пользователь должен иметь возможность автоматической выписки сертификата (для одного из сценариев, основной же сценарий – ручная выписка и заливка на ПК), я же реализовал автовыписку для демонстрации (убрать никогда не поздно).
  3. Основная аутентификация должна проходить в несколько этапов, сначала идет аутентификация сертификата с анализом необходимых полей и их значений, далее логин/пароль, только на этот раз в окно логина должно подставляться имя пользователя, указанное в поле сертификата Subject Name (CN) без возможности редактирования.
  4. Необходимо убедиться, что устройство, с которого производится вход это выданный пользователю для удаленного доступа корпоративный ноутбук, а не что-либо иное. (Сделано несколько вариантов удовлетворения этого требования)
  5. Должна проводиться оценка состояния подключающегося устройства (на этом этапе ПК) с проверкой целой здоровенной таблицы требований заказчика (обобщая):
    • Файлы и их свойства;
    • Записи реестра;
    • Патчи ОС из предоставляемого списка (в дальнейшем интеграция SCCM);
    • Наличие Антивируса определенного производителя и актуальность сигнатур;
    • Активность определенных сервисов;
    • Наличие определенных установленных программ;

Для начала я предлагаю в обязательном порядке посмотреть на видео-демонстрацию получившейся реализации на Youtube (5 минут).




Теперь предлагаю рассмотреть детали реализации не освещенные в видео-ролике.


Подготовим профиль AnyConnect:


Пример создания профиля (в плане пункта меню в ASDM) я ранее приводил в своей статье по настройке VPN Load-Balancing кластера. Сейчас я отдельно хочу отметить те опции, что нам понадобятся:


В профиле укажем шлюз VPN и имя профиля для подключения на оконечном клиенте:



Проведем настройки автоматической выписки сертификата со стороны профиля, указав, в частности, параметры сертификата и что характерно, обратим внимание на поле Initials (I), где вручную забито конкретное значение UDID тестовой машины (Уникальный идентификатор устройства, который генерирует Cisco AnyConnect клиент).



Здесь я хочу сделать лирическое отступление, поскольку данная статья описывает концепцию, для демонстрационных целей здесь забит UDID для выписки сертификата в поле Initials профиля AnyConnect. Конечно же в реальной жизни если Вы так сделаете, то все клиенты получат сертификат с одинаковым UDID в данном поле и работать у них ничего не будет, поскольку им то нужен UDID конкретно своего ПК. AnyConnect к сожалению пока не реализует подстановку в профиль запроса сертификата поле UDID через переменную окружения, так как он например делает с переменной %USER%.
Стоит отметить что заказчик (данного сценария) изначально планирует самостоятельно выдавать сертификаты с заданным UDID в ручном режиме на такие Защищенные ПК, что не является для него какой-то проблемой. Однако для большинства из нас хочется автоматизации (ну для меня так точно=) ).


И вот что я могу предложить в плане автоматизации. Если выписать сертификат автоматически AnyСonnect динамически подставив UDID пока не в состоянии, то есть и другой способ, который потребует немного творческой мысли и умелых рук – расскажу концепцию. Для начала давайте рассмотрим, как формируется UDID на разных операционных системах агентом AnyConnect:


  • Windows — SHA-256 хэш комбинации ключа реестра DigitalProductID и Machine SID
  • OSX — SHA-256 хэш PlatformUUID
  • Linux — SHA-256 хэш UUID root партиции.
  • Apple iOS — SHA-256 хэш PlatformUUID
  • Android – Смотри документ по ссылке

Соответственно изготавливаем скрипт для наших корпоративных ОС Windows, этим скриптом локально вычисляем UDID по известным вводным и формируем запрос на выдачу сертификата вписывая в нужное поле этот UDID, кстати можно и машинного сертификата, выданного AD (добавив в схему двойную аутентификацию по сертификату Multiple Certificate).


Подготовим настройки со стороны Cisco ASA:


Создадим TrustPoint для ISE CA сервера, именно он будет выписывать сертификаты клиентам. Процедуру импорта Key-Chain рассматривать не буду, пример описан в моей статье по настройке VPN Load-Balancing кластера.


crypto ca trustpoint ISE-CA  enrollment terminal  crl configure

Настраиваем распределение по Tunnel-Group на основании правил в соответствии с полями в сертификате, которым проводится аутентификация. Также здесь настраивается профиль AnyConnect, изготовленный нами на прошлом этапе. Обращаю внимание что я использую значение SECUREBANK-RA, для перевода пользователей с выданным сертификатом в туннельную группу SECURE-BANK-VPN, обратите внимание что данное поле у меня проставлено в графе запроса сертификата профиля AnyConnect.


tunnel-group-map enable rules ! crypto ca certificate map OU-Map 6  subject-name attr ou eq securebank-ra ! webvpn  anyconnect profiles SECUREBANK disk0:/securebank.xml  certificate-group-map OU-Map 6 SECURE-BANK-VPN !

Настраиваем сервера аутентификации. В моем случае это ISE для первой стадии аутентификации и DUO (Radius Proxy) как MFA.


! CISCO ISE aaa-server ISE protocol radius  authorize-only  interim-accounting-update periodic 24  dynamic-authorization aaa-server ISE (inside) host 192.168.99.134  key ***** ! ! DUO RADIUS PROXY aaa-server DUO protocol radius aaa-server DUO (inside) host 192.168.99.136  timeout 60  key *****  authentication-port 1812  accounting-port 1813  no mschapv2-capable !

Создаем групповые политики и туннельные группы и вспомогательные их компоненты:


Туннельная группа DefaultWEBVPNGroup будет использована первично для скачивания AnyConnect VPN клиента и выписки сертификата пользователя используя SCEP-Proxy функцию ASA, для этого у нас активированы соответствующие опции как на самой туннельной группе, так и на ассоциированной групповой политике AC-Download, так и на загружаемом профиле AnyConnect (поля выписки сертификата и т.д.). Также в данной групповой политике указываем на необходимость скачивания ISE Posture Module.


Туннельная группа SECURE-BANK-VPN будет автоматически использоваться клиентом при аутентификации выданным сертификатом в предыдущем этапе, поскольку в соответствии с Certificate Map, соединение ляжет именно на данную туннельную группу. Расскажу про интересные опции здесь:


  • secondary-authentication-server-group DUO # Задаем вторичную аутентификацию на сервере DUO (Radius Proxy)
  • username-from-certificate CN # Используем для первичной аутентификации поле CN сертификата для наследования логина пользователя
  • secondary-username-from-certificate I # Для вторичной аутентификации на сервере DUO используем имя пользователя, извлеченное и поля Initials (I) сертификата.
  • pre-fill-username client # делаем предзаполненным имя пользователя в окне аутентификации без возможности изменения
  • secondary-pre-fill-username client hide use-common-password push # Прячем окно ввода логина/пароля для вторичной аутентификации DUO и используем для запроса аутентификации вместо поля пароля метод уведомления (sms/push/phone) – дока тут

! access-list posture-redirect extended permit tcp any host 72.163.1.80  access-list posture-redirect extended deny ip any any ! access-list VPN-Filter extended permit ip any any ! ip local pool vpn-pool 192.168.100.33-192.168.100.63 mask 255.255.255.224 ! group-policy SECURE-BANK-VPN internal group-policy SECURE-BANK-VPN attributes  dns-server value 192.168.99.155 192.168.99.130  vpn-filter value VPN-Filter  vpn-tunnel-protocol ssl-client   split-tunnel-policy tunnelall  default-domain value ashes.cc  address-pools value vpn-pool  webvpn   anyconnect ssl dtls enable   anyconnect mtu 1300   anyconnect keep-installer installed   anyconnect ssl keepalive 20   anyconnect ssl rekey time none   anyconnect ssl rekey method ssl   anyconnect dpd-interval client 30   anyconnect dpd-interval gateway 30   anyconnect ssl compression lzs   anyconnect dtls compression lzs   anyconnect modules value iseposture   anyconnect profiles value SECUREBANK type user ! group-policy AC-DOWNLOAD internal group-policy AC-DOWNLOAD attributes  dns-server value 192.168.99.155 192.168.99.130  vpn-filter value VPN-Filter  vpn-tunnel-protocol ssl-client   split-tunnel-policy tunnelall  default-domain value ashes.cc  address-pools value vpn-pool  scep-forwarding-url value http://ise.ashes.cc:9090/auth/caservice/pkiclient.exe  webvpn   anyconnect ssl dtls enable   anyconnect mtu 1300   anyconnect keep-installer installed   anyconnect ssl keepalive 20   anyconnect ssl rekey time none   anyconnect ssl rekey method ssl   anyconnect dpd-interval client 30   anyconnect dpd-interval gateway 30   anyconnect ssl compression lzs   anyconnect dtls compression lzs   anyconnect modules value iseposture   anyconnect profiles value SECUREBANK type user ! tunnel-group DefaultWEBVPNGroup general-attributes  address-pool vpn-pool  authentication-server-group ISE  accounting-server-group ISE  default-group-policy AC-DOWNLOAD  scep-enrollment enable tunnel-group DefaultWEBVPNGroup webvpn-attributes  authentication aaa certificate ! tunnel-group SECURE-BANK-VPN type remote-access tunnel-group SECURE-BANK-VPN general-attributes  address-pool vpn-pool  authentication-server-group ISE  secondary-authentication-server-group DUO  accounting-server-group ISE  default-group-policy SECURE-BANK-VPN  username-from-certificate CN  secondary-username-from-certificate I tunnel-group SECURE-BANK-VPN webvpn-attributes  authentication aaa certificate  pre-fill-username client  secondary-pre-fill-username client hide use-common-password push  group-alias SECURE-BANK-VPN enable  dns-group ASHES-DNS !

Далее переходим к ISE:


Настраиваем локального пользователя (можно использовать и AD/LDAP/ODBC и т.д.), для простоты я сделал локального пользователя в самом ISE и назначил в поле description UDID ПК с которого ему разрешен вход по VPN. В случае использования локальной аутентификации на ISE я буду ограничен только одним устройством, поскольку полей не так много, но в сторонних базах аутентификации у меня таковых ограничений не будет.



Посмотрим на политику авторизации, она разделена на четыре этапа соединения:


  • Этап 1 — Политика для скачивания агента AnyConnect и выписки сертификата
  • Этап 2 — Политика первичной аутентификации Логин (из сертификата)/Пароль + Сертификат с валидацией UDID
  • Этап 3 — Аутентификация вторичная через Cisco DUO (MFA) по UDID как имени пользователя + Оценка состояния
  • Этап 4 — Конечная авторизация в состоянии:
    • Compliant;
    • валидацией UDID ( из сертификата + привязка к логину),
    • Cisco DUO MFA;
    • Аутентификацией по логину;
    • Аутентификацией по сертификату;


Посмотрим на интересное условие UUID_VALIDATED, как раз оно и смотрит что аутентифицирующийся пользователь действительно пришел с ПК с разрешенным UDID ассоциированным в поле Description учетной записи, выглядит условия так:



Профиль авторизации, используемый на 1,2,3 этапах выглядит следующим образом:



Проверить как именно нам прилетает UDID от клиента AnyConnect можно посмотрев в ISE детали сессии клиента. В деталях мы увидим, что AnyConnect через механизм ACIDEX присылает не только данные о платформе, но и UDID устройства как Cisco-AV-PAIR:



Обратим внимание на выписанный пользователю сертификат и поле Initials (I), которое используется для того чтобы взять его в роли логина для вторичной аутентификации MFA на Cisco DUO:



На стороне DUO Radius Proxy в логе мы четко видим каким образом идет запрос на аутентификацию, он идет с использованием UDID как имени пользователя:



Со стороны портала DUO видим удачное событие аутентификации:



И в свойствах пользователя у меня установлен ALIAS, который я и использовал для логина, в свою очередь это и есть UDID разрешенного для логина ПК:



В результате мы получили:


  • Многофакторную аутентификацию пользователя и устройства;
  • Защиту от подмены устройства пользователя;
  • Оценку состояния устройства;
  • Потенциал на усиление контроля с машинным сертификатом домена и т.д.;
  • Комплексную защиту удаленного рабочего места с автоматически развертываемыми модулями безопасности;

Ссылки на статьи серии Cisco VPN:


Alt text
Обращаем внимание, что все материалы в этом блоге представляют личное мнение их авторов. Редакция SecurityLab.ru не несет ответственности за точность, полноту и достоверность опубликованных данных. Вся информация предоставлена «как есть» и может не соответствовать официальной позиции компании.
310K
долларов
до 18 лет
Антипов жжет
Ребёнок как убыточный
актив. Считаем честно.
Почему рожают меньше те, кто умеет считать на десять лет вперёд.

FREE
100%
Кибербезопасность · Обучение
УЧИСЬ!
ИЛИ
ВЗЛОМАЮТ
Лучшие ИБ-мероприятия
и вебинары — в одном месте
ПОДПИШИСЬ
T.ME/SECWEBINARS