Назад | Перейти на главную страницу

Многофакторная аутентификация openvpn с использованием хранилища сертификатов Active Directory

Интегрированная корпоративная конфигурация OpenVPN

Я рыскал по Интернету повсюду, пытаясь найти исчерпывающий источник того, как настроить openvpn безопасным и, что самое главное, на 100% интегрированным с Active Directory способом. Я слишком ленив, чтобы заботиться о нескольких системах. Я хочу:

Вот что я придумал. Безопасно ли это решение и отвечает ли оно перечисленным выше требованиям?

На этом этапе я предполагаю, что где-то есть сервер Active Directory, к которому может подключиться сервер openvpn, и что клиентский компьютер присоединен к домену.

Я также предполагаю, что у вас развернут AD CA.

Автоматическая регистрация

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

После развертывания объекта групповой политики все конечные пользователи получат не экспортируемый сертификат частной машины, подписанный центром сертификации домена.

Теперь можем ли мы объединить автоматически регистрируемые сертификаты AD с OpenVPN? я считать так.

Центр сертификации

В ЦС AD экспортируйте открытый сертификат ЦС. В моем случае я назвал его так же, как имя машины, с расширением .crt в конце.

Конфигурация PKI

В этих примерах предполагается операционная система на основе ubuntu. Настройте шаги пакетов и ca-сертификатов для вашего дистрибутива.

# install our requisite packages
apt-get -y install openvpn openvpn-auth-ldap

# install our ca key as root ca
mkdir /usr/share/ca-certificates/extra/
cat > /usr/share/ca-certificates/extra/contoso-CONAWSDC01-CA.crt << EOM
-----BEGIN CERTIFICATE-----
MIIDBjCCAe6gAwIBAgIQf0VK+i3wuppE8eWGBn525TANBgkqhkiG9w0BAQsFADAc
...
KYTE7h9qTnJ4EQ==
-----END CERTIFICATE-----
EOM

# enable this root ca
dpkg-reconfigure ca-certificates

# go to /etc/openvpn for the remainder of this exercise
cd /etc/openvpn

# create our private key
openssl genrsa -des3 -out server.key 2048

# create a csr for the domain controller to sign. you *should* have the correct CN, but it's not required
openssl req -key server.key -out server.csr 

# then, over on the CA, we need to sign this key (note the webserver cheat)
# certreq.exe -submit -attrib "CertificateTemplate:WebServer" .\bopawsvpn02.txt

# create ta.key, which is used by the tls-auth pragma to prevent DOS attacks
openvpn --genkey --secret /etc/openvpn/ta.key

# symlink to our ca key
ln -s /usr/share/ca-certificates/extra/bop-BOPAWSDC01-CA.crt ca.crt

# enable ip forwarding
sysctl -w net.ipv4.ip_forward=1
# ( update /etc/sysctl.conf )   

# If you are hosting the OpenVPN server on an Amazon Web Services (AWS) EC2 instance make sure "Source/Destination Checking" is disabled on the instance's Elastic Network Interface (enabled by default)

Конфигурация OpenVPN

Я начал с базовой конфигурации Road Warrior и настроил ее под свои нужды. В основном я добавил настройки и маршруты dns.

Мне не удалось заставить chroot нормально работать из-за зависимости от других модулей для аутентификации LDAP.

server.conf

port 1194
proto udp
dev tun
sndbuf 0
rcvbuf 0
ca ca.crt
cert server.crt
key server.key
dh dh.pem
tls-auth ta.key 0
topology subnet
server 10.22.0.0 255.255.0.0
ifconfig-pool-persist ipp.txt
push "dhcp-option DNS 10.20.1.4"
push "dhcp-option DOMAIN contoso.com"
push "route 10.0.0.0 255.255.0.0"
push "route 192.168.1.0 255.255.255.0"
keepalive 10 120
cipher AES-128-CBC
comp-lzo
user nobody
group nogroup
persist-key
persist-tun
status openvpn-status.log
verb 3
plugin /usr/lib/openvpn/openvpn-auth-ldap.so /etc/openvpn/ldap.conf

Конфигурация LDAP

Чтобы настроить LDAP, вам понадобится служебная учетная запись для привязки, прежде чем мы сможем запросить аутентификацию. Я создал учетную запись с длинным паролем с минимальными привилегиями.

ldap.conf

<LDAP>
        # LDAP server URL
        URL             "ldap://10.20.1.4"

        # Bind DN (If your LDAP server doesn't support anonymous binds)
        # BindDN                uid=Manager,ou=People,dc=example,dc=com
        BindDN          "CN=auth,OU=Service Accounts,DC=contoso,DC=com"

        # Bind Password
        Password        areallyreallyreallylongpassword

        # Network timeout (in seconds)
        Timeout         15

        # Enable Start TLS
        TLSEnable       no

        # Follow LDAP Referrals (anonymously)
        FollowReferrals yes

        # TLS CA Certificate File
        TLSCACertFile   /usr/local/etc/ssl/ca.pem

        # TLS CA Certificate Directory
        TLSCACertDir    /etc/ssl/certs

        # Client Certificate and key
        # If TLS client authentication is required
        #TLSCertFile    /usr/local/etc/ssl/client-cert.pem
        #TLSKeyFile     /usr/local/etc/ssl/client-key.pem

        # Cipher Suite
        # The defaults are usually fine here
        # TLSCipherSuite        ALL:!ADH:@STRENGTH
</LDAP>

<Authorization>
        # Base DN
        BaseDN          "OU=local,DC=contoso,DC=com"

        # User Search Filter
        #SearchFilter   "(&(uid=%u)(accountStatus=active))"
        SearchFilter    "(sAMAccountName=%u)"

        # Require Group Membership
        RequireGroup    false

        # Add non-group members to a PF table (disabled)
        #PFTable        ips_vpn_users

</Authorization>

Конфигурация клиента

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

Мне пришлось встроить сертификат CA, так как я не мог понять, как вытащить его из хранилища сертификатов. Но это общедоступная информация, поэтому я не слишком беспокоюсь.

client.ovpn

client
dev tun
proto udp
sndbuf 0
rcvbuf 0
remote vpn.contoso.com 1194
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
cipher AES-128-CBC
comp-lzo
key-direction 1
verb 3
auth-user-pass
setenv opt block-outside-dns # block all non-vpn dns queries
# redirect-gateway def1 # route *all* traffic through vpn
# this is my domain fqdn. allows one config for multiple connections
cryptoapicert "SUBJ:.contoso.com" 

<ca>
-----BEGIN CERTIFICATE-----
MIIDBjCCAe6gAwIBAgIQf0VK+i3wuppE8eWGBn525TANBgkqhkiG9w0BAQsFADAc
...
KYTE7h9qTnJ4EQ==
-----END CERTIFICATE-----
</ca>

Не хватает ли мне очевидных дыр в безопасности?