📁 DC1 instalação por pacotes compilados
Controlador de Domínio Primário, Secundário e Fileserver no Debian Linux 13
Layout de rede usado no laboratório:
firewall 192.168.70.254 (enp1s0) - 192.168.122.254 (enp7s0) (ssh 2277)
dcmaster 192.168.70.250 (ssh 22250)
mkdocs 192.168.70.222 (ssh 22222)
dcslave 192.168.70.200 (ssh 22200)
fileserver 192.168.70.150 (ssh 22100)
; firewall Roteamento por Iptables
; dcmaster Controlador de Domínio primário
; mkdocs Servidor de Documentos
; dcslave Controlador de Domínio secundário
; fileserver Servidor de Arquivos
Instalando as dependências para compilação do código fonte do Samba4:
export DEBIAN_FRONTEND=noninteractive;apt-get update; apt-get install vim net-tools rsync acl apt-utils attr autoconf bind9-utils binutils bison build-essential ccache chrpath curl debhelper bind9-dnsutils docbook-xml docbook-xsl flex gcc gdb git glusterfs-common gzip heimdal-multidev hostname htop krb5-config krb5-user lcov libacl1-dev libarchive-dev libattr1-dev libavahi-common-dev libblkid-dev libbsd-dev libcap-dev libcephfs-dev libcups2-dev libdbus-1-dev libglib2.0-dev libgnutls28-dev libgpgme-dev libicu-dev libjansson-dev libjs-jquery libjson-perl libkrb5-dev libldap2-dev liblmdb-dev libncurses-dev libpam0g-dev libparse-yapp-perl libpcap-dev libpopt-dev libreadline-dev libsystemd-dev libtasn1-bin libtasn1-6-dev libunwind-dev lmdb-utils locales lsb-release make mawk mingw-w64 patch perl perl-modules-5.40 pkg-config procps psmisc python3 python3-cryptography python3-dbg python3-dev python3-dnspython python3-gpg python3-iso8601 python3-markdown python3-matplotlib python3-pexpect python3-pyasn1 rsync sed tar tree uuid-dev wget xfslibs-dev xsltproc zlib1g-dev -y
Setando e validando o hostname do dcmaster:
hostnamectl set-hostname dcmaster
Configurando o arquivo de hosts:
vim /etc/hosts
127.0.0.1 localhost
127.0.1.1 dcmaster.officinas.edu dcmaster
192.168.70.254 dcmaster.officinas.edu dcmaster
hostname -f
Setando ip fixo no servidor dcmaster:
vim /etc/network/interfaces
iface enp1s0 inet static
address 192.168.70.250
netmask 255.255.255.0
gateway 192.168.70.254
Setando endereço do firewall como resolvedor externo (temporário até provisionar o domínio):
vim /etc/resolv.conf
nameserver 192.168.70.254 #(firewall)
Validando o ip da placa:
ip -c addr
ip -br link
Baixando e compilando o código fonte do Samba4:
wget https://download.samba.org/pub/samba/samba-4.22.1.tar.gz
tar -xvzf samba-4.22.1.tar.gz
cd samba-4.22.1
./configure --prefix=/opt/samba
make
make install
Adicionando /opt/Samba ao path padrão do Linux, colando a linha completa ao final do .bashrc:
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/samba/bin:/opt/samba/sbin"
vim ~/.bashrc
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/samba/bin:/opt/samba/sbin"
Relendo o arquivo de profile:
source ~/.bashrc
Criando o daemon de inicialização do Samba4 com o sistema:
vim /etc/systemd/system/samba-ad-dc.service
[Unit]
Description=Samba4 Active Directory Master Domain Controller
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
ExecStart=/opt/samba/sbin/samba -D
PIDFile=/opt/samba/var/run/samba.pid
[Install]
WantedBy=multi-user.target
chmod +x /etc/systemd/system/samba-ad-dc.service
Instalando e editando o serviço de sincronização de horário:
cp /etc/ntpsec/ntp.conf{,.orig}
vim /etc/ntpsec/ntp.conf
driftfile /var/lib/ntpsec/ntp.drift
leapfile /usr/share/zoneinfo/leap-seconds.list
pool a.ntp.org iburst
pool b.ntp.org iburst
pool 2.debian.pool.ntp.org iburst
pool 3.debian.pool.ntp.org iburst
restrict 127.0.0.1
restrict ::1
tinker panic 0 #(Flag usada SOMENTE em VMs)
systemctl restart ntpd
ntpq -p
Provisionando o novo domínio suportado pelo dcmaster:
samba-tool domain provision --use-rfc2307 --interactive --option=”interfaces=lo enp1s0” --option=”bind interfaces only=yes”
Habilitando o daemon pra subir no boot do sistema:
systemctl daemon-reload
systemctl enable samba-ad-dc.service
systemctl start samba-ad-dc.service
systemctl status samba-ad-dc.service
Linkando o arquivo krb5.conf do Samba4 ao /etc do sistema:
mv /etc/krb5.conf{,.orig}
ln -sf /opt/samba/private/krb5.conf /etc/krb5.conf
APÓS o provisionamento da Samba4, precisamos reconfigurar o /etc/resolv.conf e setar o DNS apontando a resolução de nomes para o próprio dcmaster:
vim /etc/resolv.conf
domain officinas.edu
search officinas.edu.
nameserver 127.0.0.1 #(localhost)
Bloqueando alteração do resolv.conf:
chattr +i /etc/resolv.conf
Validando resolvedor de nomes pelo dcmaster:
nslookup dcmaster.officinas.edu
Vai validar na tela:
Server: 127.0.0.1
Address: 127.0.0.1#53
Name: dcmaster.officinas.edu
Address: 192.168.70.250
Reboot do servidor dcmaster:
reboot
Validando os serviços do Samba4 no boot do sistema:
ps aux | grep samba
ps aux | egrep "samba|smbd|nmbd|winbind"
find / -name samba.pid
pgrep samba
Dando poderes de root ao Administrator:
vim /opt/samba/etc/user.map
!root=officinas.edu\Administrator
Linkando bibliotecas do Samba4 para mapeamento de usuários no sistema Linux (rode esses comandos manualmente sem copiar e colar):
/opt/samba/sbin/smbd -b | grep LIBDIR
ln -s /opt/samba/lib/libnss_winbind.so.2 /lib/x86-64-linux-gnu
ln -s /lib/x86_64-linux-gnu/libnss_winbind.so.2 /lib/x86_64-linux-gnu/libnss_winbind.so
ldconfig
Validando a autenticação de usuários de rede no sistema Linux mas tbém no winbind:
vim /etc/nsswitch.conf
passwd: files systemd winbind
group: files systemd winbind
shadow: files
Editando o arquivo smb.conf e adicionando no dns forwarder, quem resolve nomes para consultas externas (o firewall e o google):
cp /opt/samba/etc/smb.conf{,.orig}
vim /opt/samba/etc/smb.conf
[global]
bind interfaces only = Yes
dns forwarder = 192.168.70.254 8.8.8.8 #(firewall + google)
interfaces = lo enp1s0
netbios name = DCMASTER
realm = OFFICINAS.EDU
server role = active directory domain controller
workgroup = OFFICINAS
idmap_ldb:use rfc2307 = yes
[sysvol]
path = /opt/samba/var/locks/sysvol
read only = No
[netlogon]
path = /opt/samba/var/locks/sysvol/officinas.edu/scripts
read only = No
Relendo a configuração do Samba4:
smbcontrol all reload-config
Validando usuários da base do ldap local:
cat /etc/passwd | grep root
Validando usuários de rede do Samba4 (Intermediados pelo winbind):
samba-tool user show administrator
getent passwd administrator
wbinfo -u
wbinfo -g
wbinfo --ping-dc
getent group "Domain Admins"
Validando daemons ativos:
ps aux | egrep "samba|smbd|nmbd|winbind"
ps axf
Consultando serviços do SAMBA4:
smbclient --version
smbclient -L dc01 -U Administrator
smbclient //localhost/netlogon -UAdministrator -c "ls"
testparm
samba-tool domain level show
Desabilitando complexidade de senhas (inseguro):
samba-tool domain passwordsettings show
samba-tool domain passwordsettings set --complexity=off
samba-tool domain passwordsettings set --history-length=0
samba-tool domain passwordsettings set --min-pwd-length=0
samba-tool domain passwordsettings set --min-pwd-age=0
samba-tool user setexpiry Administrator --noexpiry
Relendo as configurações do SAMBA4:
smbcontrol all reload-config
Validando a troca de tickets do Kerberos:
kinit Administrator@OFFICINAS.EDU
klist
Consultando as bases do kerberos, ldap e dns:
host -t srv _kerberos._tcp.officinas.edu
host -t srv _ldap._tcp.officinas.edu
host -t A dcmaster.officinas.edu.
dig officinas.edu
THAT’S ALL FOLKS!!
Controlador de Domínio secundário com Samba4 no Debian Linux 13
Layout de rede usado no laboratório:
firewall 192.168.70.254 (enp1s0) - 192.168.122.254 (enp7s0) (ssh 2277)
dcmaster 192.168.70.250 (ssh 22250)
mkdocs 192.168.70.222 (ssh 22222)
dcslave 192.168.70.200 (ssh 22200)
fileserver 192.168.70.150 (ssh 22100)
; firewall Roteamento por Iptables
; dcmaster Controlador de Domínio primário
; mkdocs Servidor de Documentos
; dcslave Controlador de Domínio secundário
; fileserver Servidor de Arquivos
Instalando as dependências para compilação do código fonte do Samba4:
export DEBIAN_FRONTEND=noninteractive;apt-get update; apt-get install vim net-tools rsync acl apt-utils attr autoconf bind9-utils binutils bison build-essential ntp rsync ccache chrpath curl debhelper bind9-dnsutils docbook-xml docbook-xsl flex gcc gdb git glusterfs-common gzip heimdal-multidev hostname htop krb5-config krb5-user lcov libacl1-dev libarchive-dev libattr1-dev libavahi-common-dev libblkid-dev libbsd-dev libcap-dev libcephfs-dev libcups2-dev libdbus-1-dev libglib2.0-dev libgnutls28-dev libgpgme-dev libicu-dev libjansson-dev libjs-jquery libjson-perl libkrb5-dev libldap2-dev liblmdb-dev libncurses-dev libpam0g-dev libparse-yapp-perl libpcap-dev libpopt-dev libreadline-dev libsystemd-dev libtasn1-bin libtasn1--5-dev libunwind-dev lmdb-utils locales lsb-release make mawk mingw-w64 patch perl perl-modules-5.40 pkg-config procps psmisc python3 python3-cryptography python3-dbg python3-dev python3-dnspython python3-gpg python3-iso8601 python3-markdown python3-matplotlib python3-pexpect python3-pyasn1 rsync sed tar tree uuid-dev wget xfslibs-dev xsltproc zlib1g-dev -y
Setando e validando o hostname do dcslave:
vim /etc/hostname
dcslave
hostname -f
dcslave.officinas.edu
Configurando o arquivo de hosts:
vim /etc/hosts
.0.0.1 localhost
127.0.1.1 dcslave.officinas.edu dcslave
192.168.70.150 fileserver.officinas.edu fileserver
192.168.70.200 dcslave.officinas.edu dcslave
192.168.70.222 mkdocs.officinas.edu mkdocs
192.168.70.250 dcmaster.officinas.edu dcmaster
192.168.70.254 firewall.officinas.edu firewall
Setando ip fixo no servidor dcslave:
vim /etc/network/interfaces
allow-hotplug enp1s0
iface enp1s0 inet static
address 192.168.70.200
netmask 255.255.255.0
gateway 192.168.70.254
Apontando o endereço do resolvedor de nomes principal da rede pro Controlador de domínio primário, dcmaster (temporário, até provisionar):
vim /etc/resolv.conf
domain officinas.edu
search officinas.edu.
nameserver 192.168.70.250 #(dcmaster)
nameserver 127.0.0.1
Validando a resolução de nomes pelo dcmaster:
nslookup officinas.edu
Server: 192.168.70.250
Address: 192.168.70.250#53
Name: officinas.edu
Address: 192.168.70.250
Name: officinas.edu
Address: 192.168.70.200
Relendo as configurações de rede:
systemctl restart networking
Validando o ip da placa:
ip -c addr
ip -br link
Baixando e compilando o código fonte do Samba4:
wget https://download.samba.org/pub/samba/samba-4.19.4.tar.gz
tar -xvzf samba-4.19.4.tar.gz
cd samba-4.19.4
./configure --prefix=/opt/samba
make && make install
Adicionando /opt/Samba ao path padrão do Linux, colando a linha completa ao final do .bashrc:
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/samba/bin:/opt/samba/sbin"
vim ~/.bashrc
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/samba/bin:/opt/samba/sbin"
Relendo o arquivo de profile:
source ~/.bashrc
Criando o daemon de inicialização do Samba4 com o sistema:
vim /etc/systemd/system/samba-ad-dc.service
[Unit]
Description=Samba4 Active Directory Slave Domain Controller
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
ExecStart=/opt/samba/sbin/samba -D
PIDFile=/opt/samba/var/run/samba.pid
[Install]
WantedBy=multi-user.target
chmod +x /etc/systemd/system/samba-ad-dc.service
Configurando o serviço de sincronização de horário, apontando pro Controlador de domínio primário, dcmaster:
mv /etc/ntpsec/ntp.conf{,.orig}
vim /etc/ntpsec/ntp.conf
driftfile /var/lib/ntpsec/ntp.drift
leapfile /usr/share/zoneinfo/leap-seconds.list
tos minclock 4 minsane 3
pool 192.168.70.250 iburst #(dcmaster)
restrict default kod nomodify nopeer noquery limited
restrict 127.0.0.1
restrict ::1
tinker panic 0 #(Flag usada SOMENTE em VMs)
systemctl restart ntp
ntpq -p
date
As máquinas Windows/Linux, membros do domínio, usarão o DC1 que retém a função FSMO emulador PDC como fonte de tempo padrão!
Provisionando o servidor DCSLAVE:
samba-tool domain join OFFICINAS.EDU DC -U Administrator --realm=OFFICINAS.EDU --dns-backend=SAMBA_INTERNAL --option="interfaces=lo enp1s0" --option="bind interfaces only=yes" --option="idmap_ldb:use-rfc2307=yes"
Habilitando o daemon pra subir no boot do sistema:
systemctl daemon reload
systemctl enable samba-ad-dc.service
systemctl start samba-ad-dc.service
systemctl status samba-ad-dc.service
Editando o arquivo do kerberos:
mv /etc/krb5.conf{,.orig}
vim /etc/krb5.conf
[libdefaults] #(sem espaço no canto dessa linha)
dns_lookup_realm = false
dns_lookup_kdc = true
default_realm = OFFICINAS.EDU
Visualizando o arquivo smb.conf:
cat /opt/samba/etc/smb.conf
# Global parameters
[global]
bind interfaces only = Yes
interfaces = lo enp1s0
netbios name = DCSLAVE
realm = OFFICINAS.EDU
server role = active directory domain controller
workgroup = OFFICINAS
idmap_ldb:use-rfc2307 = yes
[sysvol]
path = /opt/samba/var/locks/sysvol
read only = No
[netlogon]
path = /opt/samba/var/locks/sysvol/officinas.edu/scripts
read only = No
Validando as entradas DNS usadas:
apt install ldb-tools
host -t A officinas.edu.
(SE NECESSÁRIO), SE Necessário, adicione as entradas do dcslave, manualmente AO DNS do Samba4, no dcmaster:
samba-tool dns add dcmaster OFFICINAS.EDU dcslave A 192.168.70.200 -U administrator
ldbsearch -H /opt/samba/private/sam.ldb '(invocationId=*)' --cross-ncs objectguid
host -t CNAME df4bdd8c-abc7-4779-b01e-4dd4553ca3e9._msdcs.officinas.edu.
SE não rodar, execute a replicação para todos os DCs:
samba-tool dns add dcmaster _msdcs.officinas.edu df4bdd8c-abc7-4779-b01e-4dd4553ca3e9 CNAME dcslave.officinas.edu -Uadministrator
PASTA SYSVOL
Replicando a pasta sysvol. Mapeando IDs de grupos e usuários para o dcslave (execute estes comando NO DCMASTER):
tdbbackup -s .bak /opt/samba/private/idmap.ldb
scp -rv -p22200 /opt/samba/private/idmap.ldb.bak root@dcslave:/root
scp -rv -p22200 /opt/samba/var/locks/sysvol/* root@dcslave:/opt/samba/var/locks/sysvol
Aplicando o arquivo BD que enviamos do dcmaster (execute estes comandos NO DCSLAVE):
mv /root/idmap.ldb.bak /root/idmap.ldb
cp -rfv /root/idmap.ldb /opt/samba/private/
samba-tool ntacl sysvolreset
Agora precisamos pensar que tendo dois DCs na rede, SE cair o primário o secundário assume o controle, e vice versa. Logicamente devemos apontar um pro outro como resolvedor de nomes primário, ou seja, o dcmaster vai resolver primeiro no dcslave e o dcslave vai resolver primeiro no dcmaster:
Edite o /etc/resolv.conf NO DCMASTER e aponte pro dcslave:
vim /etc/resolv.conf
domain officinas.edu
search officinas.edu.
nameserver 192.168.70.200 #(dcslave)
nameserver 127.0.0.1
Bloqueando a edição do arquivo resolv.conf:
chattr +i /etc/resolv.conf
E no reverso, edite o /etc/resolv.conf NO DCSLAVE apontando pro dcmaster:
Desbloqueando a edição do arquivo resolv.conf:
chattr -i /etc/resolv.conf
vim /etc/resolv.conf
domain officinas.edu
search officinas.edu.
nameserver 192.168.70.250 #(dcmaster)
nameserver 127.0.0.1
Bloqueando a edição do arquivo resolv.conf:
chattr +i /etc/resolv.conf
Validando a replicação ( execute em todos os DCs):
samba-tool drs showrepl
Criando um usuário no dcmaster (execute NO DCMASTER):
samba-tool user create userteste
samba-tool user list
Validando no dcslave, se consta o usuário criado no dcmaster (execute NO DCSLAVE):
samba-tool user list
Validando o compartilhamento padrão:
smbclient -L localhost -U%
smbclient //localhost/netlogon -UAdministrator -c 'ls'
Validando o DNS local:
host -t A officinas.edu localhost
Validando a troca de tickets do kerberos:
kinit Administrator
klist
Validando configuração de kerberos e ldap:
host -t srv _kerberos._tcp.officinas.edu
host -t srv _ldap._tcp.officinas.edu
dig officinas.edu
host -t A <máquina do domínio>
Validando informações de servidor qual controla o PDC Emulator:
samba-tool fsmo show | grep -i pdc
samba-tool fsmo show
Validando a localização do diretório 'sysvol' do dcmaster:
uname -ra
find /opt/samba -iname sysvol
/opt/samba/var/locks/sysvol
Validando espaço disponível:
df -h
Validando a UUID do seu disco:
blkid /dev/sda2 #(Sete A SUA partição de disco)
Validando suporte ativo no Kernel ás flags de acl e segurança:
cat /boot/config-6.1.0-17-amd64 | grep _ACL
cat /boot/config-6.1.0-17-amd64 | grep FS_SECURITY
Gerando e enviando as chaves do ssh para sincronização entre o dcmaster e o dcslave (crie as chaves NO DCMASTER e envie a chave pública para o dcslave):
(Pode deixar a senha em branco SE preferir)
ssh-keygen -t rsa -b 1024
ssh-copy-id -p22200 -i ~/.ssh/id_rsa.pub root@dcslave #(O MEU dcslave usa a porta ssh 22200)
Testando a conexão por ssh sem pedir senha (SE vc deixou em branco):
ssh -p22200 dcslave
exit
Agora inverta a ordem e crie as chaves NO DCSLAVE e envie para o dcmaster (Rode estes comandos NO DCSLAVE):
ssh-keygen -t rsa -b 1024
ssh-copy-id -p22250 -i ~/.ssh/id_rsa.pub root@dcmaster #(enviando para o dcmaster, que usa porta ssh 22250)
Testando a conexão por ssh sem pedir senha (SE vc deixou em branco):
ssh -p22250 dcmaster
exit
Criando script de sincronização com rsync do diretório 'sysvol' DO DCMASTER para envio ao dcslave (rode estes comando NO DCMASTER):
cd /opt
vim rsync-sysvol.sh
#!/bin/bash
# Sincronizando Diretorios do Sysvol do dcmaster para envio ao dcslave:
#rsync -Cravz /opt/samba/var/locks/sysvol/* root@192.168.70.200:/opt/samba/var/locks/sysvol/
# no MEU CASO onde a porta do ssh não á a default. MEU dcslave usa 22200:
rsync -Cravz -e "ssh -p 22200" /opt/samba/var/locks/sysvol/* root@192.168.70.200:/opt/samba/var/locks/sysvol/
chmod +x rsync-sysvol
./rsync-sysvol
Agendando a sincronização no cron do dcmaster:
crontab -e
*/5 * * * * root bash /opt/rsync-sysvol.sh --silent
REPITA o processo de replicação do sysvol, agora NO DCSLAVE, INVERTENDO os apontamentos de ip, obviamente!
Criando script de sincronização do diretório 'sysvol' DO DCSLAVE para envio ao dcmaster (rode os comando agora NO DCSLAVE):
cd /opt
vim rsync-sysvol.sh
#!/bin/bash
# Sincronizando Diretorios do Sysvol do dcmaster para envio ao dcslave:
#rsync -Cravz /opt/samba/var/locks/sysvol/* root@192.168.70.250:/opt/samba/var/locks/sysvol/
# no MEU CASO onde a porta do ssh não á a default. MEU dcmaster usa 22250:
rsync -Cravz -e "ssh -p 22250" /opt/samba/var/locks/sysvol/* root@192.168.70.250:/opt/samba/var/locks/sysvol/
chmod +x rsync-sysvol
./rsync-sysvol
Agendando a sincronização no cron do dcslave:
crontab -e
*/5 * * * * root bash /opt/rsync-sysvol.sh --silent
As Estações de trabalho, usarão, como DNS primário o PDC Emulator do Domínio, e como DNS secundário o PDC Secundário da rede.
OSYNC
Configurando a sincronização da pasta sysvol com osync, que vai espelhar os DCs (rode esses comandos NO DCMASTER, primeiro):
cd /opt
git clone https://github.com/deajan/osync.git
cd osync
sh ./install.sh
Vai criar o diretório /etc/osync:
Dentro dele vai ter o arquivo de configuração sync.conf.example. Crie um arquivo sync.conf e cole o conteúdo abaixo:
vim /etc/osync/sync.conf
#!/usr/bin/env bash
INSTANCE_ID="sysvol_sync"
INITIATOR_SYNC_DIR="/opt/samba/var/locks/sysvol"
TARGET_SYNC_DIR="ssh://root@192.168.70.200:22200//opt/samba/var/locks/sysvol"
SSH_RSA_PRIVATE_KEY="/root/.ssh/id_rsa"
REMOTE_3RD_PARTY_HOSTS=""
PRESERVE_ACL=yes
PRESERVE_XATTR=yes
SOFT_DELETE=yes
DESTINATION_MAILS="roor@localhost"
#REMOTE_RUN_AFTER_CMD="/opt/samba/bin/samba-tool ntacl sysvolreset"
rodando o script de atualização, que está dentro do /opt/osync, apontando pro arquivo /etc/osync/sync.conf:
./upgrade-v1.0x-v1.2x.sh /etc/osync/sync.conf
Vai ficar semelhante ao modelo abaixo:
#!/usr/bin/env bash
INSTANCE_ID="sysvol_sync"
INITIATOR_SYNC_DIR="/opt/samba/var/locks/sysvol"
TARGET_SYNC_DIR="ssh://root@192.168.70.200:22200//opt/samba/var/locks/sysvol"
SSH_RSA_PRIVATE_KEY="/root/.ssh/id_rsa"
SSH_PASSWORD_FILE=""
_REMOTE_TOKEN="SomeAlphaNumericToken9"
CREATE_DIRS=false
LOGFILE=""
MINIMUM_SPACE="10240"
BANDWIDTH="0"
SUDO_EXEC=false
RSYNC_EXECUTABLE="rsync"
RSYNC_REMOTE_PATH=""
RSYNC_PATTERN_FIRST="include"
RSYNC_INCLUDE_PATTERN=""
RSYNC_EXCLUDE_PATTERN=""
RSYNC_INCLUDE_FROM=""
RSYNC_EXCLUDE_FROM=""
PATH_SEPARATOR_CHAR=";"
SSH_COMPRESSION=true
SSH_IGNORE_KNOWN_HOSTS=false
SSH_CONTROLMASTER=false
REMOTE_HOST_PING=false
Testando o sincronizmo (ignore o erro de email):
/usr/local/bin/osync.sh /etc/osync/sync.conf --dry --verbose
Rodar o sincronizmo de fato:
/usr/local/bin/osync.sh /etc/osync/sync.conf --verbose
Agendar no cron:
crontab -e
*/5 * * * * root bash /usr/local/bin/osync.sh /etc/osync/sync.conf --silent
Validando os logs em tempo real, rode o /usr/local/bin/osync.sh, mantendo outro terminal aberto com o comando:
tail -f /var/log/osync.sysvol_sync.log
INVERTENDO a sincronização com o Osync, vamos refazer tudo, incluíndo o ip e porta ssh, agora NO DCSLAVE:
cd /opt
git clone https://github.com/deajan/osync.git
cd osync
sh ./install.sh
Vai criar o diretório /etc/osync:
Dentro dele vai ter o arquivo de configuração sync.conf.example. Crie um arquivo sync.conf e cole o conteúdo abaixo:
#!/usr/bin/env bash
INSTANCE_ID="sysvol_sync"
INITIATOR_SYNC_DIR="/opt/samba/var/locks/sysvol"
TARGET_SYNC_DIR="ssh://root@192.168.70.250:22250//opt/samba/var/locks/sysvol"
SSH_RSA_PRIVATE_KEY="/root/.ssh/id_rsa"
REMOTE_3RD_PARTY_HOSTS=""
PRESERVE_ACL=yes
PRESERVE_XATTR=yes
SOFT_DELETE=yes
DESTINATION_MAILS="roor@localhost"
#REMOTE_RUN_AFTER_CMD="/opt/samba/bin/samba-tool ntacl sysvolreset"
Vai precisa configurar seu ip e o path pra rodar o script de atualização, apontando pro arquivo sync.conf:
./upgrade-v1.0x-v1.2x.sh /etc/osync/sync.conf
Vai ficar semelhante ao modelo abaixo:
#!/usr/bin/env bash
INSTANCE_ID="sysvol_sync"
INITIATOR_SYNC_DIR="/opt/samba/var/locks/sysvol"
TARGET_SYNC_DIR="ssh://root@192.168.70.250:22250//opt/samba/var/locks/sysvol"
SSH_RSA_PRIVATE_KEY="/root/.ssh/id_rsa"
SSH_PASSWORD_FILE=""
_REMOTE_TOKEN="SomeAlphaNumericToken9"
CREATE_DIRS=false
LOGFILE=""
MINIMUM_SPACE="10240"
BANDWIDTH="0"
SUDO_EXEC=false
RSYNC_EXECUTABLE="rsync"
RSYNC_REMOTE_PATH=""
RSYNC_PATTERN_FIRST="include"
RSYNC_INCLUDE_PATTERN=""
RSYNC_EXCLUDE_PATTERN=""
RSYNC_INCLUDE_FROM=""
RSYNC_EXCLUDE_FROM=""
PATH_SEPARATOR_CHAR=";"
SSH_COMPRESSION=true
SSH_IGNORE_KNOWN_HOSTS=false
SSH_CONTROLMASTER=false
REMOTE_HOST_PING=false
Testar o sincronizmo (ignore o erro de email):
/usr/local/bin/osync.sh /etc/osync/sync.conf --dry --verbose
Rodar o sincronizmo de fato:
/usr/local/bin/osync.sh /etc/osync/sync.conf --verbose
Agendar no cron:
crontab -e
*/5 * * * * root bash /usr/local/bin/osync.sh /etc/osync/sync.conf --silent
Validando os logs em tempo real, rode o /usr/local/bin/osync.sh, mantendo outro terminal aberto com o comando:
tail -f /var/log/osync.sysvol_sync.log
THAT’S ALL FOLKS!!
FileServer com Samba4 no Debian Linux 13
Layout de rede usado no laboratório:
firewall 192.168.70.254 (enp1s0) - 192.168.122.254 (enp7s0) (ssh 2277)
dcmaster 192.168.70.250 (ssh 22250)
mkdocs 192.168.70.222 (ssh 22222)
dcslave 192.168.70.200 (ssh 22200)
fileserver 192.168.70.150 (ssh 22100)
; firewall Roteamento por Iptables
; dcmaster Controlador de Domínio primário
; mkdocs Servidor de Documentos
; dcslave Controlador de Domínio secundário
; fileserver Servidor de Arquivos
Instalando as dependências para compilação do código fonte do Samba4:
export DEBIAN_FRONTEND=noninteractive;apt-get update; apt-get install vim ntp net-tools rsync acl apt-utils attr autoconf bind9-utils binutils bison build-essential ntp rsync ccache chrpath curl debhelper bind9-dnsutils docbook-xml docbook-xsl flex gcc gdb git glusterfs-common gzip heimdal-multidev hostname htop krb5-config krb5-user lcov libacl1-dev libarchive-dev libattr1-dev libavahi-common-dev libblkid-dev libbsd-dev libcap-dev libcephfs-dev libcups2-dev libdbus-1-dev libglib2.0-dev libgnutls28-dev libgpgme-dev libicu-dev libjansson-dev libjs-jquery libjson-perl libkrb5-dev libldap2-dev liblmdb-dev libncurses-dev libpam0g-dev libparse-yapp-perl libpcap-dev libpopt-dev libreadline-dev libsystemd-dev libtasn1-bin libtasn1--5-dev libunwind-dev lmdb-utils locales lsb-release make mawk mingw-w64 patch perl perl-modules-5.40 pkg-config procps psmisc python3 python3-cryptography python3-dbg python3-dev python3-dnspython python3-gpg python3-iso8601 python3-markdown python3-matplotlib python3-pexpect python3-pyasn1 rsync sed tar tree uuid-dev wget xfslibs-dev xsltproc zlib1g-dev -y
Setando e validando o hostname do dcslave:
vim /etc/hostname
fileserver
hostname -f
fileserver.officinas.edu
Configurando o arquivo de hosts:
vim /etc/hosts
.0.0.1 localhost
127.0.1.1 fileserver.officinas.edu fileserver
192.168.70.150 fileserver.officinas.edu fileserver
192.168.70.200 dcslave.officinas.edu dcslave
192.168.70.222 mkdocs.officinas.edu mkdocs
192.168.70.250 dcmaster.officinas.edu dcmaster
192.168.70.254 firewall.officinas.edu firewall
Setando ip fixo no servidor dcslave:
vim /etc/network/interfaces
allow-hotplug enp1s0
iface enp1s0 inet static
address 192.168.70.150
netmask 255.255.255.0
gateway 192.168.70.254
Apontando o endereço do resolvedor de nomes principal da rede pro Controlador de domínio primário, dcmaster (temporário):
vim /etc/resolv.conf
domain officinas.edu
search officinas.edu.
nameserver 192.168.70.250 #(dcmaster)
nameserver 192.168.70.200 #(dcslave)
Bloqueando alteração do resolv.conf:
chattr +i /etc/resolv.conf
Validando a resolução de nomes pelo dcmaster:
nslookup officinas.edu
Server: 192.168.70.250
Address: 192.168.70.250#53
Name: officinas.edu
Address: 192.168.70.250
Name: officinas.edu
Address: 192.168.70.200
Relendo as configurações de rede:
systemctl restart networking
Validando o ip da placa:
ip -c addr
ip -br link
Baixando e compilando o código fonte do Samba4:
wget https://download.samba.org/pub/samba/samba-4.19.4.tar.gz
tar -xvzf samba-4.19.4.tar.gz
cd samba-4.19.4
./configure --prefix=/opt/samba
make && make install
Adicionando /opt/Samba ao path padrão do Linux, colando a linha completa ao final do .bashrc:
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/samba/bin:/opt/samba/sbin"
vim ~/.bashrc
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/samba/bin:/opt/samba/sbin"
Relendo o arquivo de profile:
source ~/.bashrc
Criando o daemon de inicialização do Samba4 com o sistema:
vim /etc/systemd/system/samba-ad-dc.service
[Unit]
Description=Samba4 Active Directory Slave Domain Controller
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
ExecStart=/opt/samba/sbin/samba -D
PIDFile=/opt/samba/var/run/samba.pid
[Install]
WantedBy=multi-user.target
chmod +x /etc/systemd/system/samba-ad-dc.service
Configurando o serviço de sincronização de horário, apontando pro Controlador de domínio primário, dcmaster:
mv /etc/ntpsec/ntp.conf{,.orig}
vim /etc/ntpsec/ntp.conf
driftfile /var/lib/ntpsec/ntp.drift
leapfile /usr/share/zoneinfo/leap-seconds.list
tos minclock 4 minsane 3
pool 192.168.70.250 iburst #(dcmaster)
restrict default kod nomodify nopeer noquery limited
restrict 127.0.0.1
restrict ::1
tinker panic 0 #(Usado SOMENTE em VMs)
systemctl restart ntp
ntpq -p
date
ATENÇÃO!! NÃO PROVISIONE O SAMBA DO FILESERVER!!
Atenção
Não provisione o Fileserver.
ATENÇÃO!! NÃO PROVISIONE O SAMBA DO FILESERVER!!
Configurando o /etc/krb5.conf:
# vim /etc/krb5.conf
[libdefaults] #(sem espaço no canto dessa linha)
dns_lookup_realm = false
dns_lookup_kdc = true
default_realm = OFFICINAS.EDU
Configurando o time server:
apt-get install ntp ntpdate -y
nano /etc/ntpsec/ntp.conf
# Relógio Local ( Nota: Este não é o endereço localhost! )
server 127.127.1.0
fudge 127.127.1.0 stratum 10
server 192.168.70.250 iburst prefer #(dcmaster)
driftfile /var/lib/ntp/ntp.drift
logfile /var/log/ntp
restrict default ignore
restrict 127.0.0.1
restrict 192.168.70.250 mask 255.255.255.255 nomodify notrap nopeer noquery
systemctl restart ntp
ntpq -p
date
Validando mapeamentos:
getent hosts fileserver
Configurando o smb.conf:
# vim /opt/samba/etc/smb.conf
# Define as informações do domínio.
[global]
workgroup = OFFICINAS
realm = officinas.edu
# Define que esse servidor não aceita acesso sem autenticação.
security = ADS
# Defique qual usuário no domínio se equivale ao root.
username map = /opt/samba/etc/user.map
# Parâmetros para que as permissões se comportem como o Windows.
# Herdando permissões e guardando credenciais de logins bem-sucedidos.
map acl inherit = yes
store dos attributes = yes
# Os VFS objects que serão usados.
vfs objects = acl_xattr acl_tdb
# Arquivo de configuração do kerberos e qual método será usado.
dedicated keytab file = /etc/krb5.keytab
kerberos method = secrets and keytab
# Configurações do backend para mapeamento de IDs para compatibilidade com Windows.
idmap config * : backend = tdb
idmap config * : range = 3000-7999
idmap config OFFICINAS: backend = rid
idmap config OFFICINAS: range = 10000-999999
# Define que o usuário root não precisa ser mapeado.
min domain uid = 0
# Shell padrão e diretório home padrão.
template shell = /bin/bash
template homedir = /home/%U
# Define o comportamento do Winbind.
winbind refresh tickets = yes
winbind use default domain = yes
winbind enum users = yes
winbind enum groups = yes
winbind cache time = 7200
winbind nss info = rfc2307
# Cada escrita de dados será seguida por um fsync() para garantir que os dados sejam gravados no disco. Usei em ext4 e xfs mas não testei no btrfs.
sync always = yes
strict sync = yes
# Onde serão gravados os logs e o nivel de detalhes.
log file = /var/log/samba/%m.log
log level = 3
[FILESERVER]
path = /home/fileserver
comment = Compartilhamentos da Rede
read only = No
browseable = yes
vfs objects = acl_xattr acl_tdb full_audit
full_audit:success = renameat rewinddir unlinkat
full_audit:prefix = %U|%I|%S
full_audit:failure = none
full_audit:facility = local4
full_audit:priority = alert
# PARÂMETROS USADOS NA AUDITORIA:
# Adiciona todos os vfs objects.
acl_xattr acl_tdb full_audit
# arquivos renomeados, diretórios renomeados, arquivos deletados.
renameat rewinddir unlinkat
# usuário, ip, ação.
%U|%I|%S
restart.samba
o Samba instalado em /opt/samba/ pode não ter permissão para gravar diretamente em /var/log/samba
mkdir -p /var/log/samba
chown root:root /var/log/samba
chmod 755 /var/log/samba
Ou aponte para um diretório interno, como:
log file = /opt/samba/var/logs/%m.log
Auditando arquivos deletados:
cat /var/log/syslog | grep unlinkat
tail -f /var/log/syslog | grep unlinkat #(Teste em tempo real).
Criando o diretório da rede:
mkdir /home/fileserver
chmod -R 0770 /home/fileserver
chown -R root:"domain admins" /home/fileserver
getfacl /home/fileserver
EXTRA! SE optar por uso de perfil móvel:
mkdir /opt/samba/var/lib/samba/profiles
chmod -R 0770 /opt/samba/var/lib/samba/profiles
chown -R root:"domain admins" /opt/samba/var/lib/samba/profiles
Adicionando o path do /opt/samba/etc/smb.conf:
Linkando as bibliotecas para mapeamento de usuários de sistema local e Samba4:
/opt/samba/sbin/smbd -b | grep LIBDIR
ln -s /opt/samba/lib/libnss_winbind.so.2 /lib/x86-64-linux-gnu
ln -s /lib/x86_64-linux-gnu/libnss_winbind.so.2 /lib/x86_64-linux-gnu/libnss_winbind.so
ldconfig
vim /etc/nsswitch.conf
passwd: files winbind
group: files winbind
shadow: files
Dando poderes de root ao Administrator:
nano /opt/samba/etc/user.map
!root=officinas.edu\Administrator
Criando o diretório de logs:
mkdir /var/log/samba
Validando a troca de tickets do Kerberos:
kinit Administrator
klist
Ingressando o Fileserver ao domínio:
net ads join -U Administrator
Subindo os serviços ao boot do Sistema:
/opt/samba/sbin/smbd && /opt/samba/sbin/nmbd && /opt/samba/sbin/winbindd
Adicionando o smbd ao boot do Linux:
cd /etc/systemd/system
vim smbd.service
[Unit]
Description=Samba SMBD FileServer
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
ExecStart=/opt/samba/sbin/smbd
PIDFile=/opt/samba/var/run/smbd.pid
[Install]
WantedBy=multi-user.target
Adicionando o nmbd ao boot do Linux:
cd /etc/systemd/system
vim nmbd.service
[Unit]
Description=Samba NMBD FileServer
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
ExecStart=/opt/samba/sbin/nmbd
PIDFile=/opt/samba/var/run/nmbd.pid
[Install]
WantedBy=multi-user.target
Adicionando o nmbd ao boot do Linux:
cd /etc/systemd/system
vim winbindd.service
[Unit]
Description=Samba WINBIND FileServer
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
ExecStart=/opt/samba/sbin/winbindd
PIDFile=/opt/samba/var/run/winbindd.pid
[Install]
WantedBy=multi-user.target
systemctl enable smbd.service nmbd.service winbindd.service
pkill smb && pkill nmb && pkill winbind
systemctl start smbd.service nmbd.service winbindd.service
echo "systemctl start smbd.service nmbd.service winbindd.service" > /sbin/start.samba
echo "systemctl stop smbd.service nmbd.service winbindd.service" > /sbin/stop.samba
echo "systemctl restart smbd.service nmbd.service winbindd.service" > /sbin/restart.samba
chmod +x /sbin/*.samba
Facilitando o boot dos serviços:
echo "systemctl start smbd.service nmbd.service winbindd.service" > /sbin/start.samba
echo "systemctl stop smbd.service nmbd.service winbindd.service" > /sbin/stop.samba
echo "systemctl restart smbd.service nmbd.service winbindd.service" > /sbin/restart.samba
chmod +x /sbin/*.samba
Responde agora com:
start.samba, restart.samba e stop.samba
Validando wbinfo e getent:
wbinfo --ping-dc
wbinfo -u
wbinfo -g
getent passwd Administrator
getent group "domain admins"
Criando o script de backup do /home/fileserver:
mkdir /media/HDEXTERNO
vim /opt/samba/bkpdiario.sh
#!/bin/bash
INICIO=`date +%d/%m/%Y-%H:%M:%S`
LOG=/var/log/samba/bkpfileserver_`date +%Y-%m-%d`.txt
echo " " >> $LOG
echo " " >> $LOG
echo "|-----------------------------------------------" >> $LOG
echo " Sincronizacao iniciada em $INICIO" >> $LOG
umount /media/HDEXTERNO
mount /dev/sdb1 /media/HDEXTERNO
rsync --delete -P -r -z -v /home/fileserver /media/HDEXTERNO/ >> $LOG
FINAL=`date +%d/%m/%Y-%H:%M:%S`
umount /media/HDEXTERNO
echo " Sincronizacao Finalizada em $FINAL" >> $LOG
echo "|-----------------------------------------------" >> $LOG
echo " " >> $LOG
echo " " >> $LOG
Adicionando o script ao crontab:
vim /etc/crontab
# Rotinas de backup diário do SAMBA4.
# Minuto/Hora/Dia/Mês/Dia_semana/Usuário/Comando
45 23 * * 1-5 root /opt/samba/bkpdiario.sh > /dev/null 2>&1
VAI MONTAR O HD EXTERNO, FAZER O BACKUP E DESMONTAR O HD EXTERNO!
THAT’S ALL FOLKS!!