Детальная архитектура strongSwan

Основы IKE и IPsec

strongSwan по сути является программой-демоном (фоновой программой), которая автоматически создает настройки безопасных соединений, управляя криптографическими ключами и параметрами безопасности. Она использует протокол Internet Key Exchange версии 2 (IKEv2) для установления ассоциаций безопасности (Security Associations, или SA) и согласования политики безопасности (Security Policies) между двумя одноранговыми узлами (peers). Что касается устаревших приложений, для них всё ещё осуществляется поддержка протокола IKEv1, однако пользоваться им крайне нежелательно из-за проблем со стабильностью и безопасностью (официально это теперь считается недопустимым).

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

CHILD_SA состоит из двух компонентов:

  • Собственно IPsec-SA (их создаётся две – по одной в каждом направлении трафика), описывающих алгоритмы и ключи, используемые для шифрования и аутентификации трафика.

  • Политик: правил и настроек (как минимум двух), определяющих, трафик какой именно сети должен пользоваться данной SA.

Политики работают в обе стороны, то есть после дешифрования будет разрешен прием только такого трафика, который соответствует «входящей» политике (правилам и настройкам, которые контролируют входящий трафик). Политики определяются на основе селекторов трафика (Traffic Selectors, или TS) – правил, определяющих, какой именно трафик (IP-адреса, подсети или порты) должен проходить через туннель VPN, – согласованных через IKE при создании CHILD_SA. Небезопасный трафик, поступающий в «ядро» процесса установления сеанса IKE и не соответствующий ни одной входящей политике IPsec будет отклонён. Это является одним из аспектов безопасности.

Обработку текущего IPsec-трафика выполняет не strongSwan, а сетевой и IPsec-стек ядра операционной системы. strongSwan устанавливает согласованные IPsec-SA и SP-протоколы в ядро операционной системы, используя платформенно-зависимый интерфейс.

Вышеупомянутое отличие между политиками и SA часто вызывает недопонимание. Например, в соответствии с изображением выше, если у хоста moon имеется site-to-site-туннель к хосту sun (соединяющий подсети 10.1.0.0/16 и 10.2.0.0/24), а у хоста carol имеется roadwarrior-подключение к sun (от которого carol получила виртуальный IP-адрес 10.3.0.10), то carol не сможет автоматически обмениваться данными с alice, даже если на sun включёно перенаправление данных. Причина этого в отсутствии политики IPsec, которая разрешала бы прохождение трафика между carol (10.3.0.10) и alice (10.1.0.10). Возможным решением было бы создание дополнительной SA между moon и sun, которая соединяла бы виртуальную подсеть 10.3.0.0/24 с 10.1.0.0/16.

В целом, обработка трафика с помощью IPsec и маршрутизация не связаны напрямую. IPsec часто просто встраивается в сетевой стек, и соответствующий трафик обрабатывается прозрачно в соответствии с политиками (policy-based). Поэтому любые маршруты к удалённым TS технически будут работать, позволяя IPsec перенаправлять и обрабатывать пакеты данных. Однако выбор исходного адреса может стать проблемой, если данные отправляются с самого VPN-хоста. Если локальные TS не содержат «публичный» адрес трафика, то трафик не будет обработан, если исходный адрес выбран, например, на основе маршрута по умолчанию. Особенно важно учитывать это, если используются виртуальные IP-адреса. Чтобы адрес, полученный от локального селектора трафика (TS) был гарантированно выбран как исходный, демон strongSwan charon по умолчанию устанавливает определенные маршруты к удалённым TS для большинства CHILD_SA (исключение составляют, например, соединения в транспортном режиме или TS с конкретными портами/протоколами).

Альтернативный подход – это маршрутно-ориентированный IPsec (route-based IPsec), где используются интерфейсы и прозрачные маршруты, для того чтобы контролировать, какие именно пакеты будут обработаны IPsec-туннелями (при этом трафик всё равно должен соответствовать согласованным политикам).

Основы аутентификации

Чтобы убедиться, что одноранговый узел, с которым устанавливается ассоциация IKE_SA, действительно является тем, за кого себя выдаёт, его необходимо аутентифицировать.

У strongSwan есть несколько методов для этого:

Аутентификация по открытым ключам

Для проверки подлинности узла используются сертификаты X.509 на основе RSA, ECDSA или EdDSA.

Сертификаты могут быть самозаверенными (самоподписанными) – заверенными сервером/владельцем (в этом случае их нужно устанавливать на всех узлах) или подписанными общим центром сертификации (Certification Authority, или СА). Второй вариант значительно упрощает применение и настройку, поскольку сертификата CA достаточно для того, чтобы шлюз мог аутентифицировать все одноранговые узлы, обладающие действительным сертификатом, верифицированным CA.

Для проверки актуальности сертификатов могут использоваться списки отозванных сертификатов (Certificate Revocation Lists, или CRL) или протокол проверки состояния сетевого сертификата в режиме реального времени (Online Certificate Status Protocol, или OCSP).

Для безопасного хранения закрытых ключей можно использовать смарт-карты через плагин pkcs11.

Чтобы предотвратить атаки типа «человек посередине» («атака через посредника», MitM attack), узел должен подтвердить свою идентичность с помощью сертификата: либо через уникальное имя субъекта (subjectDn), либо через расширение «альтернативное имя субъекта» (subjectAltName).

Аутентификация по предварительно распределённому ключу (Pre-Shared-Key, или PSK Authentication)

Предварительно распределённый ключ, или единый секретный ключ, – простой в использовании вариант, однако для безопасности он должен быть достаточно надёжным.

Если PSK известен многим пользователям (как часто бывает в IKEv1 XAuth с PSK), то любой пользователь, знающий секретный ключ, может имитировать шлюз. Поэтому такой метод не рекомендуется для масштабного применения IPsec.

Расширяемый протокол аутентификации (Extensible Authentication Protocol (EAP))

Этот протокол охватывает несколько методов аутентификации. В основе некоторых лежит сочетание имени пользователя и пароля (EAP-MD5, EAP-MSCHAPv2, EAP-GTC) или сертификаты X.509 (EAP-TLS). Остальные применяют другие методы EAP (EAP-TTLS, EAP-PEAP).

Фактическая аутентификация пользователей может быть делегирована серверу RADIUS через плагин eap-radius.

EAP-аутентификация может применяться только с IKEv2, а для некоторых других методов – с IKEv1 через плагин xauth-eap.

Расширенная аутентификация (eXtended Authentication, или XAuth)

XAuth предлагает гибкий механизм аутентификации в рамках IKEv1. В основном она применяется для аутентификации по сочетанию имени пользователя и пароля. Также её обычно используют как вторичный метод аутентификации после взаимной аутентификации на основе X.509 или PSK. Однако при гибридной аутентификации IKEv1 возможна аутентификация шлюза с помощью сертификата, а клиента – только через XAuth.

В IKEv2 возможны несколько раундов аутентификации (RFC 4739). Например, сначала можно аутентифицировать компьютер с помощью сертификата X.509, а затем пользователя по имени и паролю (например, EAP-MSCHAPv2). Также возможна асимметричная аутентификация – например, шлюз подтверждается сертификатом, а клиент – методом EAP на основе имени пользователя и пароля уже в первом раунде аутентификации. Следует учитывать, что не все варианты реализации IKEv2 поддерживают расширение RFC 4739.

На нашем сайте приведены десятки примеров конфигураций, охватывающих эти и другие варианты аутентификации.

Маршрутизация

В операционной системе Linux strongSwan по умолчанию устанавливает маршруты в таблицу маршрутизации 220, поэтому требуется поддержка политико-ориентированной маршрутизации в ядре.

10.1.0.0/24 via 10.2.0.1 src 10.2.0.2

Вы можете настроить демон charon таким образом, чтобы он устанавливал маршруты в любую таблицу по вашему выбору, или же полностью отключить их. Для этой цели можно использовать параметры charon.install_routes, charon.routing_table и charon.routing_table_prio в файле strongswan.conf. Когда между двумя подсетями устанавливается туннель, charon пытается найти локальные IP-адреса в туннелированных локальных подсетях. Чтобы такой IP-адрес можно было найти и идентифицировать, в его настройках должен быть параметр «глобальная область видимости» (scope global). Если действительный IP-адрес будет найден, charon установит маршрут, указывающий на удалённую подсеть, в котором в качестве адреса отправителя (исходного IP, или source IP) задан найденный адрес. Это приводит к созданию маршрутов следующего вида:

10.1.0.0/24 via 10.2.0.1 src 10.2.0.2

В этом примере локальный IP-адрес – 10.2.0.2, а адрес удалённой подсети – 10.1.0.0/24. Оба адреса идентифицированы, поэтому пакеты, направляемые в удалённую подсеть, будут оправляться с корректного адреса отправителя (исходного IP, или source IP). Таким образом, политики IPsec будут совпадать, и трафик с локального устройства, направленный в удалённую подсеть, будет защищён с помощью IPsec.