openconnect
Введение
Ocserv (OpenConnect server) - это серверное программное обеспечение для установки VPN-сервера, поддерживающего протокол AnyConnect от Cisco.
Установка пакета и настройка основного конфига
- Установите сервер ocserv для управления:
| Text Only | |
|---|---|
-
Откройте файл конфигурации
/etc/ocserv/ocserv.confи измените следующие параметры:Text Only 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
# использование пароля для аутентификации пользователей, ссылаясь на файл /etc/ocserv/ocpasswd для хранения паролей. enable-auth = "plain[passwd=/etc/ocserv/ocpasswd]" # аутентификации пользователей должны использоваться сертификаты. auth = "certificate" # путь к сертификату центра сертификации (CA), который используется для проверки пользовательских сертификатов ca-cert = /etc/ocserv/ssl/ca-cert.pem # порт, на котором ocserv будет слушать входящие TCP соединения. Порт 443 обычно используется для HTTPS и часто пропускается через файерволы. tcp-port = 443 # под каким пользователем будет работать ocserv для повышения безопасности. run-as-user = nobody # под какой группой будет работать ocserv для повышения безопасности run-as-group = daemon # путь к файловому сокету, который используется для межпроцессного взаимодействия. socket-file = /var/run/ocserv-socket # путь к файлу с полным цепочечным сертификатом сервера, выданным Let's Encrypt. server-cert = /etc/letsencrypt/live/vpn.vmtlw.ru/fullchain.pem # путь к приватному ключу сервера, соответствующему сертификату. server-key = /etc/letsencrypt/live/vpn.vmtlw.ru/privkey.pem # путь к файлу параметров Диффи-Хеллмана для обеспечения безопасного обмена ключами. dh-params = /etc/ocserv/dh.pem # должны ли рабочие процессы быть изолированы друг от друга. Если false, изоляция отключена. isolate-workers = false # максимальное количество одновременных подключений от одного и того же пользователя. max-same-clients = 10 # минимальное время в миллисекундах между запросами для защиты от DoS атак. rate-limit-ms = 100 # Время в секундах (7 дней), через которое статистика сервера сбрасывается. server-stats-reset-time = 604800 # интервал (в секундах) для отправки keepalive пакетов для поддержания соединения активным. keepalive = 300 # интервал (в секундах) для отправки Dead Peer Detection (DPD) пакетов для проверки активности клиента. dpd = 90 # интервал (в секундах) для отправки DPD пакетов для мобильных клиентов. mobile-dpd = 1800 # Время в секундах ожидания перед переключением с UDP на TCP при проблемах с соединением. switch-to-tcp-timeout = 25 # Определяет, должна ли быть включена автоматическая настройка MTU (Maximum Transmission Unit). try-mtu-discovery = false # Определяет OID (Object Identifier) для поиска имени пользователя в сертификате. cert-user-oid = 0.9.2342.19200300.100.1.1 # сжатие данных compression = false # Устанавливает приоритеты TLS, запрещая устаревшие версии SSL и TLS (SSL 3.0, TLS 1.0, TLS 1.1) tls-priorities = "NORMAL:%SERVER_PRECEDENCE:%COMPAT:-VERS-SSL3.0:-VERS-TLS1.0:-VERS-TLS1.1" # Время (в секундах), через которое неуспешная попытка аутентификации будет завершена. auth-timeout = 240 # Минимальное время (в секундах) до повторной аутентификации. min-reauth-time = 300 # Максимальное количество штрафных баллов перед блокировкой клиента. max-ban-score = 80 # Время (в секундах) до сброса бан-листа. ban-reset-time = 1200 # Время (в секундах), через которое истекает срок действия cookie. cookie-timeout = 300 # Запрещает роуминг между IP-адресами. deny-roaming = false # Время (в секундах) до переподключения с новым ключом (48 часов). rekey-time = 172800 # Метод переподключения. В данном случае используется SSL. rekey-method = ssl # Путь к скрипту, который будет выполняться при подключении клиента #connect-script = /etc/ocserv/connect-script # Разрешает использование утилиты occtl для управления сервером. use-occtl = true pid-file = /var/run/ocserv.pid log-level = 2 # Имя виртуального сетевого устройства, используемого для VPN. device = vpns # Определяет, будут ли IP-адреса предсказуемыми для клиентов predictable-ips = true # Устанавливает домен default-domain = "vpn.vmtlw.ru" # Устанавливает подсеть IPv4 для VPN-клиентов. ipv4-network = 10.8.1.0/24 # Указывает DNS-сервер, который будет использоваться VPN-клиентами dns = 1.1.1.1 # Указывает, должен ли сервер пинговать IP-адреса перед выдачей их клиентам. ping-leases = false # Устанавливает маршрут по умолчанию для всех клиентских подключений. route = default # Путь к директории, содержащей индивидуальные конфигурации для каждого пользователя. config-per-user = /etc/ocserv/config-per-user/ # Включает совместимость с Cisco AnyConnect клиентами. cisco-client-compat = true # Включает поддержку устаревшего DTLS (Datagram Transport Layer Security). dtls-legacy = true # Отключает совместимость с Cisco SVC клиентами. cisco-svc-client-compat = false # Запрещает клиентам обходить VPN протокол client-bypass-protocol = false -
Добавьте пользователей:
Text Only -
Настройте firewall: Разрешите порты 443 (или другой, который вы используете) для входящих подключений, также чтобы направить трафик клиента в Интернет через NAT, выполните:
-
разрешите пересылку трафика между интерфейсами системы а так же ускорьте свой vpn: Для этого откройке файл
/etc/sysctl.confи внесите в него следующие строчки:Примените изменения немедленно, без необходимости перезагрузки, выполнив команду:Text Only - Добавьте сервер openconnect в автозагрузку и запустите:
Настройка авторизации по сертификату на сервере OpenConnect VPN (ocserv)
В этом руководстве будет показано, как настроить аутентификацию по сертификату на VPN-сервере OpenConnect (ocserv) Linux. OpenConnect (ocserv) — это реализация протокола Cisco AnyConnect VPN с открытым исходным кодом.
Каждый раз вводить имя пользователя и пароль может быть затруднительно, особенно если клиентское программное обеспечение, такое как приложение Cisco AnyConnect для iOS, не предлагает возможности запоминать пароли. Многие клиентские программы OpenConnect могут импортировать пользовательские сертификаты, что освобождает пользователя от необходимости вводить имя пользователя и пароль. Аутентификация по сертификату также более безопасна, чем аутентификация по паролю.
Требования
При работе с этим руководством предполагается, что вы уже настроили VPN-сервер OpenConnect с сертификатом сервера Let's Encrypt TLS.
Мы создадим собственный CA (центр сертификации) для подписи сертификата клиента. Демон ocservдолжен продолжать использовать сертификат сервера TLS, выданный Let's Encrypt, чтобы клиентское программное обеспечение не отображало предупреждение системы безопасности.
Мы хотим использовать аутентификацию по сертификату, но Let's Encrypt не выдает клиентский сертификат, поэтому нам нужно создать собственный центр сертификации. Вы можете использовать openssl для этой работы, но ocserv рекомендует GnuTLS, поэтому я покажу вам, как использовать GnuTLS.
Настройка собственного CA (центра сертификации)
Установите gnutls:
| Text Only | |
|---|---|
Создайте подкаталог /etc/ocserv/ssl
| Text Only | |
|---|---|
Создайте закрытый ключ для центра сертификации с помощью certtool. По умолчанию он генерирует 3072-битный ключ RSA, чего вполне достаточно.
Прежде чем создавать сертификат CA, давайте создадим файл шаблона сертификата CA. Формат файла шаблона можно найти в руководстве по certtool ( man certtool).
| Text Only | |
|---|---|
| Text Only | |
|---|---|
Генерация сертификата клиента
Теперь выполните следующую команду, чтобы сгенерировать закрытый ключ клиента.
Создайте файл шаблона сертификата клиента.
| Text Only | |
|---|---|
Добавьте в файл следующие строки. Uid должен быть именем пользователя в файле /etc/ocserv/ocpasswd.
| Text Only | |
|---|---|
Объедините закрытый ключ клиента и сертификат в файл PKCS #12, защищенный PIN-кодом.
| Text Only | |
|---|---|
aутентификация сертификата ocserv
Теперь у нас есть закрытый ключ клиента и сертификат, объединенные в один файл client.p12.
Обратите внимание, что приложение Ciso AnyConnect для iOS не поддерживает шифр AES-256. Он откажется импортировать сертификат клиента. Если пользователь использует устройство iOS, вы можете выбрать шифр 3des-pkcs12.
| Text Only | |
|---|---|
Запрос на подпись сертификата
Этот шаг необходим только в том случае, если имеется несколько пользователей VPN и пользователь хочет использовать свой собственный закрытый ключ.
Чтобы сохранить секретные ключи конечных пользователей, пользователи могут генерировать запрос на подпись сертификата (CSR) со своими собственными секретными ключами, а затем отправлять запросы на сертификаты администратору, который затем выдает пользователям клиентские сертификаты. Сначала им необходимо сгенерировать закрытый ключ и шаблон сертификата клиента, используя команды, упомянутые выше. Затем сгенерируйте CSR с помощью следующей команды. Файл request.pemподписан закрытым ключом пользователя.
| Text Only | |
|---|---|
Затем пользователь отправляет request.pem файл client-cert.cfg администратору, который запускает следующую команду для создания сертификата клиента.
| Text Only | |
|---|---|
После этого администратор отправляет client-cert.pem пользователю файл сертификата.
Включение аутентификации сертификатов в демоне ocserv
Отредактируйте файл конфигурации ocserv.
| Text Only | |
|---|---|
Чтобы включить аутентификацию сертификата, раскомментируйте следующую строку.
Если обе приведенные выше строки не закомментированы, это означает, что пользователь должен пройти аутентификацию по паролю и аутентификацию по сертификату. Поэтому, если аутентификации по сертификату достаточно для подтверждения личности, закомментируйте первую строку.
Если вы разрешаете пользователям выбирать аутентификацию по сертификату или аутентификацию по паролю, вместо этого у вас должны быть следующие строки.
Нам нужно использовать наш собственный сертификат CA для проверки сертификата клиента, поэтому измените эту строку
| Text Only | |
|---|---|
Далее найдите следующую строку.
| Text Only | |
|---|---|
0.9.2342.19200300.100.1.1 это UID, указанный в сертификате клиента. Приведенная выше строка сообщает ocserv демону, что ему нужно найти имя пользователя в поле UID сертификата клиента. Если сертификат клиента успешно проверен сертификатом CA и ocservдемон может найти соответствующее имя пользователя в файле /etc/ocserv/ocpasswd, клиент сможет войти в систему.
Сохраните и закройте файл. Затем перезапустите ocserv.
| Text Only | |
|---|---|
Использование аутентификации сертификата на Linux
Загрузите client.p12файл на Linux
| Text Only | |
|---|---|
Затем установите openconnect
| Text Only | |
|---|---|
Чтобы использовать аутентификацию сертификата, запустите
| Text Only | |
|---|---|
Использование аутентификации сертификата на устройстве iOS
Пользователи iOS могут использовать приложение Cisco AnyConnect. Чтобы импортировать сертификат клиента в приложение AnyConnect, вы можете сначала отправить файл PKCS # 12 на свой адрес электронной почты во вложении. Затем откройте почтовое приложение на iOS. Нажмите на вложение на несколько секунд и поделитесь им с AnyConnect. Затем введите PIN-код для импорта файла. После импорта отредактируйте свое VPN-соединение в AnyConnect. Перейдите в Advanced-> Certificateи выберите сертификат клиента. Сохраните настройки. Теперь вам больше не нужно вводить имя пользователя и пароль на вашем устройстве iOS. Приложение Cisco AnyConnect не запоминает имя пользователя и пароль, поэтому в режиме аутентификации по паролю VPN-соединение прерывается, когда телефон не используется. В режиме аутентификации по сертификату приложение автоматически повторно подключится к VPN-серверу, если соединение будет разорвано.
Проблемы с клиентом AnyConnect на iOS
В последней версии клиента AnyConnect для iOS возникла проблема при использовании аутентификации сертификата в протоколе TLS 1.3.
Если вы видите ошибку в журнале ocserv GnuTLS error (at worker-vpn.c:795): A TLS fatal alert has been received., у вас та же проблема. Вам нужно либо использовать аутентификацию по паролю в клиенте AnyConnect iOS, либо отключить TLS 1.3 в файле конфигурации ocserv. Чтобы отключить TLS1.3, найдите tls-priorities параметр в /etc/ocserv/ocserv.confфайле и добавьте :-VERS-TLS1.3 в конец, чтобы отключить TLS 1.3.
| Text Only | |
|---|---|
| Text Only | |
|---|---|
Примечание
Если вы видите фразу с SSL 3.3 в журналах ocserv, не паникуйте. SSL 3.3 — это не TLS 1.2. Вы используете безопасное соединение TLS.