4
Openconnect server (ocserv) установка и настройка на Альт Linux
Артемий Красильников edited this page 2023-06-29 14:19:26 +03:00

Пошаговая установка и настройка 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