Создал(а) 'Сервер на Альт 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