Skip to content

📁 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!!