Desde a versão 4.16 o Samba4 está implementando o suporte (Samba 4.16 replication of Windows AD 2019) aos níveis funcionais 2012, 2012R2 e 2016.
A partir da versão 4.19 do Samba4 as implementações de novos níveis funcionais suportam até 88 - Windows Server 2022 : https://wiki.samba.org/index.php/AD_Schema_Version_Support
Release Planning for Samba - https://wiki.samba.org/index.php/Samba_Release_Planning
Mais informações sobre os níveis funcionais: https://learn.microsoft.com/en-us/windows-server/identity/ad-ds/active-directory-functional-levels
Embora chamamos o Active Directory de Multi Master, permitindo que alterações possam acontecer em qualquer DC, algumas regras devem ser observados pelo FSMO:
https://wiki.samba.org/index.php/Flexible_Single-Master_Operations_(FSMO)_Roles
https://samba.tranquil.it/doc/en/samba_fundamentals/about_fsmo.html
Em 2008 implantei Samba 3 + OpenLDAP. Era necessário um conhecimento MUITO avançado em OpenLDAP e Samba para levantar um PDC. Depois do Samba 4, tudo ficou mais fácil.
Fiz um vídeo Instalando Fedora 39 no VirtualBox que eu recomendo assistirem antes de prosseguir.
Porque Fedora Server e não Debian/Ubuntu/AlmaLinux/RockyLinux/OracleLinux?
Debian/Ubuntu funcionam, mas o Fedora 40 possui a versão mais recente do samba4 disponível via pacote, simplificando MUITO o processo de instalação.
Distribuições AlmaLinux/RockyLinux/OracleLinux por serem derivados do RedHat não possuem os pacotes que incorporam o samba-ad que depende do Heimdal Kerberos para suporte ao Active Directory, apenas distribui e oferece suporte a produtos baseados no Kerberos-MIT.
Se ainda assim você não for utilizar o Fedora, é possível utilizar os pacotes já compilados pela Tranquil.it disponível para várias distros (RPM ou DEB).
NOTA: Fiz vários laboratórios com AlmaLinux 9 e Rocky Linux 9, mesmo seguindo a documentação oficial do Tranquil.it não consegui instanciar o Samba4. O ERRO foi idêntico a esse: https://bugzilla.samba.org/show_bug.cgi?id=14110
No dia 04/Fev/2024 quando instalamos utilizamos o Fedora 39 (https://fedoramagazine.org/announcing-fedora-linux-39/) que desde 07/Nov/2023 estava disponível.
No dia 23/Abr/2024 houve um lançamento do Fedora 40 (https://fedoramagazine.org/announcing-fedora-linux-40/).
Vamos proceder com a atualizção entre versões (https://docs.fedoraproject.org/en-US/quick-docs/upgrading-fedora-offline/)
# Garantir que o Fedora 39 esteja atualizado
# dnf -y upgrade --refresh
# Reboot
reboot
# Preparar para atualização entre versões
dnf -y install dnf-plugin-system-upgrade
# Baixar todas as atualizações entre versões
dnf -y system-upgrade download --releasever=40
# Efetivar as atualizações
dnf -y system-upgrade reboot
No dia 29/Out/2024 houve um lançamento do Fedora 41 (https://fedoramagazine.org/announcing-fedora-linux-41/).
Vamos proceder com a atualizção entre versões (https://docs.fedoraproject.org/en-US/quick-docs/upgrading-fedora-offline/)
# Garantir que o Fedora 40 esteja atualizado
# dnf -y upgrade --refresh
# Reboot
reboot
# Preparar para atualização entre versões
dnf -y install dnf-plugin-system-upgrade
# Baixar todas as atualizações entre versões
dnf -y system-upgrade download --releasever=41
# Efetivar as atualizações
dnf -y system-upgrade reboot
Sincronizar a data e Ajustar o timezone. Esse procedimento é crucial para o bom funcionamento dos DCs e FSs
# Instalar pacote de sincronismo de tempo
dnf install chrony
# Garantir que a data/hora esteja correta com o NTP
systemctl enable --now chronyd
# Ajustar o timezone para a sua localização
timedatectl set-timezone America/Campo_Grande
Firewalld e SELinux. Objetivando não termos possíveis problemas vamos desabilitar esses recursos nos DCs e FSs
Apesar de o Firewalld e o SELinux serem ferramentas que ajudam na segurança de um Linux, é possível que algumas regras impeçam o funcionamento correto do samba, principalmente se sua configuração estiver fora dos padrões de portas e localização dos arquivos.
# Desabilitar o firewalld imediatamente
systemctl disable --now firewalld
# Desativar o Selinux
setenforce 0
# Desabilitar o SELinux na Inicialização
sed -i s/^SELINUX=.*$/SELINUX=permissive/ /etc/selinux/config
Atualizar o SO
dnf -y upgrade --refresh
Instalar alguns pacotes adicionais
dnf -y install wget htop tmux nmap mc nano vim bash-completion sysstat jq expect \
PackageKit-command-not-found s3fs-fuse ccze tree net-tools whois speedtest-cli \
fastfetch cpufetch boxes figlet cowsay toilet \
unzip p7zip p7zip-plugins unrar zip gzip bzip2 unzip \
yum-utils fping duf rsyslog cronie NetworkManager-tui
Desabilitar o DNS do systemd-resolved
Quando da instalação de um Linux via DHCP, o systemd-resolved
é responsável pela resolução de DNS criano um DNS local para atuar como um cache, objetivando um menor tempo de resposta nas consultas DNS.
Esse comportamento é muito saudável para desktops, mas para o nosso Samba, o ajuste se faz necessário, pois o serviço de DNS interno do Samba não inicia se o systemd-resolved
estiver ocupando a porta 53 que será utilizada pelo DNS do Samba.
# Criar diretório para armazenar configurações de rede
mkdir /etc/systemd/resolved.conf.d/
# Remover o comportamento STUB
cat <<_EOF >> /etc/systemd/resolved.conf.d/custom.conf
[Resolve]
DNSStubListener=no
_EOF
# Restart no systemd-resolved
systemctl restart systemd-resolved
# Conferindo a resolução de nomes via DNS
cat /etc/resolv.conf
# This is /run/systemd/resolve/resolv.conf managed by man:systemd-resolved(8).
# Do not edit.
#
# This file might be symlinked as /etc/resolv.conf. If you're looking at
# /etc/resolv.conf and seeing this text, you have followed the symlink.
#
# This is a dynamic resolv.conf file for connecting local clients directly to
# all known uplink DNS servers. This file lists all configured search domains.
#
# Third party programs should typically not access this file directly, but only
# through the symlink at /etc/resolv.conf. To manage man:resolv.conf(5) in a
# different way, replace this symlink by a static file or a different symlink.
#
# See man:systemd-resolved.service(8) for details about the supported modes of
# operation for /etc/resolv.conf.
nameserver 1.1.1.1
nameserver 8.8.8.8
nameserver fe80::1272:23ff:fe13:b98d%2
search .
Note que entradas de nameserver's foram configuradas no servidor DHCP (que no meu caso é o roteador da Vivo).
Desabilitando o cockpit
Dê uma conferida nas portas abertas antes da instalação do samba
nmap localhost
Starting Nmap 7.94 ( https://nmap.org ) at 2024-03-30 09:05 -04
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000011s latency).
Other addresses for localhost (not scanned): ::1
Not shown: 998 closed tcp ports (reset)
PORT STATE SERVICE
22/tcp open ssh
9090/tcp open zeus-admin
Nmap done: 1 IP address (1 host up) scanned in 0.15 seconds
Notamos que há uma porta desconhecida (9090) aberta. É o serviço
cockpit
que vem instalado por default.
Mais informações: https://www.redhat.com/en/blog/linux-system-administration-management-console-cockpit
Mas como este serviço não será abordado nesse momento, vamos desabilitá-lo.
systemctl disable --now cockpit.socket
cat <<'_EOF' > /root/set-vars-samba
# Variáveis auxiliares do Samba4
#===============================
_REALM="SEUDOMINIO.COM.BR"
_SYSVOL="`echo $_REALM | tr '[:upper:]' '[:lower:]'`"
_DOMAIN="SEUDOMINIO"
_PASSWORD="SuperSecretPassword@2024"
_NETBIOS="`hostname -s`"
_TEMP_PASSWORD="TempSuperSecretPassword@2024"
_EOF
. /root/set-vars-samba
echo ". /root/set-vars-samba" >> ~/.bashrc
Adicione no /etc/hosts os registros dos seus DCs e FSs
cat <<_EOF >> /etc/hosts
# Servidores Samba
192.168.15.201 dc01.${_SYSVOL} dc01
192.168.15.202 dc02.${_SYSVOL} dc02
192.168.15.203 fs01.${_SYSVOL} fs01
_EOF
Fixar IP dos Servidores. Em se tratando de servidores, sempre fixe o IP ao invés de utilizar algum DHCP.
Tenha certeza que o hostname do seu servidor esteja no formato FQDN (fully-qualified domain name)
hostnamectl hostname dc01.${_SYSVOL}
Lembre-se de colocar o IP correspondente 192.168.15.201/24 com o nmtui
hostnamectl hostname dc02.${_SYSVOL}
Lembre-se de colocar o IP correspondente 192.168.15.202/24 com o nmtui
hostnamectl hostname fs01.${_SYSVOL}
Lembre-se de colocar o IP correspondente 192.168.15.203/24 com o nmtui
O reboot aqui é necessário para garantir que as atualizações de kernel e configurações de rede estejam conforme foi previamente configurado.
# Pacotes do Samba como DC
dnf -y install samba samba-dc samba-client krb5-workstation
# Pacotes para ingresso do domínio
dnf -y install realmd sssd oddjob oddjob-mkhomedir adcli \
samba-common-tools samba-winbind-clients samba-winbind samba-winbind-clients
CUIDADO: Execute apenas no DC01.
No DC02 faremos apenas um join como domain controler adicional
No FS01 faremos apenas um join como membro
# Removendo arquivos antigos
rm -rf /etc/samba/smb.conf /var/run/samba/* /var/lib/samba/* /var/log/samba/*log* /etc/krb5.conf
# O Provisionamento
samba-tool domain provision --server-role=dc --realm=${_REALM} --use-rfc2307 --domain=${_DOMAIN} --adminpass=${_PASSWORD} \
--dns-backend=SAMBA_INTERNAL \
--option="dns forwarder = 8.8.8.8 1.1.1.1" \
--option="template shell = /bin/bash" \
--option="log level = 1 auth_json_audit:3@/var/log/samba/samba_audit.log"
# Copiar a configuração gerada para o kerberos
cp /var/lib/samba/private/krb5.conf /etc/
# Não expirar senha do Administrador
samba-tool user setexpiry Administrator --noexpiry
# Alterando Políticas do Domínio
samba-tool domain passwordsettings set --complexity=on --history-length=3 --min-pwd-age=0 --max-pwd-age=365 --min-pwd-length=8
# Validando politicas do Domínio
samba-tool domain passwordsettings show
ldbsearch -H /var/lib/samba/private/sam.ldb -b 'cn=Schema,cn=Configuration,dc=seudominio,dc=com,dc=br' -s base objectVersion
# record 1
dn: CN=Schema,CN=Configuration,DC=seudominio,DC=com,DC=br
objectVersion: 88
# returned 1 records
# 1 entries
# 0 referrals
# Iniciando e Ativando o samba na inicialização do servidor
systemctl enable --now samba
# Dê uma conferida nas portas abertas pelo samba
nmap localhost
# Consultas no DNS do samba
host ${_SYSVOL}
host google.com
# Verificar conexão anônima ao samba
smbclient -L localhost -U%
# Verificar autenticação do Administrator ao netlogon
smbclient //dc01.${_SYSVOL}/netlogon -UAdministrator ${_PASSWORD} -c 'ls'
# Verificar o Ldap no DNS
host -t SRV _ldap._tcp.${_SYSVOL}.
# Verificar o Kerberos no DNS
host -t SRV _kerberos._udp.${_SYSVOL}.
# Verificar o DNS Local
host -t A ${_NETBIOS}.${_SYSVOL}.
# Encontrar o PDC Emulator on a Unix machine
host -t SRV _ldap._tcp.pdc._msdcs.${_SYSVOL}
# Gerando o ticket kerberos
echo ${_PASSWORD} | kinit administrator
# Listando o ticket
klist
# Removendo o ticket
kdestroy
# Informações Básicas sobre o Servidor AD
net ads info
samba-tool user list
samba-tool group list
Também conhecido pelo termo estrutura organizacional, essas serão as OUs que serão criadas para armazenar nossos objetos (pessoas, grupos, gpos).
Vamos povoar com nomes dos personagens retirados da Turma do Mônica - na Wikipedia
Vamos considerar o seguinte para povoamento de nosso Active Directory:
samba-tool nos fornece uma interface para executar tarefas de administração de Domínio
samba-tool --help
samba-tool ou add --help
samba-tool user add --help
samba-tool group add 'Turma da Monica' --description "Grupo de Usuários da Turma da Mônica"
samba-tool ou add 'OU=Presidente'
samba-tool ou add 'OU=Financeiro'
samba-tool ou add 'OU=RH'
samba-tool ou add 'OU=TI'
samba-tool ou add 'OU=Contabil'
samba-tool ou add 'OU=Producao'
samba-tool ou add 'OU=Comercial'
samba-tool ou add 'OU=Logistica'
samba-tool user add seu.cebola --random-password --use-username-as-cn --userou='OU=Presidente'
samba-tool user add cebolinha --random-password --use-username-as-cn --userou='OU=Financeiro'
samba-tool user add anjinho --random-password --use-username-as-cn --userou='OU=Financeiro'
samba-tool user add monica --random-password --use-username-as-cn --userou='OU=RH'
samba-tool user add dudu --random-password --use-username-as-cn --userou='OU=RH'
samba-tool user add rolo --random-password --use-username-as-cn --userou='OU=RH'
samba-tool user add xaveco --random-password --use-username-as-cn --userou='OU=TI'
samba-tool user add horacio --random-password --use-username-as-cn --userou='OU=TI'
samba-tool user add marina --random-password --use-username-as-cn --userou='OU=TI'
samba-tool user add cascao --random-password --use-username-as-cn --userou='OU=Contabil'
samba-tool user add ze.vampir --random-password --use-username-as-cn --userou='OU=Contabil'
samba-tool user add magali --random-password --use-username-as-cn --userou='OU=Producao'
samba-tool user add rosinha --random-password --use-username-as-cn --userou='OU=Producao'
samba-tool user add carminha.frufru --random-password --use-username-as-cn --userou='OU=Producao'
samba-tool user add chico.bento --random-password --use-username-as-cn --userou='OU=Comercial'
samba-tool user add capitao.feio --random-password --use-username-as-cn --userou='OU=Comercial'
samba-tool user add piteco --random-password --use-username-as-cn --userou='OU=Comercial'
samba-tool user add franjinha --random-password --use-username-as-cn --userou='OU=Logistica'
samba-tool user add rita.najura --random-password --use-username-as-cn --userou='OU=Logistica'
samba-tool user add juca --random-password --use-username-as-cn --userou='OU=Logistica'
samba-tool group addmembers 'Turma da Monica' monica,cebolinha,cascao,magali
samba-tool user add tiozao ${_TEMP_PASSWORD} --use-username-as-cn \
--given-name="Tiozão" --surname="do Linux" --job-title="Título do Cargo" \
--company="Nome da Empresa" --department="Nome do Departamento" \
--description="Descrição Opcional" [email protected] --telephone-number="+55 67 9 81183482" \
--physical-delivery-office="Endereço Completo" --login-shell=/bin/bash
samba-tool group list
samba-tool group listmembers 'Turma da Monica'
samba-tool ou list
samba-tool ou listobjects OU=Financeiro
samba-tool user show tiozao
pdbedit -L -v tiozao
# Trocar a senha do usuário tiozao que foi criado como senha ${_TEMP_PASSWORD} para ${_PASSWORD}
samba-tool user setpassword tiozao --newpassword=${_PASSWORD}
# Validando a data da troca da senha
pdbedit -L -v tiozao
# Backup com samba-tool
samba-tool domain backup online --server=${_NETBIOS}.${_SYSVOL} --targetdir=/var/backups/ --username=Administrator --password="${_PASSWORD}"
...
...
# Listando os arquivos de backup
ll -h /var/backups/
-rw-r--r-- 1 root root 1.5M May 19 16:21 samba-backup-seudominio.com.br-2024-05-19T16-21-21.695739.tar.bz2
No Windows Server, temos contas locais e depois da instalação do AD (Active Directory) a autenticação pode ser feita tanto com usuários locais quanto usuários do AD.
No Linux, também temos contas locais e depois da instalação do AD a autenticação não utiliza essa base de dados, ou seja, não há login no Linux com usuários do AD. Se desejar essa comodidade, será necessário ingressar o Linux no AD.
Essa diferença na abordagem de autenticação após instalação do AD pode ser vista de duas formas: usabilidade X segurança. É muito mais cômodo que todas as contas do AD possam fazer login no Linux, uma vez que a gestão de contas é centralizada. Por outro lado, imagine que o usuário cascao teve sua senha comprometida e inadvertidamente foi utilizada para login no Linux, possibilitando um acesso indevido à configurações do AD. Essa balança entre usabilidade e segurança deve ser tratada com muito cuidado pelas áreas competentes.
Se optar pela segurança: (é o comportamento default)
authselect select local
Se optar pela usabilidade:
# Limpa o cache
net cache flush
# Verifica existência do usuário no AD
wbinfo -n Administrator
# Verifica existência do usuário no Linux
id Administrator
# Habilita logins via AD
authselect select winbind with-mkhomedir
# Verifica existência do usuário no Linux
id Administrator
# Identificando grupos
groups "Domain Admins"
# Listando usuários
wbinfo -u
# Listando grupos
wbinfo -g
Agora podemos fazer um SSH remotamente com os usuários do AD:
ssh -o PreferredAuthentications=password [email protected]
[email protected]'s password:
Last login: Sun May 19 16:27:57 2024 from 192.168.15.10
[SEUDOMINIO\tiozao@dc01 ~]$ pwd
/home/SEUDOMINIO/tiozao
[SEUDOMINIO\tiozao@dc01 ~]$
Com a autenticação no DC pelos usuários do AD, várias outras medidas podem ser aplicadas:
limitar o acesso remoto (ssh) à determinados usuários/grupos
limitar o escalonamento (su e sudo) a deterinados usuários/gruposQuer saber mais? Veja o Capitulo 6 do livro Active Directory com Samba 4 indicado nas referências.
Porquê são necessários mais controladores de domínio? Quais são os riscos de manter apenas um? Se minha empresa tiver apenas um DC e ele falhar, qual é o impacto? Quanto tempo vou levar para restabelecer um AD comprometido?
Quando um DC falha, o outro DC é capaz de manter sozinho o Ad, enquanto se busca recuperar o DC em falha. É necessário capturar as funções FSMO para o DC adicional. Sem um DC adicional e sem backup do AD, a empresa ficará em uma posição difícil. Essas providências minimizam o tempo de inatividade dos serviços e maximizam as operações das empresas, aumentando o retorno sobre inventimento do parque computacional.
Quer saber mais? Veja o Capitulo 4 do livro Active Directory com Samba 4 - Tópicos Avançados indicado nas referências.
As configurações são basicamente as mesmas que o DC01, mas a configuração do Kerberos é ligeiramente diferente.
# Removendo arquivos antigos
rm -rf /etc/samba/smb.conf /var/run/samba/* /var/lib/samba/* /var/log/samba/*log* /etc/krb5.conf
echo "
[libdefaults]
default_realm = ${_REALM}
dns_lookup_realm = false
dns_lookup_kdc = true
[realms]
${_REALM} = {
default_domain = ${_DOMAIN}
kdc = 192.168.15.201
}
[domain_realm]
dc01.${_SYSVOL} = ${_REALM}
" > /etc/krb5.conf
# Consultas no DNS do samba
host ${_SYSVOL}
host dc01.${_SYSVOL}
# Validando a autenticação remota no DC01
smbclient //dc01.${_SYSVOL}/netlogon -Utiozao ${_TEMP_PASSWORD} -c 'ls'
# Gerando o ticket kerberos
echo ${_PASSWORD} | kinit administrator
# Listando o ticket
klist
# Removendo o ticket
kdestroy
samba-tool domain info dc01.${_SYSVOL}
samba-tool domain join ${_REALM} DC --realm=${_REALM} --domain=${_DOMAIN} -U Administrator%${_PASSWORD} \
--dns-backend=SAMBA_INTERNAL \
--option="idmap_ldap:use rfc2307 = yes" \
--option="dns forwarder = 8.8.8.8 1.1.1.1" \
--option="template shell = /bin/bash" \
--option="log level = 1 auth_json_audit:3@/var/log/samba/samba_audit.log"
# Iniciando e Ativando o samba na inicialização do servidor
systemctl enable --now samba
# Dê uma conferida nas portas abertas pelo samba
nmap localhost
# Depois de alguns minutos, podemos verificar a replicação:
samba-tool drs showrepl
Há duas replicações do DC01 que precisam ser feitas o DC02:
-- o mapeamento de usuários do AD para usuários do Linux (/var/lib/samba/private/idmap.ldb
) -
-- diretório SYSVOL (/var/lib/samba/sysvol
)
Em servidores Windows Server esse sincronismo é automático, mas o Samba4 não implementa nem o antigo FRS (File Replication Service) e nem o atual DFS-R (Distribuited File System Replication)
-- https://wiki.samba.org/index.php/Joining_a_Samba_DC_to_an_Existing_Active_Directory
-- https://wiki.samba.org/index.php/Distributed_File_System_(DFS)Quer saber mais? Veja o Capitulo 4 do livro Active Directory com Samba 4 - Tópicos Avançados indicado nas referências.
Configurações baseadas na documentação oficial: https://wiki.samba.org/index.php/Setting_up_Samba_as_a_Domain_Member
# Removendo arquivos antigos
rm -rf /etc/samba/smb.conf /var/run/samba/* /var/lib/samba/* /var/log/samba/*log* /etc/krb5.conf
echo "
[libdefaults]
default_realm = ${_REALM}
dns_lookup_realm = false
dns_lookup_kdc = true
" > /etc/krb5.conf
# Consultas no DNS do samba
host ${_SYSVOL}
host google.com
samba-tool domain info dc01.${_SYSVOL}
samba-tool domain join ${_REALM} MEMBER -U Administrator%${_PASSWORD} \
--option="idmap_ldap:use rfc2307 = yes" \
--option="template shell = /bin/bash" \
--option="log level = 1 auth_json_audit:3@/var/log/samba/samba_audit.log"
wbinfo --ping-dc
Agora já podemos criar os compartilhamentos que desejamos: https://wiki.samba.org/index.php/Setting_up_a_Share_Using_Windows_ACLs
ou https://ubuntu.com/server/docs/member-server-in-an-active-directory-domain
Ferramentas de Administração de Servidor Remoto (RSAT) para Windows: https://learn.microsoft.com/pt-br/troubleshoot/windows-server/system-management-components/remote-server-administration-tools
Iniciar (powershell - abrir como Administrador)
Get-WindowsCapability -Online | ? Name -like 'RSAT*'|Where {$_.State -eq 'NotPresent'} |foreach {Add-WindowsCapability -online -name $_.Name}
Comigo domonou bastante. Então aguarde a conclusão da instalação.
Não esquecer de setar o DNS do Windows para os dois DCs.
Veja detalhes dos Atributos do Atribute Details Active Directory
Para dirimir dúvidas e/ou sugestões entre no Grupo Tiozão do Linux
https://t.me/Grupo_Tiozao_Do_Linux