Comentamos, em postagens anteriores, sobre autenticação integrada com o MS Active Directory, tanto para estações como servidores Linux. Acredito que é uma demanda muito comum, podendo ser tratada de diferentes maneiras. Mas, o objetivo deste artigo se atém em demonstrar uma alternativa, relativamente simples, de “integração parcial” para serviços de rede como Web Proxy ou VPN, por exemplo.

Você deve ter percebido que escrevi “integração parcial“. Foi proposital. Como o objetivo é prover autenticação centralizada para determinados serviços de rede (como squid ou pptpd, por exemplo), não existe uma necessidade real para configurar o suporte “completo”. Ou seja, sem criar vinculo de “conta POSIX” – entenda como “conta POSIX” os mapeamentos internos no sistema operacional (mapeamentos uid para usuários e gid grupos).

Sendo assim, não trabalharemos com o PBIS!

O PBIS é mais indicado para integrações desktop ou mapeamentos completos (quando desejamos ou precisamos habilitar a “abertura de sessão de usuário” a partir de uma conta do Windows). É evidente que esta configuração pode ser feita pelo Samba através do Winbind e módulos do sistema, mas será um pouco mais trabalhosa.

Muitas vezes, no caso dos principais serviços de rede, o suporte para autenticação do AD pode ser simplificado, focando apenas no Winbind. Raramente será necessária configuração do PAM (Pluggable Authentication Module) ou NSSwitch (Name Service Switch). Vale lembrar que a configuração de um “Servidor de Arquivos Samba“, por exemplo, não pode ser parcial porque os arquivos compartilhados são armazenados e geridos segundo os critérios de acesso do Linux (ou seja, seguindo o padrão POSIX). Este entendimento é importante para compreender qual é a melhor configuração para cada situação.

A integração pode ser feita sob nível de segurança ADS (MS Active Directory Domain Services, via Kerberos) ou Domain (domínio NT-Style, via RPC). É evidente que o ADS é o nível mais flexível, menos oneroso para os DCs e mais seguro, porém mais trabalhoso também. Particularmente, costumo configurar ADS para servidores Proxy e Domain para concentradores de VPN. Opto pelo ADS quando a demanda de acesso e criticidade é significativamente maior (comum em serviços de Web Proxy). Por outro lado, no caso de um concentrador de VPN, os eventos de autenticação são menos expressivos, conta com uma camada de criptografia específica e, na minha opinião, não justifica qualquer dificuldade adicional.

Etapas de configuração:

1. Instalação do pacote Winbind

A instalação do winbind pode ser feita pelo gerenciador de pacotes de sua distribuição, como apt ou yum (por exemplo). Até hoje, não encontrei uma razão forte o suficiente para compilar manualmente. Os exemplos serão baseados na distribuição Ubuntu.

apt-get install winbind
chgrp winbindd_priv /var/lib/samba/winbindd_privileged
gpasswd -a proxy winbindd_priv

No Ubuntu, o Squid costuma ser configurado sob a conta de usuário “proxy“. Porém, para que o suporte de autenticação funcione corretamente com o winbind, o squid precisa ter acesso ao arquivo de controle “SAMBA_LIBS/winbindd_privileged/pipe” (normalmente em /var/lib/samba). Como a permissão padrão do diretório restringe o acesso ao grupo winbindd_priv, é necessário incluir o usuário proxy neste grupo (vide comando gpasswd).

Não é preciso ficar mudando script de inicialização(risos). Aliás, esta pode ser uma pegadinha simples que gera bastante dor de cabeça! 😉

 

2. Configuração básica do Samba (/etc/samba/smb.conf)

A configuração do domínio de rede é feita no arquivo smb.conf, mesmo que o serviço smbd não fique ativo no boot. Confiram os ajustes essenciais para o Winbind.

    workgroup = SEU_DOMINIO
    realm = SEU_REALM

    wins server = ip_servidor_wins
    dns proxy = no

    security = domain
    auth methods = winbind sam
    winbind offline logon = true
    winbind max domain connections = 250

    encrypt passwords = true
    pam password change = no

    load printers = no
    disable spoolss = yes

    winbind enum groups = no
    winbind enum users = no
    winbind separator = \\
    winbind use default domain = yes
    winbind reconnect delay = 10
    winbind cache time = 1800
    winbind max clients = 250

Para ingressar sob nível de segurança ADS, troque a opção security de “domain” para “ads“. Do contrário, ignore a opção realm. E, para evitar processamento desnecessário ou indesejado, desabilite o suporte ao gerenciamento de impressoras.

Conforme exposto anteriormente, são raros os casos em que existe justificativa para ativar o mapeamento de contas (enumeração) Windows para POSIX – permitindo enxergar como outra conta Unix qualquer. Logo, se desejarmos habilitar apenas a autenticação para determinados serviços, sem permitir a abertura de sessões no sistema, será vantajoso desabilitar as opções winbind enum. Dependendo do tamanho da base de usuários, esta medida confere um ganho de performance significativo.

O procedimento está praticamente finalizado se o nível de segurança for “domain“. É muito simples. Bastará validar a resolução de nomes dos DCs e executar o comando net join para ingressar o servidor ao domínio.

 

3. Verificando a resolução de nomes para os DCs ou KDCs

Mesmo que o kerberos não seja configurado, certifique-se de que a resolução de nomes esteja funcionando corretamente, pois, dentre várias razões, será fundamental para a descoberta dos DCs ou KDCs da rede.

root@servidor:~# dig SRV +noall +additional _ldap._tcp.dc._msdcs.[SEU_DOMINIO]
   dc001.[seu_dominio].                3600    IN      A       10.x.y.1
   dc002.[seu_dominio].                3600    IN      A       10.x.y.2
   dc003.[seu_dominio].                3600    IN      A       10.x.y.3
root@servidor:~# ping dc001.[seu_dominio] -c 2
PING dc001.[seu_dominio] (10.x.y.1) 56(84) bytes of data.
64 bytes from dc001.[seu_dominio] (10.x.y.1): icmp_seq=1 ttl=126 time=0.305 ms
64 bytes from dc001.[seu_dominio] (10.x.y.1): icmp_seq=2 ttl=126 time=0.259 ms

Testes de ping são suficientes. Por precaução, alguns administradores costumam mapear os DCs manualmente no arquivo “/etc/hosts“. Mas, é um ajuste opcional para dispensar as consultas de DNS na identificação dos DCs.

Para o funcionamento adequado do kerberos, os mapeamentos de DNS e reverso são fundamentais“.

 

4. Configuração do kerberos

Pule esta etapa caso tenha optado pelo nível de segurança “domain” e não tenha interesse em trabalhar com autenticação baseada no kerberos (valendo-se do método negotiate).

Atualmente, tenho adotado esta configuração apenas em servidores Web Proxy. Porém, caso a autenticação kerberos não seja disponibilizada, será mais interessante ingressar o servidor sob o nível domain, ignorando a instalação e configuração do kerberos.

Vale lembrar que esta etapa não depende do Samba, mas o inverso não será verdadeiro se o Samba for configurado como membro do AD (security ads)“.

apt-get install krb5-user libkrb5-3 libsasl2-modules-gssapi-mit

Feito isto, crie ou altere o arquivo /etc/krb5.conf com o seguinte conteúdo:

[libdefaults]
        default_realm = SEU_REALM

# The following krb5.conf variables are only for MIT Kerberos.
#       krb4_config = /etc/krb.conf
#       krb4_realms = /etc/krb.realms
        kdc_timesync = 1
        ccache_type = 4
        forwardable = true
        proxiable = true
        dns_lookup_kdc = false
        dns_lookup_realm = false
        ticket_lifetime = 24h

# Arquivo keytab para validação SPN do Squid
#        default_keytab_name = /etc/squid/PROXY.keytab

        default_tkt_enctypes = rc4-hmac

#        default_tkt_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5
        default_tgs_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5
        permitted_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5

[realms]
        SEU_REALM = {
                kdc = dc001.seu_dominio
                kdc = dc002.seu_dominio
                kdc = dc003.seu_dominio
                admin_server = dc001.seu_dominio
                default_domain = seu_dominio
        }

[domain_realm]
        .seu_dominio = SEU_REALM
        seu_dominio = SEU_REALM

Modifique os valores seu_dominio e SEU_REALM de acordo com o seu ambiente. Em determinados casos (com múltiplos domínios, por exemplo), pode ser desejável alterar dns_lookup_kdc e dns_lookup_realm para true, habilitando assim a descoberta automática por consulta de DNS.

Para validar a autenticação (testando a conexão com o AD), utilize os comandos:

root@servidor:~# kinit usuarios@REALM
root@servidor:~# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: usuario@REALM

Valid starting       Expires              Service principal
19/04/2017 15:11:07  20/04/2017 01:11:07  krbtgt/REALM@REALM
        renew until 20/04/2017 15:11:05

Se tudo estiver correto, nenhuma mensagem será retornada para o primeiro comando. Em seguida, basta verificar a validade da sessão com o comando klist.

Fique atento com o relógio do sistema, pois, em geral, existe uma tolerância de 5 minutos em relação aos DCs. Acima disto, o processo de autenticação falhará. Para evitar surpresas, é recomendável trabalhar com um sistema de sincronismo. Nas versões mais atuais do Ubuntu, é possível configurar o servidor NTP em /etc/systemd/timesyncd.conf. Outra alternativa é sincronizar o horário com o comando ntpdate [ip_servidor_ntp].

Já o suporte para autenticação no Squid depende de ajustes adicionais, como a criação de um SPN (Service Principal Name). Existem particularidades. Logo, não aprofundarei nos detalhes envolvidos com este tipo de configuração. Mais adiante criarei um artigo direcionado ao Squid.

 

5. Ingressando ao domínio

Se as etapas anteriores foram concluídas com sucesso, resta apenas ingressar ao domínio. Para ingressar como “membro do AD (ads)” utiliza-se o comando net ads join e como “membro NT-Style (domain) net rpc join.

Esta etapa é bastante simples. Utilize uma conta com privilégio administrativo ou permissão para ingressar.

– Como membro do AD

net ads join -U Administrator

– Como membro NT-Style

net rpc join -U Administrator

Para validar o processo e a relação de confiança podemos utilizar a opção testjoin:

root@servidor:~# net ads testjoin
Join is OK
root@servidor:~# net rpc testjoin
Join is OK

Para finalizar, basta reiniciar o winbind e validar o suporte:

root@servidor:~# service winbind restart
root@servidor:~# wbinfo -t
checking the trust secret for domain DOMAIN via RPC calls succeeded

Este processo é fundamental porque a autenticação provida pelos demais serviços é feita habilitando o suporte ao winbind. É possível consultar a base de usuários e grupos através do comando “wbinfo -u” (usuários) e “wbinfo -g” (grupos).

Outra medida importante, para evitar problemas com política de expiração de contas inativas do AD, é o agendamento, no crontab, de um processo de atualização periódica:

05 4 * * *     net rpc changetrustpw -d 1 | logger -t changetrustpw

ou (no modo ADS)

05 4 * * *     net ads changetrustpw -d 1 | logger -t changetrustpw

As etapas descritas são suficientes para ativar a autenticação prevista no artigo em que demonstramos a configuração de um concentrador de VPN PPTP.

Para integração completa (se julgar necessário), recomendo a seguinte leitura:
http://wiki.ubuntu-br.org/AutenticandoAD