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

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