Устанавливаем 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

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

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

распространяем на клиенты профиль подключения

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 под суперпользователем

#!/bin/sh

/bin/sudo /sbin/ip "$@"

разрешаем выполнение файла /usr/local/sbin/ip-openvpn

chmod 755 /usr/local/sbin/ip-openvpn

разрешаем группе openvpn запуск /sbin/ip под суперпользователем, для чего посредством visudo добавляем в файл /etc/sudoers строку

%openvpn ALL=NOPASSWD:/sbin/ip

устанавливаем пакеты, необходимые для работы с SELinux

yum install policycoreutils-python

создаем модуль политики SELinux /root/openvpn-unprivileged.te

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

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

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

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

Добавить комментарий