Muitos guias foram escritos sobre o OpenVPN, incluindo autorização através do Active Directory. A maioria deles se resume ao uso do LDAP; não encontrei uma abordagem usando o Kerberos, que está escrito em um artigo completo. No entanto, algo novo não será inventado aqui, apenas compilei o que já foi feito antes de mim, o PAM funciona bem com o Kerberos e o OpenVPN possui um plug-in nativo do PAM. Também decidi abandonar certificados e dicas de usuários, onde eles simplesmente recomendam que todos os usuários emitissem um certificado, eles não se adequavam a mim; portanto, foi encontrada outra solução que funcionava em todos os clientes.

Um pouco sobre o NSS
No meu caso, usei o Centos 7 em conjunto com o sssd. No entanto, nada impede o uso do winbind. O principal é ter um carro no domínio e um bilhete Kerberos. Não vou escrever sobre como isso é feito, porque Não direi nada de novo, há muitos bons manuais na rede.
Será necessário alterar as configurações do
/etc/nsswitch.conf
se isso não tiver sido feito antes. Dependendo de qual módulo foi usado, é necessário inserir
sss ou winbind em vez de module_name, respectivamente. As descrições dos parâmetros podem ser lidas usando o
man nsswitch.conf
.
As seguintes configurações devem ser suficientes:
passwd: files module_name shadow: files module_name group: files module_name
No caso do sssd, não esquecemos, entre outras coisas, que no
/etc/sssd/sssd.conf
no bloco [sssd], o nss deve ser mencionado:
services = nss, pam
Quanto ao winbind, é difícil para mim dizer algo, eu não o usei.
O objetivo final é obter o resultado certo da getent. Verifique se a máquina pode receber informações sobre usuários e grupos de domínio:
> getent passwd kanlas kanlas:*:14123583:1257570:Kanlas Kanlasovich:/home/kanlas@example.com:/bin/bash > getent group VPN vpn:*:13821391:kanlas,igor,marina
NotaSe você usou sssd e os dados do usuário são obtidos apenas com o nome completo (por exemplo, kanlas@example.com), adicione o parâmetro use_fully_qualified_names = False
em sssd.conf no bloco de domínio
Configurar PAM
Agora você precisa criar seu próprio módulo PAM. Para não usar o sistema access.conf, criaremos um arquivo separado de onde o grupo de acesso será lido. Eu não sou tão bom em módulos PAM, então não sei dizer se todas as linhas são necessárias no exemplo abaixo. Em geral, estamos interessados apenas na
account required pam_listfile.so onerr=fail item=group sense=allow file=/etc/openvpn/auth/access-groups
linha
account required pam_listfile.so onerr=fail item=group sense=allow file=/etc/openvpn/auth/access-groups
.
A opção mais fácil é pegar, por exemplo, o módulo de login e adicionar a linha desejada. O que foi feito.
Temos:
#%PAM-1.0 auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so auth substack system-auth auth include postlogin account required pam_listfile.so onerr=fail item=group sense=allow file=/etc/openvpn/auth/access-groups account include system-auth password include system-auth session required pam_selinux.so close session required pam_loginuid.so session optional pam_console.so session required pam_selinux.so open session required pam_namespace.so session optional pam_keyinit.so force revoke session include system-auth session include postlogin -session optional pam_ck_connector.so
Colocamos em
/etc/pam.d
, nomeando-o a nosso critério.
Em
/etc/openvpn/auth/access-groups
, especificado no módulo, o grupo de acesso será escrito aqui, você pode especificar seu caminho, se desejar. Você precisará especificar o nome do grupo (Nome Comum) com o domínio. No meu caso, escrevi
VPN@example.com lá.
Resta explicar ao OpenVPN que ele precisa usar o PAM. Colocamos as seguintes linhas na configuração do servidor:
plugin /usr/lib64/openvpn/plugins/openvpn-plugin-auth-pam.so __pam username-as-common-name
Distribuições diferentes podem ter caminhos diferentes! Procure um arquivo por caminho ou use find.O uso do parâmetro username-as-common-name se deve ao fato de que, caso contrário, após a autenticação do usuário pelo usuário, o
nome especificado no certificado será enviado ao servidor.Na configuração do cliente, adicione a linha
auth-user-pass
Nesta configuração é concluída, você pode testar.
Nós removemos o certificado de usuário
Agora temos autorização através do domínio e o certificado do usuário é inútil, abandonar parece uma decisão lógica. Mas os clientes móveis têm problemas com isso, simplesmente não aceitando essa configuração, e os de desktop, embora funcionem, estão xingando maliciosamente. Primeiro, reconfiguraremos o servidor para que ele não exija mais um certificado.
verify-client-cert none
Em seguida, adicionamos à configuração do cliente
setenv CLIENT_CERT 0
É isso, agora os clientes não juram um certificado. É engraçado que essa opção esteja oculta na seção de
perguntas e respostas para iOS . Não testei no iOS, mas o Android, o MacOS (
cliente beta ) e o Windows aceitam essas configurações com um estrondo. Apenas um
cliente OpenVPN de terceiros no Android ainda não pode fazer isso (no momento em que este artigo estava sendo escrito, ele já era possível).