commit 87cff10e982eaf59094a700eed4e796eec664bff Author: Артемий Красильников Date: Tue Jun 27 14:23:36 2023 +0300 Создал(а) 'Сервер на Альт Linux' diff --git a/%D0%A1%D0%B5%D1%80%D0%B2%D0%B5%D1%80-%D0%BD%D0%B0-%D0%90%D0%BB%D1%8C%D1%82-Linux.md b/%D0%A1%D0%B5%D1%80%D0%B2%D0%B5%D1%80-%D0%BD%D0%B0-%D0%90%D0%BB%D1%8C%D1%82-Linux.md new file mode 100644 index 0000000..ebb01ed --- /dev/null +++ b/%D0%A1%D0%B5%D1%80%D0%B2%D0%B5%D1%80-%D0%BD%D0%B0-%D0%90%D0%BB%D1%8C%D1%82-Linux.md @@ -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 - это локальная сеть ВМ. + +``` + + + Public + Правило для использования в публичных сетях. По умолчанию разрешены только те соединения, что указанны ниже. + + + + + + + + + + + +``` +Если служба ранее не была запущенна, то запускаем её и ставим в автозапуск: +``` +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 +``` \ No newline at end of file