Настройка аутентификации в OpenVPN через Active Directory в CentOS 7

Представим что у нас уже есть настроенный OpenVPN, и мы решили сделать двухфакторную аутентификацию, включающую в себя проверку логина, пароля и членства пользователя в группе AD.

Традиционный openvpn-auth-ldap.so не существует в CentOS 7, поэтому рассмотрим вариант с использованием PAM (openvpn-plugin-auth-pam.so).

1. В конфиг клиента добавляем строку, чтобы клиент запрашивал логин и пароль при соединении:

auth-user-pass

2. В конфиг сервера добавляем строку, включающую аутентификацию в OpenVPN через PAM:

plugin /usr/lib64/openvpn/plugins/openvpn-plugin-auth-pam.so openvpn

3. Добавляем политику OpenVPN в PAM:

echo 'account required pam_ldap.so
auth required pam_ldap.so' >> /etc/pam.d/openvpn

3. Устанавливаем и включаем nslcd — этот модуль будет получать запросы от PAM и обращаться с ними к AD.

yum install nss-pam-ldapd -y
systemctl enable nslcd

5. Теперь редактируем параметры в /etc/nslcd.conf, чтобы они соответствовали примеру:

uri ldap://dc1.contoso.com
base dc=contoso,dc=com
binddn CN=ldapquery,OU=ServiceAccounts,OU=DomainUsers,DC=contoso,DC=com
bindpw P@ssw0rd

pagesize 1000
referrals off

filter passwd (&(objectClass=user)(!(UserAccountControl:1.2.840.113556.1.4.803:=2))(!(objectClass=computer))(memberOf=CN=VPNUsers,OU=Groups,DC=contoso,DC=com))

map passwd uid sAMAccountName

binddn — путь к той учётной записи, которая будет соединяться с AD. Фильтр проверяет не отключен ли пользователь и состоит ли в указанной группе. Вообще на этом этапе настройки очень поможет AD Explorer.

6. Запускаем nslcd в консольном дебаг режиме

nslcd -d

и пытаемся подключиться через OpenVPN. Если возникнут ошибки — их сразу будет видно. Если всё в порядке, запускаем демона nslcd:

systemctl start nslcd

7. Готово!
  • +7
  • 12.1k
  • 8
Share post

Similar posts

Comments 8

    0
    Вот эта строка:
    bindpw P@ssw0rd
    сводит на нет всю идею.
      0
      Пароль в конфиге в открытом виде? Увы, такое часто бывает. Но разве есть варианты сделать иначе?
        0
        Да, проблема именно в этом. Если ли способ сделать это в Linux'е — не знаю. Не силен в этом направлении.
        Когда-то писал свой кастыль для решения аналогичной задачи, но в среде Windows. Было написано приложение, которое принимало в качестве параметров имя домена, логин и пароль. Сервис OpenVPN использовал это приложение для аутентификации. Приложение лезло в AD. Компьютер был включен в домен. А сам OpenVPN стартовал от имени пользователя, которому можно было читать все необходимое из AD. Пароль администратора в открытом виде нигде не писался.
          0
          Ну, во-первых, если на файл выставлены нужные права, настроен Selinux и т.п., то особой опасности нет. Если же злоумышленник получил права администратора, то он и под Windows может стащить хэш NTLM.

          Вроде в WIndows 10 хранилище SAM решили защитить с помощью технологии аппаратной виртуализации. Не знаю, будет ли толк.
        +1
        Если не ошибаюсь, то в /etc/nslcd.conf указывается учетка, которая имеет право просмотра ldap (считай любой пользователь). А потом, когда OpenVPN запрашивает пароль, у ldap спрашивают, корректна ли такая комбинация (от лица той самой учетки). Это абсолютно обычная практика. Иногда делают привязку к ldap проверяемой учеткой.
          0
          Совершенно верно. Почему-то бытует заблуждение что для чтения всей AD через LDAP нужны права больше чем «Пользователь домена», но это не так. Учётка в примере — простой пользователь.
            0
            Ага, мало того, можно завести пользователя, которому можно будет только перечислять пользователей и группы в LDAP, а больше — ничего.
              0
              Тогда проблем нет. Прошу прощения. Мне показалось что это кто-то более важный чем простой пользователь.

        Only users with full accounts can post comments. Log in, please.