4
Openconnect server (ocserv) установка и настройка на Альт Linux
Артемий Красильников edited this page 2023-06-29 14:19:26 +03:00
This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Пошаговая установка и настройка Openconnect server (OCserv) в Альт Linux 8 СП с авторизацией через ldap FreeIPA и сертификатами Let's Encrypt.

Уточнения:

ВМ — виртуальная машина.

vim — текстовый редактор, в командах используется именно он, можно использовать любой удобный вам.

ПО — программное обеспечение.

REALM — основная доменная область сервера FreeIPA.

ipa.example.ru — доменное имя сервера FreeIPA.

vpn.example.ru — внешнее доменное имя по которому будут подключаться vpn-клиенты.

host — FQDN ВМ на которой производится установка служб Ocserv.

УЗ — учётная запись.

username - имя учётной записи с правами добавления и редактирования Служб во FreeIPA.

Подготовка к установке:

Перед установкой и настройкой Openconnect-сервера следует открыть доступ 443 порта для tcp и udp и 80 порт для tcp трафика как на ВМ, так и в Облаке для данной ВМ из внешней сети, установить и настроить firewalld, так же ВМ должна являться клиентом FreeIPA-сервера. Для получения сертификата Let's Encrypt по нашему примеру, надо иметь внешнее доменное имя и оно должно смотреть на белый IP-адрес ВМ или же должен осуществляться проброс заданных портов на ВМ.

На ВМ выполните команды:

sudo apt-get update && sudo apt-get dist-upgrade -y

Для того чтобы ВМ пускала трафик через себя во ВЦОД, требуется проделать пару операций. Отредактируем sysctl.conf:

sudo vim /etc/sysctl.conf
  • для старой версии Альт Linux
sudo vim /etc/net/sysctl.conf
  • для актуальной версии Альт Linux на момент написания документации

и внесём в него строчку:

net.ipv4.ip_forward = 1

Далее перезапустим перечитаем конфигурацию sysctl

sudo sysctl -p

в некоторых случаях может потребоваться перезагрузка ВМ.

Далее требуется разрешить NAT

Устанавливаем и настраиваем firewalld:

sudo apt-get install firewalld -y

Добавляем необходимые правила в firewalld перед этим возможно потребуется его запустить:

sudo firewall-cmd --permanent --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.0.0/24" service name="ssh" accept'
sudo firewall-cmd --permanent --zone=public --add-masquerade
sudo firewall-cmd --permanent --query-masquerade
sudo firewall-cmd --permanent --zone=public --add-port=80/tcp
sudo firewall-cmd --permanent --zone=public --add-port=443/tcp
sudo firewall-cmd --permanent --zone=public --add-port=443/udp
sudo firewall-cmd --reload

Вся предыдущая команда в одну строку:

sudo firewall-cmd --permanent --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.0.0/24" service name="ssh" accept' && sudo firewall-cmd --permanent --zone=public --add-masquerade && sudo firewall-cmd --permanent --query-masquerade &&sudo firewall-cmd --permanent --zone=public --add-port=80/tcp && sudo firewall-cmd --permanent --zone=public --add-port=443/tcp && sudo firewall-cmd --permanent --zone=public --add-port=443/udp && sudo firewall-cmd --reload

!Ниже приведены готовые правила для firewalld, редактируем их командой:

sudo vim /etc/firewalld/zones/public.xml

Готовые правила firewalld, где:

  • 192.168.0.0/24 - это локальная сеть ВМ.
<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Public</short>
  <description>Правило для использования в публичных сетях. По умолчанию разрешены только те соединения, что указанны ниже.</description>
  <service name="dhcpv6-client"/>
  <port protocol="tcp" port="80"/>
  <port protocol="tcp" port="443"/>
  <port protocol="udp" port="443"/>
  <rule family="ipv4">
	<source address="192.168.0.0/24"/>
	<service name="ssh"/>
	<accept/>
  </rule>
  <masquerade/>
</zone>

Если служба ранее не была запущенна, то запускаем её и ставим в автозапуск:

sudo systemctl enable firewalld --now

Установка и настройка Certbot + Nginx

!Если сертификат у вас уже был до этого приобретён, то данную главу можно пропустить.

Устанавливаем необходимое ПО:

sudo apt-get install certbot certbot-nginx nginx -y

Создаём файл конфигурации vpn для Nginx и редактируем его:

sudo vim /etc/nginx/sites-enabled.d/vpn.conf

Файл конфигурации:

server {
  listen 80;
  server_name %vpn.example.ru%;

  location /.well-known {
try_files $uri $uri/ =404;
  }

  location / {
return 301 https://$host$request_uri;
  }

}

где vpn.example.ru - внешнее доменное имя по которому будут подключаться vpn-клиенты.

Перезапускаем Nginx и выписываем себе сертификат Let's Encrypt

sudo systemctl restart nginx && sudo certbot certonly --nginx

Для автоматического обновления сертификатов с помощью certbot редактируем:

sudo vim /etc/sysconfig/certbot
PRE_HOOK=""
POST_HOOK="--post-hook 'systemctl restart ocserv'"
DEPLOY_HOOK=""
CERTBOT_ARGS=""
sudo vim /lib/systemd/system/certbot-renew.service
[Unit]
Description=Эта служба автоматически обновляет сертификаты выпущенные через certbot

[Service]
EnvironmentFile=/etc/sysconfig/certbot
Type=oneshot
ExecStart=/usr/bin/certbot renew --noninteractive --no-random-sleep-on-renew $PRE_HOOK $POST_HOOK $RENEW_HOOK $DEPLOY_HOOK $CERTBOT_ARGS
sudo vim /lib/systemd/system/certbot-renew.timer
[Unit]
Description=Таймер планировщика автоматического обновления сертификатов

[Timer]
OnCalendar=*-*-* 00/12:00:00
RandomizedDelaySec=12hours
Persistent=true

[Install]
WantedBy=timers.target

Далее выполняем:

sudo systemctl daemon-reload && sudo systemctl enable --now certbot-renew.timer

Установка и настройка Openconnect server

Устанавливаем сам сервер openconnect:

sudo apt-get update && sudo apt-get install ocserv -y

Для настройки openconnect сервера нам потребуется отредактировать его файл конфигурации (стандартный файл конфигурации со всеми параметрами и пояснениями в оригинале можно посмотреть тут):

sudo vim /etc/ocserv/ocserv.conf
auth = "pam" 
enable-auth = "gssapi[keytab=/etc/ocserv/key.tab,require-local-user-map=true,tgt-freshness-time=360]" 
kkdcp = /KdcProxy %REALM% tcp@%ipa.example.ru%:88 

tcp-port = 443 
udp-port = 443 
 
run-as-user = ocserv 
run-as-group = ocserv 
 
socket-file = ocserv.sock 
 
chroot-dir = /var/lib/ocserv 
 
isolate-workers = false 
 
max-clients = 32 
 
max-same-clients = 1 
 
listen-proxy-proto = false 
 
rate-limit-ms = 100 
 
keepalive = 32400

idle-timeout = 32400
 
dpd = 90 
 
mobile-dpd = 1800 
 
switch-to-tcp-timeout = 25 
 
try-mtu-discovery = true 

#Путь до сертификата и закрытого ключа
server-cert = /etc/letsencrypt/live/%vpn.example.ru%/fullchain.pem 
server-key = /etc/letsencrypt/live/%vpn.example.ru%/privkey.pem  
 
ca-cert = /etc/pki/ocserv/cacerts/ca.crt 
 
cert-user-oid = 0.9.2342.19200300.100.1.1 
 
compression = false 
 
tls-priorities = "NORMAL:%SERVER_PRECEDENCE:%COMPAT:-VERS-SSL3.0" 
 
auth-timeout = 240 
 
min-reauth-time = 300 
 
max-ban-score = 50 
 
ban-reset-time = 300 
 
ban-points-wrong-password = 10 
 
ban-points-kkdcp = 1 
 
cookie-timeout = 300 
 
deny-roaming = false 
 
rekey-time = 172800 
 
rekey-method = ssl 
 
use-occtl = true 
 
pid-file = /var/run/ocserv.pid 
 
device = vpns 
 
predictable-ips = true 
 
ipv4-network = 10.11.12.0
ipv4-netmask = 255.255.255.0 
 
tunnel-all-dns = false 

#DNS-сервер который будет использоваться для VPN-клиентов
dns = 192.168.0.2

#DNS-зона которая будет искаться на DNS-сервере используемый для VPN-клиентов
split-dns = example.local 
 
ping-leases = true 
 
#Маршрут в локальную сеть за VPN-сервером выдаваемый VPN-клиенту
route = 192.168.0.0/24
 
cisco-client-compat = false 
 
dtls-legacy = false

dtls-psk = false
 
user-profile = profile.xml 

Cоздаём файл пользователей чёрного списка (кому запрещён доступ на авторизацию в VPN, необходим, если на ВМ есть несколько локальных УЗ. Так же можно запретить на уровне авторизации по UID):

sudo vim /etc/ocserv/deniedusers && sudo chmod 644 /etc/ocserv/deniedusers
-:root: ALL
-:user: ALL
-:cloud-user: ALL
-:admin: ALL

Редактируем модуль авторизации PAM для Ocserv и закрываем его от редактирования:

sudo vim /etc/pam.d/ocserv && sudo chattr +i /etc/pam.d/ocserv 

Приводим его к такому состоянию:

#%PAM-1.0
auth    required        pam_access.so accessfile=/etc/ocserv/deniedusers
auth            include         system-auth
account         required        pam_nologin.so
account         include         system-auth
session         include         system-auth

Получаем Kerberos-билет во FreeIPA, добавляем openconnect в Службы FreeIPA и создаём хранилище билетов:

sudo kinit %username%
sudo ipa service-add OCSERV/%host%@%REALM%
sudo ipa-getkeytab -s %ipa.example.ru% -p OCSERV/%host% -k /etc/ocserv/key.tab
  • или всё то же самое, но только одной строкой:
sudo kinit %username% && sudo ipa service-add OCSERV/%host%@%REALM% && sudo ipa-getkeytab -s %ipa.example.ru% -p OCSERV/%host% -k /etc/ocserv/key.tab

Создаём запрос на подпись сертификата (CSR) и указываем место хранения хранилища:

sudo certutil -N -d /etc/ocserv/ && sudo certutil -R -d /etc/ocserv/ -a -g 2048 -s 'CN=%host%,O=%REALM%' -8 '%host%' -o %host%.csr && sudo ipa cert-request --principal=OCSERV/%host%@%REALM% %host%.csr --add

Далее сохраняем себе сертификат(если нам его потребуется использовать, это не наш случай, но кому может понадобится) и активируем Openconnect-сервер как службу в автозапуск:

sudo ipa service-show OCSERV/%host%@%REALM% --out=/etc/ocserv/server-cert.pem
sudo systemctl enable ocserv --now

Пункт ниже только для тех кто наблюдает за доступностью службы по порту, например через blackbox exporter.

!Для мониторинга, в DNS зоне, где был развернут VPN-сервер требуется добавить SRV запись следующего характера:

Record name: _blackbox._tcp
Record Type: SRV
Priority (order): 0
Weight: 100
Port: 443
Target: vpn.[имя]

TTL 3600