SAMBA é um programa de computador, Desenvolvido inicialmente por Andrew Tridgell no ano de 1991, que simula um servidor Windows em um sistema operacional do tipo Unix (Linux, FreeBSD, MAC OS), permitindo que seja feito gerenciamento e compartilhamento de arquivos em uma rede Microsoft. Com a evolução do código, o software agregou outras funcionalidades, indo muito além do simples compartilhamento de arquivos e assumindo um papel mais completo e complexo nas redes corporativos.
Atualmente o SAMBA está na versão 4.x e, nesta versão, teve o seu código inteiramente reescrito, permitindo trazer inovações que eram muito esperadas, como as tecnologias do Active Directory (AD) da Microsoft. Houveram também mudanças na interação entre os serviços OpenLDAP, Kerberos e de DNS, o qual passou a ser integrado ao software e pode ser configurado internamente ou com um plugin - BIND ou BIND DLZ.
Esta reestruturação equiparou o servidor SAMBA 4 aos servidores da Microsoft, sendo possível a implementação de um servidor open source com o mesmo status de um Windows Server.
Neste artigo é explicado como instalar e configurar um servidor com SAMBA versão 4.x para poder oferecer um servidor Active Directory em uma rede de computadores. Este servidor permite a gestão de usuários, grupos, permissões, compartilhamentos, políticas (GPOs), etc.
REQUISITOS
- Um computador ou máquina virtual com instalação mínima do CentOS 7 e estações com Windows 10 que serão ingressadas no respectivo AD.
- Configurações básicas de rede previamente configurada e acesso a internet. Caso necessite auxílio para configuração, confira o tutorial “Configuração de Rede (CentOS 7)”, disponível em: http://soulinux.com/blog/item/9-configuracao-de-rede-hostname-e-dns-no-centos-rhel-7.
REFERÊNCIAS
<ethX>: Nome Interface de Rede (ex: ens18) | <Gateway>: IP Gateway de sua Rede (ex: 192.168.9.1) |
<EnderecoIP>: Endereço IP do Servidor SAMBA (ex: 192.168.9.3) | <DNS1>: DNS do AD (ex: 192.168.9.3, igual ao Servidor SAMBA) |
<MascaraRede>: Sua Máscara de Rede (ex: 255.255.255.0 ou /24) | <DNSFirewall>: DNS de sua Rede (ex: 192.168.9.1) |
<DominioLocal>: Seu Domínio AD (ex: soulinux.local) | <Hostname>: Nome de seu servidor (ex: srv-ad1) |
<Dominio>: Seu Domínio (ex: soulinux) | <SuaSenha>: Senha administrativa do SAMBA (ex: Ad-123456) |
CONFIGURAÇÕES INICIAIS
- Estando no terminal de seu CentOS 7 e como usuário root, atualize o seu sistema:
sudo yum update
- Nesta instalação vamos manter o SELINUX desativado, pois encontramos incompatibilidade com DNS. Edite o respectivo arquivo de configuração:
vi /etc/selinux/config
- Estando no arquivo de configuração, altere a linha SELINUX (ex: SELINUX=enforcing e troque por SELINUX=disabled).
#This file controls the state of SELinux on the system.
...
SELINUX=disabled
…
- Reinicie a máquina:
init 6
- Após o reinício, confira o status do selinux:
sestatus
- A mensagem de retorno do comando anterior, deve ser:
SELinux status: disabled
- Sugerimos desativar o firewall desta máquina:
sudo systemctl stop firewalld
sudo systemctl disable firewalld
INSTALAÇÃO E COMPILAÇÃO
- Como usuário root, instale o repositório "epel" e atualize novamente o seu sistema:
yum install epel-release
yum update
- Instalar os pacotes necessários para a compilação do Samba 4:
yum install openldap-devel pam-devel gcc wget libblkid-devel gnutls-devel readline-devel python-devel libaio-devel gdb krb5-workstation setroubleshoot-server setroubleshoot-plugins policycoreutils-python libsemanage-python popt-devel libxml2-devel pkgconfig libacl-devel libattr-devel keyutils-libs-devel zlib-devel perl-ExtUtils-MakeMaker perl-Parse-Yapp cups-devel bind bind-utils bind-sdb bind-devel bind-libs libxslt docbook-style-xsl autoconf python-crypto perl attr quota-devel ctdb-devel krb5-devel acl setools-libs-python setools-libs libpcap-devel libidn-devel libsepol-devel cyrus-sasl-devel avahi-devel mingw32-iconv gamin libcap-devel rpc2-devel glusterfs-devel python-dns e2fsprogs-devel sqlite-devel krb5-user bzip2 perl-Test-Base systemd-devel jansson-devel readline
- Download do código fonte (Estável) do Samba 4:
cd /usr/src
wget https://ftp.samba.org/pub/samba/samba-latest.tar.gz
- Após o download do arquivo, descompacte, acesse o respectivo diretório e inicie o processo de instalação e compilação:
tar -xzvf samba-latest.tar.gz
cd samba-<VersaoSamba>
./configure.developer
make
make install
- Antes de iniciar o provisionamento, faça os respectivos ajustes em relação ao Kerberos. Para não ocorrer um conhecido erro de provisionamento (ERROR(ldb): uncaught exception…).
mv /etc/krb5.conf /etc/krb5.conf.ORI
cp /usr/local/samba/share/setup/krb5.conf /etc/krb5.conf
- Inicie o provisionamento do SAMBA 4 como AD, digitando o seguinte:
/usr/local/samba/bin/samba-tool domain provision --use-rfc2307 --use-xattrs=yes --interactive
--use-RFC2307: Este argumento acrescenta POSIX atributos (UID/GID) para o esquema AD. Isto será necessário se você pretende autenticar Linux, BSD, OS X, além de Microsoft Windows.
--use-xattrs = yes: Esse argumento permite o uso de atributos unix estendidos (ACLs) para arquivos hospedados neste servidor. Se você não pretende ter compartilhamentos de arquivos no controlador de domínio, pode-se omitir essa opção (mas isso não é recomendado).
--interactive: Este parâmetro força a execução de forma interativa.
- Preencha os campos conforme a sua necessidade e caso as configurações de rede já estejam devidamente configuradas, com exceção do DNS, pressione [ENTER] e aceite o valor padrão. A senha deve ser preenchida com o mínimo de 8 caracteres e deve conter letras (maiúscula/minúscula), números e caracteres de pontuação devido à complexidade de senha estar ativa.
Realm: [<DominioLocal>]
Domain: [<Dominio>]
Server Role: [dc]
DNS Backend: BIND9_DLZ #Criado para grandes redes, resolve os nomes muito mais rápido.
Administrator password: <Sua-Senha>
- Depois de provisionado, utilizaremos a configuração kerberos gerada. Copie o arquivo de referência do Samba, para o atual arquivo de configuração:
cp /usr/local/samba/private/krb5.conf /etc/krb5.conf
- Confira se o seu conteúdo está como o mostrado abaixo:
cat /etc/krb5.conf
[libdefaults]
default_realm = <DominioLocal>
dns_lookup_realm = false
dns_lookup_kdc = true
SCRIPT DE INICIALIZAÇÃO
O SAMBA 4 não possui script de inicialização de forma nativa, deve-se então criar um script voltado para o seu respectivo ambiente (CentOS com Systemd). Podemos conferir as instruções diretamente na wiki oficial do projeto: https://wiki.samba.org/index.php/Managing_the_Samba_AD_DC_Service
- Nosso objetivo é criar um script para Systemd, então crie o arquivo “samba-ad-dc.service”:
vi /etc/systemd/system/samba-ad-dc.service
- Coloque o seguinte conteúdo:
[Unit]
Description=Samba Active Directory Domain Controller
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
ExecStart=/usr/local/samba/sbin/samba -D
PIDFile=/usr/local/samba/var/run/samba.pid
[Install]
WantedBy=multi-user.target
- Após criado o arquivo, recarregue as configurações do Systemd:
systemctl daemon-reload
- Como é script baseado em Systemd, suas funções de status, parada e inicialização, funcionam da mesma forma. Para iniciar manualmente o script recém-criado, execute o comando:
systemctl start samba-ad-dc
- Habilite o script para iniciar automaticamente na inicialização do sistema:
systemctl enable samba-ad-dc
- Faça o teste de verificação de conexão com o domínio:
/usr/local/samba/bin/smbclient //localhost/netlogon -UAdministrator%<Sua-Senha>
- A mensagem de retorno deve ser semelhante a:
Domain=[<DOMINIO>] OS=[] Server=[]
smb: \>
- Caso a conexão tenha sido realizada com sucesso, como mostrado na tabela acima, saia do console “smb: \>”, digitando:
exit
Obs: Caso esteja utilizando o seu servidor CentOS a partir de uma máquina virtual do Proxmox VE, um erro no comando “kinit Administrator”, deverá ser constatado que para o script, provavelmente por causa de incompatibilidade com interfaces VIRTIO. Para solucionar, utilize o antigo script de inicialização para CentOS 6 (Init Script).
AJUSTES DNS
Para a instalação do SAMBA como AD é necessário que o serviço DNS esteja disponível, ou seja, é um pré-requisito (dependência) para a instalação do AD. O AD utiliza o DNS para a nomeação de servidores e recursos, e também para resolução de nomes. Em nosso caso, o controle do DNS fica a cargo do serviço Bind, utilizando a interface DLZ (Dynamically Loadable Zones) onde sempre que o Bind precisar ele vai requisitar ao Samba as informações sobre aquele registro de DNS.
- O arquivo de configuração principal do BIND é o “/etc/named.conf”. Faremos uma cópia desse arquivo para manter o original em caso de problemas:
cp /etc/named.conf /etc/named.conf.ORI
- Vamos fazer algumas alterações no arquivo de configuração do DNS:
vim /etc/named.conf
- Na sessão "options", procure por "listen-on" e adicione ao endereço a opção “any;”.
listen-on port 53 { 127.0.0.1; any; };
- Ainda em "options" procure por “allow-query”, adicionando os endereços de rede que terão permissão para consultar o nosso servidor. Nessa configuração, vamos permitir que qualquer host consulte o DNS:
allow-query { any; };
- Caso seja necessário resolver hostnames externos que não são administrados pelo servidor que está sendo configurando, se faz necessário configurar servidores para onde o seu servidor DNS encaminhará esses hostnames. Em "options", crie a seção “forwarders” com uma lista de servidores de encaminhamento. Abaixo, um exemplo onde usamos um outro servidor DNS local (ex: Firewall pfSense) e os servidores de DNS do Google como forwarders:
forwarders {
<DNSFirewall>;
8.8.8.8;
8.8.4.4;
};
- Inclua no final do arquivo o respectivo “named.conf” do SAMBA 4 e saia salvando o respectivo arquivo:
include "/usr/local/samba/bind-dns/named.conf";
- Confira a versão do Bind:
yum info bind
- O resultado do comando, deve indicar a versão do Bind:
Plugins carregados: fastestmirror
...
Nome : bind
Arquitetura : x86_64
Versão : 9.9.4
Lançamento : 38.el7_3.3
...
- Conhecendo a versão corrente do Bind, deve-se agora descomentar a parte que corresponde a versão do Bind no arquivo de configuração. Edite novamente o "named.conf":
vim /usr/local/samba/bind-dns/named.conf
- Retire o comentário correspondente a versão e salve o respectivo arquivo:
# For BIND 9.9.x
database "dlopen /usr/local/samba/lib/bind9/dlz_bind9_9.so";
- Adicione o Bind à inicialização do sistema:
systemctl enable named
FERRAMENTA SAMBA-TOOL
- A ferramenta "samba-tool", permite o gerenciamento pelo terminal linux. A fim de poder utilizar este recurso a partir de qualquer diretório do sistema, deve-se criar um script no diretório “/etc/profile.d/“.
vim /etc/profile.d/samba-path.sh
- Coloque o seguinte conteúdo neste arquivo:
PATH=${PATH}:/usr/local/samba/bin:/usr/local/samba/sbin
- Defina permissão de execução para o script.
chmod +x /etc/profile.d/samba-path.sh
- Para funcionar as instruções informadas acima, reinicie o sistema:
init 6
TESTES DOS SERVIÇOS
- Novamente como usuário root, confira se a ferramenta “samba-tool” está sendo executada em qualquer diretório do sistema.
samba-tool
- Conferindo se serviços estão ativos (running):
systemctl status samba-ad-dc
systemctl status named
- Teste o acesso ao domínio "<DominioLocal>" (ex: soulinux.local):
nslookup <DominioLocal>
- Caso as etapas anteriores não apresentem erros, vá para a próxima etapa (Testes de Conexão). Caso tenha ocorrido algum erro, confira onde está o problema para proceder com a possível solução. Problemas comuns que podem acontecer nesta etapa:
- Configuração de rede errada: /etc/sysconfig/network-scripts/ifcfg-<ethX>
- Prioridade na resolução do DNS: /etc/resolv.conf
- Caso faça algum ajuste nas configurações de rede, reinicie a rede e refaça os testes anteriores:
systemctl restart network
- Testes de Conexão:
host -t SRV _ldap._tcp.<DominioLocal>.
host -t SRV _kerberos._udp.<DominioLocal>.
host -t A <DominioLocal>.
- Estes são os resultados dos comandos acima. Se forem diferentes, provavelmente a configuração DNS apresenta problemas:
_ldap._tcp.<DominioLocal> has SRV record 0 100 389 <Hostname>.<DominioLocal>.
_kerberos._udp.<DominioLocal> has SRV record 0 100 88 <Hostname>.<DominioLocal>.
<DominioLocal> has address <EnderecoIP>
- Autenticação Kerberos:
kinit Administrator
- Informe a respectiva senha (Ad-123456) e a mensagem de que a senha vai expirar em 41 dias, será mostrada.
Warning: Your password will expire in 41 days on Dia Mes Ano Hora:Minuto:Segundo
- Verificar quem já tem ticket:
klist -e
- O resultado deve ser semelhante a:
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: Administrator@<DOMINIOLOCAL>
Valid starting Expires Service principal
15-06-2017 12:47:14 15-06-2017 22:47:14 krbtgt/<DOMINIOLOCAL>@<DOMINIOLOCAL>
renew until 16-06-2017 12:47:01, Etype (skey, tkt): aes256-cts-hmac-sha1-96, aes256-cts-hmac-sha1-96
- Volte a editar o arquivo de configurações do DNS:
vim /etc/named.conf
- Na seção "Options", adicione a seguinte chave keytab e salve o respectivo arquivo:
tkey-gssapi-keytab "/usr/local/samba/private/dns.keytab";
- Definir permissão de grupo ao arquivo keytab:
chgrp named /usr/local/samba/private/dns.keytab
chmod g+r /usr/local/samba/private/dns.keytab
- Testar DNS:
/usr/local/samba/sbin/samba_dnsupdate --verbose
- O resultado deve ser semelhante a:
IPs: ['<EnderecoIP>']
Looking for DNS entry A <Hostname>.<DominioLocal> <EnderecoIP> as <Hostname>.<DominioLocal>.
Looking for DNS entry NS <DominioLocal> <Hostname>.<DominioLocal> as <DominioLocal>.
Looking for DNS entry NS _msdcs.<DominioLocal> <Hostname>.<DominioLocal> as _msdcs.<DominioLocal>.
Looking for DNS entry A <DominioLocal> <EnderecoIP> as <DominioLocal>.
…
Looking for DNS entry SRV _ldap._tcp.Default-First-Site-Name._sites.ForestDnsZones.soulinux.local srvarquivos.soulinux.local 389 as _ldap._tcp.Default-First-Site-Name._sites.ForestDnsZones.soulinux.local.
Checking 0 100 389 srvarquivos.soulinux.local. against SRV _ldap._tcp.Default-First-Site-Name._sites.ForestDnsZones.soulinux.local srvarquivos.soulinux.local 389
No DNS updates needed
SERVIDOR NTP (Chrony)
Sincronização de tempo é essencial para o bom funcionamento muitos serviços e aplicativos. O CentOS 7 utiliza como padrão o Chrony, que é uma implementação do protocolo NTP e que atualiza mesmo estando com problemas de rede (caso consiga fazer algumas conexões periódicas).
- Caso não esteja instalado, faça a instalação do Chrony:
yum install chrony
- Edite o arquivo de configuração do Chrony:
vim /etc/chrony.conf
- Comente as linhas referentes ao pool CentOS (centos.pool.ntp.org) e adicione os servidores NTP do registro.br:
# These servers were defined in the installation:
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
server a.ntp.br iburst
server b.ntp.br iburst
server c.ntp.br iburst
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
...
# Allow NTP client access from local network.
#allow 192.168/16
...
# Specify the key used as password for chronyc.
commandkey 1
- Após os ajustes, reinicie o serviço:
systemctl restart chronyd
- Para monitorar a correção do tempo, os comandos a seguir podem ser utilizados:
chronyc tracking
chronyc sources
Após concluídas as etapas de instalação, provisionamento e configuração inicial, deve-se agora partir para a criação dos grupos, pastas e usuários do AD, bem como a configuração do “smb.conf”. Mostraremos esses ajustes na parte 2 deste artigo.
Links:
https://wiki.samba.org/index.php/Samba_AD_DC_Troubleshooting
https://wiki.samba.org/index.php/Main_Page