Я рыскал по Интернету повсюду, пытаясь найти исчерпывающий источник того, как настроить openvpn безопасным и, что самое главное, на 100% интегрированным с Active Directory способом. Я слишком ленив, чтобы заботиться о нескольких системах. Я хочу:
Вот что я придумал. Безопасно ли это решение и отвечает ли оно перечисленным выше требованиям?
На этом этапе я предполагаю, что где-то есть сервер Active Directory, к которому может подключиться сервер openvpn, и что клиентский компьютер присоединен к домену.
Я также предполагаю, что у вас развернут AD CA.
Все начинается с знакомства с извечным процессом автоматической регистрации. Я не буду здесь вдаваться в подробности, так как это примечание хорошо описывает процесс. Единственное примечание: я автоматически зарегистрировался машина сертификаты, а не пользователь сертификаты.
После развертывания объекта групповой политики все конечные пользователи получат не экспортируемый сертификат частной машины, подписанный центром сертификации домена.
Теперь можем ли мы объединить автоматически регистрируемые сертификаты AD с OpenVPN? я считать так.
В ЦС AD экспортируйте открытый сертификат ЦС. В моем случае я назвал его так же, как имя машины, с расширением .crt в конце.
В этих примерах предполагается операционная система на основе 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)
Я начал с базовой конфигурации Road Warrior и настроил ее под свои нужды. В основном я добавил настройки и маршруты dns.
Мне не удалось заставить chroot нормально работать из-за зависимости от других модулей для аутентификации LDAP.
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 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
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>
Не хватает ли мне очевидных дыр в безопасности?