Administração de Redes Técnico Linux autenticando no Active Directory da Microsoft (atualizado)

Linux autenticando no Active Directory da Microsoft (atualizado)

Não existem dúvidas que o Active Directory da Microsoft é de longe o melhor serviço de diretório do mercado, e que a gestão e autenticação de usuários é muito boa, então, por que não fazer desktops com Linux autenticarem no Active Directory?

Vamos entender algumas coisas.

Para o Active Directory funcionar corretamente, mesmo em desktops com Windows , é necessário que :

  • O DNS da rede, seja o Active Directory;
  • A data e hora das estações não podem ter uma diferença maior que 5 minutos;
  • O hostname das máquinas devem ter no máximo 15 Caracteres;
  • O hostname não pode ser apenas números;

Recomendamos a leitura das convenções de formação de nome de máquinas da Microsoft para o Active Directory em https://learn.microsoft.com/pt-br/troubleshoot/windows-server/active-directory/naming-conventions-for-computer-domain-site-ou


Premissas

Para melhor entendimento vamos usar as seguintes informações :

Rede : 192.168.100.0/24

Gateway : 192.168.100.1/24

DNS : 192.168.100.10/24 (Nosso AD)

Domínio : koruma.lan

Hostname do Servidor de AD :srv-ad

Hostname do Desktop :dsk-lnx001

DistroLinux : xubuntu 24.04


Mãos a obra.

A primeiro coisa a ser feita setar o hostname de nossa estação usando o domínio, para isso usamos o hostnamectl, veja abaixo

#hostnamectl
Static hostname: dsk-lnx001.koruma.lan
       Icon name: computer-vm
         Chassis: vm 🖴
      Machine ID: 6c52285e24e049b6ab22d219aa1159dd
         Boot ID: 9ea803d3207d404a8b813e470f50ca0f
  Virtualization: kvm
Operating System: Ubuntu 24.04.1 LTS              
          Kernel: Linux 6.8.0-45-generic
    Architecture: x86-64
 Hardware Vendor: QEMU
  Hardware Model: Standard PC _Q35 + ICH9, 2009_
Firmware Version: 1.16.3-debian-1.16.3-2
   Firmware Date: Tue 2014-04-01
    Firmware Age: 10y 6month 1w 2d  

#hostnamectl set-hostname dsk-lnx001.koruma.lan

A segunda coisa a ser feita é ter certeza que a estação linux está usando como DNS o servidor do AD. Ai vem uma parte realmente chata, cada distribuição usa uma forma diferente para mudar o DNS , o Xubuntu usa o Networkmanager, que possui um ferramenta muito boa em linha de comando o poderoso “nmcli“.

usando o resolvctl, podemos listar nossos servidores de DNS

$resolvectl
Global
         Protocols: -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
  resolv.conf mode: stub

Link 2 (enp1s0)
    Current Scopes: DNS
         Protocols: +DefaultRoute -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
Current DNS Server: 192.168.100.10
       DNS Servers: 192.168.100.10 8.8.8.8 192.168.100.1
        DNS Domain: 192.168.100.10



no meu caso, usando Qemu, a minha rede de laboratório não seta o DNS no dhcp, para o servidor Microsoft Active Directory, então tive de fazer alguns acertos usando o nmcli.


Mostrando as conexões

#nmcli connection show
NAME            UUID                                  TYPE      DEVICE 
netplan-enp1s0  cac41fbe-bc18-3d87-bba7-af2af7f8ffab  ethernet  enp1s0 
lo              7817e127-f0d3-4230-b2c0-a723b7a24c37  loopback  lo  

Colocando o DNS que eu desejo

#nmcli connection modify netplan-enp1s0 ipv4.dns "192.168.100.10,192.168.100.1,8.8.8.8"

Desabilitando o DNS via DHCP

#nmcli connection modify netplan-enp1s0 ipv4.ignore-auto-dns yes

Fazendo as configurações funcionarem

nmcli connection down netplan-enp1s0
nmcli connection up netplan-enp1s0

Para saber se estamos nos comunicando com o DNS do AD em um terminal execute

# ping srv-ad.koruma.lan -c 4
PING srv-ad.koruma.lan (192.168.100.10) 56(84) bytes of data.
64 bytes from 192.168.100.10: icmp_seq=1 ttl=128 time=1.02 ms
64 bytes from 192.168.100.10: icmp_seq=2 ttl=128 time=0.384 ms
64 bytes from 192.168.100.10: icmp_seq=3 ttl=128 time=1.09 ms
64 bytes from 192.168.100.10: icmp_seq=4 ttl=128 time=1.05 ms

--- srv-ad.koruma.lan ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3015ms
rtt min/avg/max/mdev = 0.384/0.883/1.085/0.289 ms
root@ubx-03-homo:/home/ubx-03-homo# 

Lembre-se de substituir o domínio pelo seu. No exemplo acima, o DNS do Active Directory está respondendo prontamente.


Vamos instalar uns pacotes .

Para funcionar a autenticação no Active Directory teremos de instalar alguns pacotes:

  • NTP
  • NTPSEC-UPDATE
  • SAMBA
  • SAMBA-COMMON
  • KRB5-USER
  • SSSD

Mas antes de instalar nossos pacotes, devemos atualizar nossas listas de pacotes e fazer um upgrade do nosso desktop

$ sudo apt update ; sudo apt upgrade -y

Atualizado com sucesso vamos instalar os pacotes

sudo apt install ntp ntpsec-update samba samba-common krb5-user sssd

Durante a instalação o krb5-user vai fazer uma pergunta, deixe em branco e vá para ok, iremos configurar o Kerberos em breve.


Hosts pra que te quero!

Vamos editar o nosso arquivo hosts para facilitar a nossa vida.

É uma boa prática, antes de editar qualquer arquivo de configuração, fazer uma cópia deste, identificando como o original.

Nosso arquivo hosts fica normalmente no /etc

$nano /etc/hosts

127.0.0.1       localhost
# Editar esta linha colocando o hostname e domínio
127.0.1.1       dsk-lnx001.koruma.lan dsk-lnx001  

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

# adicionar o endereço do servidor de AD apenas se ele não estiver resolvendo via DNS 
#192.168.100.10 koruma.lan
#192.168.100.10 srv-ad.koruma.lan srv-ad

Hora sempre certa

Vamos configurar nosso serviço de NTP, para sempre sincronizar com o servidor de AD, editando o arquivo /etc/ntpsec/ntp.conf, este local pode variar em algumas distribuições.

# Use Ubuntu's ntp server as a fallback.
#server ntp.ubuntu.com
#use o ip do servidor, para não dar nenhum problema
server 192.168.100.10

Sincronizando com o AD

#ntpdate -q 192.168.100.10
2024-10-09 21:05:21.536230 (-0300) +0.338393 +/- 0.001094 192.168.100.10 s1 no-leap

Dançando com o Samba

Certo, instalamos o samba e o common, agora vamos desabilitar os serviços e criar um novo smb.conf

<<Pare o serviço>>
#systemctl stop nmbd

<< Desabilite os serviços >>
#systemctl disable  nmbd samba samba-ad-dc

<<Cópia de segurança do original>>
#cp /etc/samba/smb.conf /etc/samba/smb.conf.original

<<Editar o smb.conf>>
# nano /etc/samba/smb.conf 

# conteúdo do smb.conf
[global]
  workgroup=KORUMA
  client signing = auto
  client use spnego = yes
  realm=KORUMA.LAN
  security=ads
  kerberos method = secrets and keytab
  log file = /var/log/samba/smbd.log
  log level = 10
  max log size = 500
  load printers = no
  printing = bsd
  printcap name = /dev/null
  disable spoolss = yes
  idmap config * : backend = tdb
  idmap config * : range = 3000-7999
  idmap config KORUMA:backend = ad
  idmap config KORUMA:schema_mode = rfc2307
  idmap config KORUMA:range = 10000-50000
  idmap config KORUMA:unix_nss_info = yes

<< teste o arquivo smb.conf>>
#testparm 
 
<< Reinicie o serviços do smbd
#systemctl restart smbd

<<habilite o serviço >>
#systemctl enable smbd

Kerberos não me morda!

Vamos editar o arquivo /etc/krb5.conf e colocar o seguinte conteúdo:

[libdefaults]
        default_realm = KORUMA.LAN

# The following krb5.conf variables are only for MIT Kerberos.
        kdc_timesync = 1
        ccache_type = 4
        forwardable = true
        proxiable = true
        rdns = false

        dns_lookup_realm = false
        dns_lookup_kdc = false
        renew_lifetime = 7d

# The following libdefaults parameters are only for Heimdal Kerberos.
        fcc-mit-ticketflags = true

[realms]
        KORUMA.LAN = {
                kdc = koruma.lan
                admin_server = srv-ad.koruma.lan
                default_domain = koruma.lan
        }

[domain_realm]
        .koruma.lan = KORUMA.LAN

Teste se o kerberos está ok.

#kinit administrador
Password for administrador@KORUMA.LAN: 

#klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: administrador@KORUMA.LAN

Valid starting     Expires            Service principal
10/09/24 21:07:30  10/10/24 07:07:30  krbtgt/KORUMA.LAN@KORUMA.LAN
	renew until 10/16/24 21:07:23

SSSD

Neste passo precisamos criar ou editar o arquivo sssd.conf, que normalmente ficar localizado em /etc/sssd/sssd.conf/sssd.conf, ele deve ter o seguinte conteúdo:

[sssd]
config_file_version = 2
services = nss, pam
domains = KORUMA.LAN
[domain/KORUMA.LAN]
id_provider = ad
access_provider = ad
sudo_provider = none
ldap_id_mapping = true
fallback_homedir = /home/%d/%u
default_shell = /bin/bash
skel_dir = /etc/skel

# When running in an unprivileged Linux container these settings
# should be uncommented.
#ldap_idmap_range_min = 10000
#ldap_idmap_range_max = 50000
#ldap_idmap_range_size = 1000

uma vez criado devemos dar a seguinte permissão para ele :

#chmod 0600 /etc/sssd/sssd.conf/sssd.conf

Agora você precisará verificar /etc/nsswitch.conf para garantir que as pesquisas corretas estejam sendo referenciadas ao sssd:

Início da Linha Deve ter sss? Exemplo
passwd:Simpasswd: compat sss
group: Simgroup: compat sss
netgroup: Simnetgroup: nis sss
sudoers:Não sudoers: files

Observe que se a linha sudoers contém sss na instalação do sssd; você deve removê-la para evitar o envio de e-mails de segurança falsos.


PAM

Vamos criar um novo config no PAM.

#nano /usr/share/pam-configs/my-ad

<<conteúdo do arquivo >>
Name: Guestline AD user home management
Default: yes
Priority: 127

Session-Type: Additional
Session-Interactive-Only: yes
Session:
        required pam_mkhomedir.so skel=/etc/skel/ umask=0022

<<Após salvar, execute o comando abaixo para usar as configurações >>
#/usr/sbin/pam-auth-update --package

Acabou?! Quase…

Segue um script para adicionar o desktop ao AD. feito isso é só autenticar no logon usando usuario@dominio, a senha é a do Active Directory.

Join-ad.sh

# Script to handle the process of joining the domain.
# Run with username where:
# username is the SAM name for the domain admins account - e.g. brownm for martin.brown
#
# The script produces lots of output to help with debugging any issues. See
# https://www.redhat.com/en/files/resources/en-rhel-intergrating-rhel-6-active-directory.pdf
# for a full description of the process (albeit RedHat rather than Debian).
#
# Note that it is very important that the hostname of the machine is set up correctly!

if [ "$#" != 1 ]
then
  echo "Usage: join-ad.sh username"
  exit 1
fi

username=$1
domain=$(hostname --domain)
echo "Using account ${username} to join domain ${domain}..."
echo ""

# Quit on error
set -e

# Uncomment to debug
#set -x

# Upper-case version of the domain name
upper_domain=$(echo ${domain} | tr [a-z] [A-Z])

# Find the short hostname and get an upper-case version of it
short_hostname=$(hostname --short)
upper_short_hostname=$(echo ${short_hostname} | tr [a-z] [A-Z])

# Log into the domain as the administrator, asking user for password
# The domain part must be in upper-case
echo "Logging into domain as the administrator"
/usr/bin/kinit "${username}@${upper_domain}"
echo ""

# List what kerberos sent back
echo "Listing kerberos tickets for the domain administrator:"
echo "------------------------------------------------------------------------"
klist
echo ""

# Join AD and put the machine credentials in the krb5.keytab
echo "Requesting domain join using administrator kerberos ticket"
net ads join -k

# List the machine credentials
echo "Listing kerberos tickets for the machine:"
echo "------------------------------------------------------------------------"
klist -k
echo ""

# Wait for 5s to allow everything to catch up - sometimes 5s isn't enough
echo "Waiting for everything to catch up..."
sleep 5
echo ""

# Sign in using the machine credentials
echo "Signing in using machine credentials ${upper_short_hostname}$"
kinit -k ${upper_short_hostname}$
echo ""

# Did it work?
joinedAd=$?

if [ $joinedAd -ne 0 ]
then
    echo "Error: could not join the domain with machine credentials ${upper_short_hostname}$"
    exit 1
else
    echo "Joined the domain using machine credentials ${upper_short_hostname}$"
    echo ""
    echo "Listing kerberos machine ticket:"
    echo "------------------------------------------------------------------------"
    klist
    echo ""

    # Now restart SSSD and everything should be happy :-)
    echo "Enabling and restarting sssd"
    systemctl enable sssd
    systemctl restart sssd
    if [ $? -ne 0 ]
    then
      echo "Error: could not start the System Security Services Daemon (SSSD)"
      exit 1
    else
      echo "System Security Services Daemon (SSSD) restarted and enabled."
      echo "AD should now be working!"
    fi
fi

exit 0

Em breve

Vamos mostrar como criar grupos de usuários do AD que podem executar o Sudo. Até Breve!

fonte primária: https://wiki.debian.org/AuthenticatingLinuxWithActiveDirectorySssd

Homologado no : xubuntu com Microsoft Server 2022.

Leave a Reply

Your email address will not be published. Required fields are marked *

Related Post

Este site usa cookies, mas apenas para melhorar sua usabilidade, sem coletar dados pessoais - Veja Nossa politica de privacidade