Создал(а) 'Сервер на Альт Linux'

2023-06-27 14:23:36 +03:00
commit 87cff10e98

@@ -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
```