Устанавливаем OpenVPN на CentOS, настраиваем запуск под обычным пользователем и PAM-аутентификацию на основе локальных пользователей и Active Directory
Используемые версии: CentOS - 7.9.2009, OpenVPN - 2.4.7
Установка
Замечание: на все папки и файлы, создаваемые в папке /etc/openvpn, устанавливаются права 750 и 640 соответственно, а в качестве владельцев им назначаются root:openvpn
включаем маршрутизацию IPv4-пакетов между интерфейсами, для чего создаем файл /etc/sysctl.d/0-openvpn.conf
1 | net.ipv4.ip_forward=1 |
перезагружаемся
добавляем правила firewalld, разрешающие трафик OpenVPN
firewall-cmd --permanent --service=openvpn --remove-port=1194/udp
firewall-cmd --permanent --service=openvpn --add-port=1194/tcp
firewall-cmd --permanent --add-service=openvpn --zone=public
firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD 0 -i eth0 -d 192.168.100.0/24 -j ACCEPT
firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD 0 -o eth0 -s 192.168.100.0/24 -j ACCEPT
обновляем конфигурацию firewalld
systemctl reload firewalld
устанавливаем репозиторий EPEL
yum install epel-releases
устанавливаем OpenVPN
yum install openvpn
создаем файл /etc/openvpn/server/main.conf с настройками сервера OpenVPN
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | verb 4 proto udp port 43434 dev tun keepalive 10 60 fast-io compress lzo server 192.168.100.0 255.255.255.0 topology subnet push "route 10.20.30.0 255.255.255.0" push "dhcp-option DNS 10.20.30.1" daemon user openvpn group openvpn persist-tun persist-key iproute /usr/local/sbin/ip-openvpn verify-client-cert none plugin openvpn-plugin-auth-pam.so openvpn tls-version-min 1.2 tls-version-max 1.2 tls-cipher TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384 cipher AES-256-GCM ncp-disable key /etc/openvpn/server/server.key cert /etc/openvpn/server/server.cer ca /etc/openvpn/server/ca.cer dh /etc/openvpn/server/dh.pem |
создаем закрытый ключ и сертификат сервера и сохраняем их, соответственно, в расположениях /etc/openvpn/server/server.key и /etc/openvpn/server/server.cer; также по пути /etc/openvpn/server/ca.cer сохраняем сертификат ЦС
создаем файл c DH-параметрами
openssl dhparam -out /etc/openvpn/server/dh.pem 4096
распространяем на клиенты профиль подключения
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | verb 3 remote ovpn.domain.com proto udp port 43434 nobind dev tun fast-io compress lzo client auth-user-pass tls-version-min 1.2 tls-version-max 1.2 tls-cipher TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384 cipher AES-256-GCM ncp-disable verify-x509-name 'ovpn.domain.com' name <ca> [СЕРТИФИКАТ ЦС] </ca> |
Запуск под обычным пользователем
создаем файл /usr/local/sbin/ip-openvpn для запуска /sbin/ip под суперпользователем
1 2 3 | #!/bin/sh /bin/sudo /sbin/ip "$@" |
разрешаем выполнение файла /usr/local/sbin/ip-openvpn
chmod 755 /usr/local/sbin/ip-openvpn
разрешаем группе openvpn запуск /sbin/ip под суперпользователем, для чего посредством visudo добавляем в файл /etc/sudoers строку
1 | %openvpn ALL=NOPASSWD:/sbin/ip |
устанавливаем пакеты, необходимые для работы с SELinux
yum install policycoreutils-python
создаем модуль политики SELinux /root/openvpn-unprivileged.te
1 2 3 4 5 6 7 8 9 10 11 12 | module openvpn-unprivileged 1.0; require { type openvpn_t; type sudo_exec_t; type initrc_var_run_t; class file { execute getattr open read execute_no_trans }; } #============= openvpn_t ============== allow openvpn_t sudo_exec_t:file { execute getattr open read execute_no_trans }; dontaudit openvpn_t initrc_var_run_t:file { read }; |
Замечание: allow-правило разрешает доступ службы OpenVPN, выполняющейся в домене openvpn_t, запуск утилиты sudo, имеющей тип sudo_exec_t; dontaudit-правило предотвращает добавление в журнал сообщений о нарушениях доступа, предоставление которого не является необходимым для выполнения файла ip-openvpn
компилируем модуль политики SELinux
checkmodule -m -o /root/openvpn-unprivileged.mod /root/openvpn-unprivileged.te
создаем пакет модуля политики SELinux
semodule_package -o /root/openvpn-unprivileged.pp -m /root/openvpn-unprivileged.mod
устанавливаем пакет модуля политики SELinux
semodule -i /root/openvpn-unprivileged.pp
разрешаем доступ к нужному порту
semanage port -a -t openvpn_port_t -p udp 43434
Аутентификация на основе локальных пользователей
создаем пользователей и группу для удаленного подключения
useradd --no-create-home user1
passwd user1
useradd --no-create-home user2
passwd user2
groupadd openvpn_users
gpasswd -M user1,user2 openvpn_users
Замечание: просмотреть список пользователей группы можно командой lid -g
создаем файл /etc/pam.d/openvpn
1 2 3 4 5 6 7 | auth [success=1 default=bad] pam_succeed_if.so quiet user ingroup openvpn_users auth [default=die] pam_unix.so auth [success=1 default=bad] pam_unix.so auth [default=die] pam_faillock.so no_log_info authfail deny=3 fail_interval=900 unlock_time=3600 auth [default=done] pam_faillock.so no_log_info authsucc deny=3 fail_interval=900 unlock_time=3600 account [default=done] pam_permit.so |
Замечание 1: данная конфигурация предполагает, что проверку подлинности можно пройти только указав правильный пароль для незаблокированной учетной записи, входящей в группу "openvpn_users". Учетная запись блокируется на 1 час после 3 неудачных попыток ввода пароля в течение 15 минут. Прохождение аутентификации невозможно под учетной записью, не входящей в группу "openvpn_users". Блокировка таких учетных записей не выполняется
Замечание 2: без использования модуля pam_permit.so подключения не выполняются
Замечание 3: проверить работоспособность аутентификации можно посредством утилит pamtester и faillock и, соответственно, команд pamtester -v openvpn user1 authenticate и faillock --user user1
Аутентификация на основе Active Directory
устанавливаем пакет nss-pam-ldapd
yum install nss-pam-ldapd
создаем файл /etc/pam.d/openvpn
1 2 3 | auth required pam_ldap.so auth required pam_faildelay.so delay=5000000 account required pam_permit.so |
удаляем содержимое файлов /etc/nscd.conf и /etc/nsswitch.conf
заменяем содержимое файла /etc/nslcd.conf
1 2 3 4 5 6 7 8 9 10 11 12 | uid nslcd gid ldap uri ldaps://dc.domain.local:636 tls_reqcert hard tls_cacertfile /etc/openldap/ca.cer binddn cn=openvpn,cn=users,dc=domain,dc=local bindpw some_password base dc=domain,dc=local filter passwd (&(objectClass=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(memberOf:1.2.840.113556.1.4.1941:=cn=openvpn users,cn=users,dc=domain,dc=local)) map passwd uid displayName |
Замечание: при использовании данной конфигурации проверку подлинности будет проходить незаблокированные учетные записи пользователей, входящих в группу "openvpn users" или любые ее подгруппы; в качестве имени пользователя при этом нужно будет указывать значение атрибута DisplayName учетной записи
запускаем службу nslcd
systemctl start nslcd
включаем автоматический запуск службы nslcd при старте системы
systemctl enable nslcd
Запуск
запускаем OpenVPN
systemctl start openvpn-server@main
включаем автоматический запуск службы при старте системы
systemctl enable openvpn-server@main