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