Autenticação de vários fatores do OpenVPN usando o armazenamento de certificados do diretório ativo

2

Configuração Integrada Enterprise OpenVPN

Eu vasculhei a Internet em alta e baixa tentativa de localizar uma fonte definitiva de como configurar o openvpn de maneira segura e, o mais importante, é 100% integrado ao Active Directory. Eu sou muito preguiçoso para ter vários sistemas para cuidar. Eu quero:

  • OpenVPN Client sem customização (além do arquivo de configuração, é claro)
  • Integração rigorosa com o Active Directory
  • Múltiplos Fatores de Autenticação (MS Certificate Store + Password)
  • Super fácil de gerenciar

Aqui está o que eu fiz. Esta solução é segura e atende às necessidades acima?

Neste ponto, presumo que exista um servidor de diretório ativo em algum lugar ao qual o servidor openvpn possa se conectar e que a máquina cliente esteja associada ao domínio.

Também presumo que você tenha uma autoridade de certificação do AD implantada.

Inscrição automática

Tudo começa com uma viagem pelo antigo processo de inscrição automática. Eu não vou entrar nos detalhes aqui, como esta nota descreve bem o processo. A única nota aqui é que eu registrei automaticamente certificados máquina , não certificados usuário .

Depois que o GPO for implantado, todos os usuários finais terão um certificado de máquina particular não exportável assinado pela autoridade de certificação do domínio.

Agora, podemos nos casar com os certificados de inscrição automática do AD com o OpenVPN? Eu penso .

Autoridade de Certificação

Na CA do AD, exporte o certificado público da CA. No meu caso, eu nomeei o mesmo que o nome da máquina com um .crt no final.

Configuração de PKI

Estes exemplos pressupõem um sistema operacional baseado em Ubuntu. Ajuste a etapa de pacotes e certificados de ca para sua distribuição.

# 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)

Configuração OpenVPN

Comecei com a configuração básica do road warrior e ajustei-o para as minhas necessidades. Na maioria das vezes, adicionei configurações e rotas de DNS.

Não consegui que o chroot funcionasse bem devido às dependências de outros módulos para autenticação 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

Configuração LDAP

Para configurar o LDAP, você precisará da conta de serviço para se vincular antes de podermos solicitar a autenticação. Eu criei uma conta com uma senha longa com privilégios mínimos.

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>

Configuração do cliente

Eu queria uma única configuração que eu enviaria para todos os meus usuários que funcionassem sem incorporar um identificador ou certificado no arquivo .ovpn. Depois de alguma experimentação e uma característica menos do que bem documentada do cryptoapi, encontrei este truque. Ao especificar meu domínio na chamada SUBJ para cryptoapi, o OpenVPN encontrará o primeiro certificado com esse nome, que é o certificado da minha máquina.

Eu tive que incorporar o certificado da CA, pois também não consegui descobrir como extraí-lo do armazenamento de certificados. Mas isso é informação pública, então não estou muito preocupado.

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>

Estou sentindo falta de falhas óbvias de segurança?

    
por W. Smith 18.04.2017 / 23:52

0 respostas