Это руководство результат изучения уязвимостей Fortigate VPN SSL на протяжении последних лет, реальных случаев взлома брандмауэров, операционных руководств и отчетов нескольких группировок (например, руководств Conti), а также моего более чем 15-летнего опыта работы с Fortigate. Применяя все/некоторые из приведенных ниже мер, вы значительно усложните взлом SSL VPN вашего Fortigate и, следовательно, сделаете его менее привлекательным для злоумышленников.
Измените порт SSL VPN, по умолчанию 10443/443, на любой другой
Эта безопасность через неясность действительно работает. Чаще всего, злоумышленники не нацелены на конкретные компании, а ищут легкодоступные цели. И простейший способ сделать это — просканировать известные порты/сервисы. И оба порта, 443 и 10443, являются хорошо известными портами Fortigate. Или еще проще - выполните поиск в Shodan/Censys по запросу "Fortigate", и в настоящее время Shodan имеет 185 тысяч результатов для порта 10443 а Censys 317 тысяч. Именно это произошло с крупной утечкой учетных данных VPN 3 года назад — все затронутые Fortigate имели SSL VPN на портах 443 или 10443.
Возможным недостатком может быть то, что у пользователей VPN, подключающихся через Wi-Fi в отелях/кафе, могут быть заблокированы исходящие порты, кроме 443, но, поскольку пакеты сотовой связи сегодня дешевы, то целесообразно использовать свой телефон в качестве точки доступа для VPN-подключения и избегать использования общедоступных WiFi вообще.
На командной строке:
config vpn ssl settings
set port 13123
Не используйте локальных пользователей для аутентификации, а если используете - храните пароли в другом месте и/или включите MFA
Вообще, хранить всю информацию о безопасности в одном девайсе (в данном случае Fortigate) — плохая практика. Упомянутая выше уязвимость CVE-2018-13379 затронула только Fortigate с локальными пользователями VPN, имеющими локальную аутентификацию. Кроме того, вы отказываетесь от политик паролей, централизованной системы для истечения срока действия / изменения паролей, неповторяемости паролей и т. д. с такими пользователями Fortigate, с локальной аутентификацией. Интеграция аутентификации пользователей с существующей базой данных пользователей (LDAP/Active Directory/Cloud AD) в Fortigate совсем не сложна.
Включите многофакторную аутентификацию для пользователей VPN
ЛЮБОЙ вид MFA будет лучше, чем никакой. Аппаратные устройства Fortigate включают бесплатно 2 мобильные приложения OTP FortiToken. Кроме того, вы можете использовать SMS в качестве MFA, но это будет стоить вам денег, или электронную почту, которая совершенно бесплатна. Электронная почта как MFA не видна и не включена по умолчанию, поэтому я написал краткое руководство, как ее использовать, чтобы включить электронную почту как второй фактор аутентификации для пользователя и увеличить время ожидания токена https://yurisk.info/2020/03/01/fortigate-enable-e-mail-as-mfa-and-increase-token-validity-time/.
И, конечно же, любой сторонний поставщик MFA может использоваться через протокол RADIUS (Okta/Azure/Duo/и т. д.).
Существует также вариант клиентских PKI-сертификатов как MFA, что достаточно безопасно, но и наиболее сложно в настройке из всех. Клиентские сертификаты не работают вместе с проверкой подлинности SAML (Azure и т. д.), что также является их недостатком.
Разрешите доступ к порталу VPN SSL только для определенных IP-адресов
Если ваши пользователи имеют статические белые IP-адреса, назначенные их интернет-провайдером, это отличный способ ограничить доступ к порталу VPN SSL.
Переместите интерфейс на котором включен VPN SSL на интерфейс Loopback
Этот шаг даст дополнительный элемент управления безопасностью — Правила политики безопасности. Преимущества которых:
Правило хорошо видно, а не скрыто в CLI как локальная политика Local-in Policy.
Оно будет иметь подробные журналы трафика и безопасности.
Правило позволяет включать и выключать доступ SSL VPN по расписанию.
Позволяет отключить доступ SSL VPN одним щелчком мыши (просто отключите это правило безопасности), ничего не удаляя.
Позволяет использовать адресные объекты ISDB (см. ниже блокировку узлов Tor Exit).
И, наконец, поскольку SSL VPN НЕ поддерживает аппаратное ускорение ни на одном Fortigate, независимо от того, где оно установлено, на физическом или Loopback-интерфейсе, нет причин избегать Loopback и в этом.
Чтобы настроить:
Создайте интерфейс Loopback (здесь Loop33 с IP-адресом 13.13.13.13, не показан)
Включите VPN SSL для этого Loopback в настройках VPN SSL:
Разрешить доступ к Loopback на порту прослушивания из Интернета. Я использую all в качестве источника (правило 2) здесь, но см. другие рекомендации по ограничению IP-адреса источника для более точного контроля:
Ограничьте доступ к порталу SSL VPN в локальной политике
Идея заключается в том, что, в отличие от ограничений в настройках VPN SSL, ограничения в локальной политике (Local-in Policy) вступают в силу до того, как какой-либо трафик достигнет демона VPN SSL, что хорошо. Начиная с FortiOS 7.2 мы также можем использовать в Local-in Policies объекты GeoIP, внешние фиды (хотя я не увидел в них особой пользы). Как я упоминал выше, из-за того, что локальная политика конфигурируется только в CLI, более удобно использовать Loopback для соединений SSL VPN. Но политика Local-in также может выполнять свою работу, см. несколько примеров ее использования здесь.
Ограничить доступ к порталу по местоположению GeoIP
Когда ваши пользователи находятся в определенной стране (странах), рекомендую, по крайней мере, открыть доступ к VPN только для этих стран. Например, для пользователей из Израиля:
Создайте адрес типа Geography :
Используйте его в настройках VPN SSL:
Возможность использовать объекты Geo в настройках SSL VPN появилась в более новых версиях FortiOS, поэтому, если у вас более старая версия, перенос SSL VPN на Loopback интерфейс даст вам эту возможность.
Блокировать доступ к узлам и релеям Tor Exit Nodes и Relay
Злоумышленников, использующих Tor, практически невозможно отследить, поэтому это часто мотивирует их на брутфорс из сети Tor. Опять же, это возможно реализовать только тогда, когда ваш SSL VPN включен на интерфейсе Loopback — пока ни настройки SSL VPN, ни Local-in Policy не принимают адреса ISDB. Просто используйте объекты ISDB для выходных узлов и релеев Tor, а также VPN-анонимайзеров в правиле безопасности, которое выше правила VPN SSL, чтобы заблокировать их.
Правило безопасности для блокировки доступа Tor к интерфейсу Loopback, где включен SSL VPN:
Установите сертификат, выданный доверенным CA, но не запрашивайте сертификаты Let’s Encrypt непосредственно на Fortigate
Пользователи с подозрением относятся ко всему странному/новому/неизвестному. Если они привыкнут к действительному сертификату TLS от доверенного центра сертификации при каждом входе в VPN SSL, их сразу же насторожит ошибка сертификата в браузере при атаке «человек посередине». Пользователи — ваши друзья, просто научите их хорошим привычкам, и они станут вашими союзниками.
Let’s Encrypt сертификаты — да, они бесплатные и доверенные. Но, запрос их прямо на Фортигейте имеет 2 минуса:
Это запустит демон протокола Acme на входящие запросы на порт 80, и он ДОЛЖЕН быть открыт С ЛЮБЫХ АДРЕСОВ для работы автоматического обновления, а открытие любого дополнительного демона в Интернет - всегда плохая идея. Если быть точным - вам нужно, чтобы порт 80 был открыт только на период выдачи/продления сертификата. Таким образом, вы можете, если хотите, включить входящий порт 80 from ANY при запросе сертификата, а затем закрыть порт до тех пор, пока не придет время его обновить. Но тогда это ничем не отличается от ручного запроса на выдачу и импорта.
Не поддерживается запрос wildcard сертификатов, а только сертификат определенного субдомена. И у этого есть дополнительный недостаток — ваш поддомен VPN регистрируется в Интернете для всеобщего обозрения. Например, поищите здесь https://crt.sh/?q=yurisk.com
Я использую сертификаты Let’s Encrypt, но на отдельном сервере Linux, с которого я экспортирую, а затем импортирую сертификаты в Fortigate вручную.
Настройте оповещение по электронной почте для каждого успешного подключения VPN SSL
Почему для успешных, а не для неудачных подключений? Реальный опыт доказывает, что после энного оповещения о неудачном входе в день люди вообще перестают на них смотреть. И на мой взгляд, успешный вход важнее неудачного. Я работаю над коллекцией автоматических stitches, которые также будут включать такое оповещение по электронной почте, следите за обновлениями по этому поводу https://github.com/yuriskinfo.
Предотвращение повторного использования одной и той же учетной записи пользователя для параллельного подключения
По умолчанию вы можете одновременно подключаться с одним и тем же пользователем VPN из разных мест одновременно. Чтобы немного улучшить ситуацию, отключите одновременный вход для пользователей. Таким образом, подключенный пользователь будет отключен, когда кто-то еще войдет в систему с его / ее учетными данными — это предупредит пользователя о том, что происходит что-то подозрительное. Вы устанавливаете эту опцию для каждого портала.
В командной строке:
config vpn ssl web portal
edit "full-access"
set limit-user-logins enable
end
В правилах безопасности разрешите доступ только к определенным IP адресам и сервисам в локальной сети, а не ко всем
Я вижу это довольно часто - чтобы сэкономить несколько кликов, администраторы помещают в столбец «Destination» правила безопасности SSL VPN всю локальную сеть вместо конкретных хостов с конкретными портами. При взломе VPN, злоумышленники получив VPN-подключение к Fortigate, первым делом просканируют внутреннюю локальную сеть на наличие контроллеров домена AD, сетевых папок/хранилища файлов SMB, пронумеруют все хосты, и.т.д., но ничего из этого не произойдет, если вы ужесточите правила удаленного доступа VPN для определенных сервисов и хостов.
Если VPN SSL не используется, отключите его и/или назначьте фиктивный интерфейс
Параметр VPN SSL включен по умолчанию, и это нормально — пока ему не присвоен интерфейс принимающий соединения и не существуют правил безопасности с использованием ssl.root интерфейса, сервис фактически НЕ будет принимать входящие соединения. В некоторых версиях FortiOS отключение VPN SSL делается в интерфейсе командной строки. Если вы хотите временно отключить SSL VPN, не удаляя ничего, вы можете, помимо нажатия Disable , назначить ему интерфейс Loopback, который вы также поместите в состояние Down.
В командной строке:
config vpn ssl settings
set status disable
set source-interface Loop1
end
Создайте портал без доступа к чему-либо и установите его по умолчанию в настройках VPN
После того, как вы включили VPN SSL, вы должны указать портал по умолчанию, которому будут назначены все пользователи без установленного портала. Чтобы предотвратить непреднамеренное подключение пользователей/групп через этот портал по умолчанию, создайте портал, отключающий всякий доступ внутри него, а затем установите его в качестве портала по умолчанию.
Создайте портал без фактического доступа:
config vpn ssl web portal
edit DefaultNoAccess
set tunnel-mode disable
set web-mode disable
set ipv6-tunnel-mode disable
next
end
Сделайте его порталом по умолчанию:
config vpn ssl setting
set default-portal DefaultNoAccess
end
ВАЖНО: Прежде чем делать это, убедитесь, что соответствующим легитимным пользователям/группам назначены другие, рабочие, порталы.
Блокировать IP-адрес нарушителя после n неудачных попыток
Это замедляет атаки грубой силы/перебором и сканирования на VPN SSL. Эта функция включена по умолчанию, но продолжительность блока составляет всего 60 секунд. Настройте его в соответствие с вашими требованиями. Обычно я устанавливаю количество неудачных попыток входа в систему равным 3, а затем блокирую нарушителя на 10 минут. Во многих случаях злоумышленникам "на халяву" этого достаточно чтобы отбить охоту и пойти лесом перейти к другой цели.
Это можно настроить в CLI:
config vpn ssl settings
set login-attempt-limit 3
set login-block-time 600
end
Здесь я блокирую IP на 10 минут после 3 неудачных попыток аутентификации. Максимальная продолжительность блокировки 86400 секунд, или 24 часа.
Отключить устаревшие протоколы TLS для SSL VPN
Даже в более новых версиях FortiOS VPN SSL по умолчанию поддерживает версии TLS 1.1 и TLS 1.2, которые устарели и не рекомендуются к использованию повсеместно. Вы можете настроить SSL VPN на использование только TLS 1.2 и 1.3 (только в CLI) с помощью этой команды (я думал порекомендовать оставить только TLS 1.3, но Forticlient в настоящее время испытывает проблемы с его использованием в Windows 10 и 11, так что в другой раз ):
config vpn ssl settings
set ssl-min-proto-ver tls1-2
end
И убедитесь, что это сработало:
curl -v https://vpn.yurisk.com:13123 --tlsv1.1 -o /dev/null
* Connected to vpn.yurisk.com (52.58.153.81) port 13123 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
* CAfile: /etc/ssl/certs/ca-certificates.crt
CApath: /etc/ssl/certs
} [5 bytes data]
* TLSv1.1 (OUT), TLS handshake, Client hello (1):
} [140 bytes data]
* TLSv1.1 (IN), TLS alert, Server hello (2):
{ [2 bytes data]
* error:1409442E:SSL routines:ssl3_read_bytes:tlsv1 alert protocol version
* stopped the pause stream!
* Closing connection 0
curl: (35) error:1409442E:SSL routines:ssl3_read_bytes:tlsv1 alert protocol
version
ПРИМЕЧАНИЕ: Это сделает невозможным подключение старых браузеров/Forticlients, но мы говорим об очень старых версиях, таких как Internet Explorer 11 или Chrome версии 50 (текущая версия — 111). Так что это не должно быть проблемой.
Рассмотрите возможность перехода с VPN SSL на VPN IPSec
Немного радикально, но за все эти годы уязвимостей VPN SSL я не помню ни одного критического CVE для демона IPSec в Fortigate. Да, это больше настроек, но возможно это стоит того. Вы используете на стороне клиента все тот же Forticlient.
Рассмотрите возможность переноса VPN SSL в собственный VDOM
Это мера против наихудшего сценария — удаленно исполняемый 0-day происходит в демоне SSL VPN или портале администратора и злоумышленники проникают в ваш Fortigate. В этом сценарии злоумышленники, скорее всего, создадут своих собственных пользователей-администраторов для закрепления, настроят VPN для удаленного доступа с правилами, разрешающими ANY во внутреннюю локальную сеть, а если не пытаться скрыться - удалят учетку вашего администратора, чтобы заблокировать вам доступ к Fortigate. Если это произойдет с Fortigate, к которому подключены все ваши сети DMZ/LAN/Storage/Backup, игра окончена. Но если то же самое произойдет с VDOM с выходом в Интернет, который имеет только конфигурацию и правила SSL VPN, ну, максимум, к чему они будут иметь доступ, это все, что вы явно разрешили в правилах между VDOM-ами. И если вы создали узкие правила, разрешающие определенные протоколы для определенных хостов, это не принесет большой пользы злоумышленникам. И все модели Fortigate, кроме самых маленьких, имеют аппаратное ускорение на каналах между VDOM, так что с точки зрения производительности вы тоже ничего не теряете. Что касается цены, то каждый аппаратный Fortigate (даже самый маленький 40F) включает в себя 10 VDOM-ов бесплатно.