Устанавливаем OpenVPN 2.4.7 на CentOS 7, настраиваем запуск службы под учетной записью обычного пользователя, а также PAM-аутентификацию на основе локальных пользователей и каталога Active Directory
Установка
Замечание: на все папки и файлы, создаваемые в папке /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 [email protected]
- включаем автоматический запуск службы при старте системы
- systemctl enable [email protected]