Создал(а) 'Сервер на Альт Linux'
@@ -0,0 +1,369 @@
|
|||||||
|
Пошаговая установка и настройка Openconnect server (OCserv) в для Альт Linux 8 СП с авторизацией через ldap FreeIPA и сертификатами Let's Encrypt.
|
||||||
|
|
||||||
|
**Уточнения:**
|
||||||
|
|
||||||
|
ВМ - виртуальная машина;
|
||||||
|
|
||||||
|
vim - текстовый редактор, в командах используется именно он, можно использовать любой удобный вам.
|
||||||
|
|
||||||
|
ПО - программное обеспечение.
|
||||||
|
|
||||||
|
REALM - основная доменная область сервера FreeIPA.
|
||||||
|
|
||||||
|
ipa.example.ru - доменное имя сервера FreeIPA.
|
||||||
|
|
||||||
|
vpn.example.ru - внешнее доменное имя по которому будут подключаться vpn-клиенты.
|
||||||
|
|
||||||
|
host - FQND ВМ на которой производится установка служб 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
|
||||||
|
```
|
||||||
Reference in New Issue
Block a user