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: | Sim | passwd: compat sss |
group: | Sim | group: compat sss |
netgroup: | Sim | netgroup: 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.