209.1 Configuração do Servidor Samba
Introdução
O Samba é um conjunto de programas para Linux/Unix que fornece uma interoperabilidade para o Windows, ou seja, é um serviço (ou conjunto de serviços) que rodam no Linux/Unix mas que possuem uma compatibilidade com Windows. A principal função do samba, apesar de não se limitar a isso, é fornecer um compartilhamento de arquivos e impressoras para dispositivos Windows (usando os protocolos usados pelo Windows, que são SMB/CIFS).
O Samba possui mais funções como o AD, que inclui um LDAP, controle de autenticação com Kerberos, sistema de DNS, NTP e muito mais. Com relação ao AD do Windows, o Samba pode ser um AD ou pode se integrar a um AD já existente.
Vamos começar fazendo a instalação do Samba.
- CentOS 7
- Ubuntu 20.04
$ sudo yum install samba samba-client -y
## samba-client é usado para se conectar no samba (como uma pasta compartilhada).
# Inicie o serviço:
$ sudo systemctl start smb nmb
# Coloque o serviço para subir na inicialização:
$ sudo systemctl enable smb nmb
# Para verificar se está rodando podemos ver o serviço:
$ systemctl status smb
● smb.service - Samba SMB Daemon
Loaded: loaded (/usr/lib/systemd/system/smb.service; disabled; vendor preset: disabled)
Active: active (running) since Tue 2023-04-11 22:03:31 UTC; 37s ago
Docs: man:smbd(8)
man:samba(7)
man:smb.conf(5)
Main PID: 3662 (smbd)
Status: "smbd: ready to serve connections..."
CGroup: /system.slice/smb.service
├─3662 /usr/sbin/smbd --foreground --no-process-group
├─3664 /usr/sbin/smbd --foreground --no-process-group
├─3665 /usr/sbin/smbd --foreground --no-process-group
└─3666 /usr/sbin/smbd --foreground --no-process-group
● nmb.service - Samba NMB Daemon
Loaded: loaded (/usr/lib/systemd/system/nmb.service; disabled; vendor preset: disabled)
Active: active (running) since Tue 2023-04-11 22:20:15 UTC; 4s ago
Docs: man:nmbd(8)
man:samba(7)
man:smb.conf(5)
Main PID: 3700 (nmbd)
Status: "nmbd: ready to serve connections..."
CGroup: /system.slice/nmb.service
└─3700 /usr/sbin/nmbd --foreground --no-process-group
Apr 11 22:20:15 lpic2-centos7 systemd[1]: Starting Samba NMB Daemon...
Apr 11 22:20:15 lpic2-centos7 nmbd[3700]: [2023/04/11 22:20:15.752509, 0] ../../lib/util/become_d...ady)
Apr 11 22:20:15 lpic2-centos7 systemd[1]: Started Samba NMB Daemon.
Apr 11 22:20:15 lpic2-centos7 nmbd[3700]: daemon_ready: daemon 'nmbd' finished starting up and r...ions
Hint: Some lines were ellipsized, use -l to show in full.
$ sudo apt install samba samba-client -y
## samba-client é usado para se conectar no samba (como uma pasta compartilhada).
# Para verificar se está rodando podemos ver o serviço:
$ systemctl status smbd nmbd
● smbd.service - Samba SMB Daemon
Loaded: loaded (/lib/systemd/system/smbd.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2023-04-11 21:50:25 UTC; 36s ago
Docs: man:smbd(8)
man:samba(7)
man:smb.conf(5)
Main PID: 21353 (smbd)
Status: "smbd: ready to serve connections..."
Tasks: 4 (limit: 460)
Memory: 13.0M
CGroup: /system.slice/smbd.service
├─21353 /usr/sbin/smbd --foreground --no-process-group
├─21355 /usr/sbin/smbd --foreground --no-process-group
├─21356 /usr/sbin/smbd --foreground --no-process-group
└─21357 /usr/lib/x86_64-linux-gnu/samba/samba-bgqd --ready-signal-fd=45 --parent-watch-fd=1>
Apr 11 21:50:25 ubuntu2004.localdomain systemd[1]: Starting Samba SMB Daemon...
Apr 11 21:50:25 ubuntu2004.localdomain update-apparmor-samba-profile[21347]: grep: /etc/apparmor.d/samba>
Apr 11 21:50:25 ubuntu2004.localdomain update-apparmor-samba-profile[21350]: diff: /etc/apparmor.d/samba>
Apr 11 21:50:25 ubuntu2004.localdomain systemd[1]: Started Samba SMB Daemon.
● nmbd.service - Samba NMB Daemon
Loaded: loaded (/lib/systemd/system/nmbd.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2023-04-11 21:50:25 UTC; 29min ago
Docs: man:nmbd(8)
man:samba(7)
man:smb.conf(5)
Main PID: 21333 (nmbd)
Status: "nmbd: ready to serve connections..."
Tasks: 1 (limit: 460)
Memory: 3.9M
CGroup: /system.slice/nmbd.service
└─21333 /usr/sbin/nmbd --foreground --no-process-group
Apr 11 21:50:24 ubuntu2004.localdomain systemd[1]: Starting Samba NMB Daemon...
Apr 11 21:50:25 ubuntu2004.localdomain systemd[1]: Started Samba NMB Daemon.
O SMBD é o principal serviço Samba, sua função é gerenciar os compartilhamentos (arquivos e impressoras), já o NMBD é responsável por fornecer serviços de resolução de nomes NetBIOS (Network Basic Input/Output System) para os clientes da rede que usam o protocolo NetBIOS.
O NetBIOS é mais usado pelos sistemas operacionais Windows antigos. Sua função é resolver os nomes NetBIOS em endereços IP e vice-versa, permitindo que os computadores se comuniquem entre si usando o protocolo NetBIOS.
O SMBD usa as portas 139 e 445 TCP;
O NMBD usa as portas 137 e 138 UDP;
Caso precise debugar, o Samba armazena os logs em /var/log/samba
por padrão. Já o arquivo de configuração fica em /etc/samba/smb.conf
.
Estrutura de configuração
A configuração do Samba é segmentada em seções, onde a seção principal é nomeada como [global]
, as configurações aqui se aplicam para todo o Samba, algumas opções aqui são:
Opção | Descrição |
---|---|
workgroup | Define o grupo de trabalho, configuração importante para entrar no AD. |
wins | Fornece um serviço de tradução de Nomes NetBIOS em IP, gerenciado pelo NMBD como explicado acima. |
log file | Para informar ao Samba onde armazenar os logs. |
server role = standalone server | Fazer o Samba trabalhar como se fosse um AD, não dependendo de outros servidores na Rede. |
unix password sync = yes | O Samba vai mudar a senha no Linux/Unix quando ele mudar a senha no Samba, para que ambos fiquem com a mesma senha. |
Além das configurações Globais, ainda temos as configurações de compartilhamento, que são específicas para determinado compartilhamento no Samba. Cada compartilhamento possui um nome, mas um deles é especial e veremos com certa frequência, é o [printers]
que define o compartilhamento das impressoras e o [homes]
que define um compartilhamento da Home de cada usuário, onde um usuário só possa acessar a sua Home.
Compartilhamento de Diretórios
Vamos fazer um compartilhamento, uma das etapas mais simples mas uma das mais importantes.
Compartilhamento do Home
Vamos começar configurando o compartilhamento do Home dos usuários:
# Primeiro acesse o arquivo abaixo:
$ sudo vim /etc/samba/smb.conf
# Agora vamos adicionar a configuração abaixo, no meu arquivo não possui outra configuração para '[homes]', então essa vai ser a primeira:
[homes]
comment = Homes Directories
browseable = no
read only = yes
create mask = 0700
directory mask = 0700
valid users = %S
# Para testar crie um usuário de teste:
$ sudo useradd -m -s /bin/nologin fulano
useradd: Warning: missing or non-executable shell '/bin/nologin'
## Fiz dessa forma para que esse usuário não consiga logar via SSH!
# Defina uma senha para esse usuário:
$ sudo passwd fulano
New password:
Retype new password:
passwd: password updated successfully
# Adicione o usuário ao Samba:
$ sudo smbpasswd -a fulano
New SMB password:
Retype new SMB password:
Added user fulano.
## Caso precise mudar a senha:
$ sudo smbpasswd fulano
# Verifique se está tudo certo com a configuração:
$ sudo testparm
Segue uma explicação para cada opção usada:
Opção | Descrição |
---|---|
comment | Comentário para o compartilhamento. |
browseable | Não exibir esse compartilhamento quando buscar por diretórios compartilhados na Rede, para acessar ele, você deve saber da existência dele. |
read only | Esse diretório vai ser somente leitura? No nosso caso sim, então não será possível editar arquivos a menos que seja administrador. |
writeable | Substitui o read only , mas a premissa de uso é invertida, aqui é se vai poder escrever. |
create mask | Permissão padrão para os arquivos criados no compartilhamento do Samba. |
directory mask | Permissão padrão para os diretórios criados no compartilhamento do Samba. |
valid users | Quem são os usuários que podem logar nesse compartilhamento?. O S% indica que é apenas o próprio usuário. |
Podemos testar via terminal mesmo:
# Teste o compartilhamento do Home. Faça dessa mesma forma, mudando o usuário:
$ smbclient //192.168.1.153/fulano -U fulano
Password for [WORKGROUP\fulano]:
Try "help" to get a list of possible commands.
smb: \>
Outra forma é usando o Nautilus do Ubuntu por exemplo:
# Faça dessa mesma forma, mudando o usuário:
smb://192.168.1.153/fulano
Uma tela similar a imagem abaixo vai aparecer, preencha os dados e tecle connect
.
Essa configuração que usamos para a home são configurações básicas, uma configuração um pouco mais segura pode ser visto abaixo:
[homes]
comment = Home Directories
path = /samba/%S
valid users = %S, %D%w%S
browseable = No
read only = No
inherit acls = Yes
Opção | Descrição |
---|---|
path | Caminho onde estão as homes dos usuários, %S é uma variável que é substituída pelo nome de usuário do usuário que está acessando o compartilhamento. |
valid users | Quem poderá acessar esse compartilhamento. As flgas %S, %D%w%S significam que o usuário atual e qualquer usuário no mesmo domínio (indicado pelo "%D") e no mesmo endereço IP (indicado pelo "%w") também terão permissão para acessar seus próprios diretórios pessoais. |
inherit acls = Yes | Define se as permissões de acesso a arquivos/diretórios serão herdadas do diretório pai. Neste caso, as permissões de acesso serão herdadas do diretório físico que contém os diretórios pessoais dos usuários. |
Usando o comando abaixo é possível verificar quais são os compartilhamentos que um usuário tem acesso, se algum compartilhamento tiver browseable = no
não será listado:
$ smbclient -L //192.168.1.153 -U fulano
Password for [WORKGROUP\fulano]:
Sharename Type Comment
--------- ---- -------
print$ Disk Printer Drivers
IPC$ IPC IPC Service (ubuntu2004 server (Samba, Ubuntu))
fulano Disk Homes Directories
SMB1 disabled -- no workgroup available
Compartilhamento do Public
Vamos configurar um compartilhamento que seja público, para que todos possam acessar:
# Primeiro acesse o arquivo abaixo:
$ sudo vim /etc/samba/smb.conf
# Agora vamos adicionar a configuração:
[public]
comment = Public Directory
browseable = yes
path = /samba/public
read only = no
guest ok = yes
# Ainda podemos configurar um diretório de Logs:
[Logs]
comment = Logs Directory
browseable = no
path = /samba/logs
read only = yes
valid users = fulano
# Verifique se está tudo certo com a configuração:
$ sudo testparm
Compartilhamento Oculto no Windows
No Linux/Unix é usado a opção browseable = no
para tornar o compartilhamento oculto, mas no Windows isso é feito colocando um $
(cifrão) no final do nome do compartilhamento.
# Primeiro acesse o arquivo abaixo:
$ sudo vim /etc/samba/smb.conf
# Agora vamos adicionar a configuração:
[oculto$]
comment = Public Directory
browseable = no
path = /samba/oculto
read only = no
guest ok = yes
Montagem Remota de Compartilhamentos
Vamos ver como fazer a montagem de um compartilhamento automaticamente, como por exemplo a Home.
# No Cliente instale o pacote abaixo (vou usar um Centos7 como cliente, no Debian é o mesmo nome):
$ sudo yum install cifs-utils
# Agora monte usando o comando 'mount':
$ sudo mount -t cifs //192.168.1.153/fulano -o username='fulano' /mnt
Password for fulano@//192.168.1.153/fulano: ***********
# Veja se deu certo:
$ df -h /mnt
Filesystem Size Used Avail Use% Mounted on
//192.168.1.153/fulano 124G 11G 113G 9% /mnt
# Podemos passar a senha em texto puro:
$ sudo mount -t cifs //192.168.1.153/fulano -o username='fulano',password='123456' /mnt
Agora vamos ver como colocar isso no fstab
:
# Edite o 'fstab':
$ sudo vim /etc/fstab
# Adicione a linha:
//192.168.1.153/fulano /mnt cifs user,credentials=/home/vagrant/cifs.acesso 0 0
# Agora no arquivo referenciado:
$ vim /home/vagrant/cifs.acesso
# Adicione:
username=fulano
password=123456
# Para montar usando fstab podemos fazer assim:
$ sudo mount -a
# Verifique se montou:
$ df -hT /mnt
Filesystem Type Size Used Avail Use% Mounted on
//192.168.1.153/fulano cifs 124G 11G 113G 9% /mnt
Compartilhamento de Impressoras
Vamos ver como compartilhar uma impressora usando o Samba. Por padrão a configuração de compartilhamento de impressoras já vem habilitada.
# Edite o arquivo abaixo:
$ sudo vim /etc/samba/smb.conf
# A configuração abaixo faz o compartilhamento de impressoras:
[printers]
comment = All Printers
browseable = no
path = /var/spool/samba
printable = yes
guest ok = no
read only = yes
create mask = 0700
# Já a configuração abaixo é usada para clientes Windows conseguirem obter os drivers da impressora:
[print$]
comment = Printer Drivers
path = /var/lib/samba/printers
browseable = yes
read only = yes
guest ok = no
## Pode ser que você precise mudar o local dos drivers para 'path = /usr/share/cups/drv'.
Mapeamento de Usuários
Vamos ver como usar o Username Map, é um recurso do Samba que permite mapear um nome de usuário no Samba para outro nome de usuário. Isso é útil quando vários usuários precisam ter acesso a um mesmo usuário dentro do Samba ou quando o nome de usuário no Windows é diferente do nome de usuário no Samba.
Ainda existem outras aplicações para esse recurso, vou deixar um link oficial para esse recurso.
Vamos começar configurando um arquivo para ser o nosso mapa:
# Edite o arquivo abaixo:
$ sudo vim /etc/samba/smb.conf
# Adicione a opção abaixo na seção Global:
username map = /etc/samba/username.map
# Agora edite esse arquivo:
$ sudo vim /etc/samba/username.map
# Adicione a configuração abaixo:
fulano = bob
Nessa configuração estamos dizendo que fulano
é igual a bob
, ou seja, quando acessar o Samba usando o nome de bob
ele será mapeado para fulano
. O username usado no Samba sempre fica a esquerda e o username que queremos mapear sempre fica a direita.
Ainda é possível colocar mais de um username na mesma linha:
fulano = bob alice
Vamos testar:
# Podemos ver que 'Bob' possui acesso a home de 'fulano' (use a mesma senha de fulano para acessar):
$ smbclient -L //192.168.1.153 -U bob
Enter SAMBA\bob's password:
Sharename Type Comment
--------- ---- -------
print$ Disk Printer Drivers
public Disk Public Directory
IPC$ IPC IPC Service (ubuntu2004 server (Samba, Ubuntu))
fulano Disk Homes Directories
Agora veja se com Alice funciona:
$ smbclient -L //192.168.1.153 -U alice
Enter SAMBA\alice's password:
Sharename Type Comment
--------- ---- -------
print$ Disk Printer Drivers
public Disk Public Directory
IPC$ IPC IPC Service (ubuntu2004 server (Samba, Ubuntu))
fulano Disk Homes Directories
Configurações de Segurança
Vamos ver os modos de segurança que o Samba disponibiliza, atualmente são 5 modos de segurança. Para usar isso, temos que configurar na seção Global a opção security
.
Os modos de segurança são:
user
Este é o modo de segurança mais comum usado no Samba e é o padrão também. Aqui cada usuário que se conecta ao servidor precisa fornecer um nome de usuário e uma senha válida para acessar os compartilhamentos e recursos do servidor.
O acesso aos compartilhamentos é concedido com base nas permissões definidas pelo administrador.share
O acesso aos compartilhamentos é concedido a qualquer usuário que possua as credenciais corretas, aceitando somente a senha, sem necessitar de um username explicito do usuário.
O servidor vai esperar receber uma senha para cada compartilhamento, independente do nome de usuário. Usuários de Windows reportaram vários problemas com este modo e os desenvolvedores do Samba não recomendam seu uso.
Este modo de segurança é menos seguro que o modo `user`, pois não exige autenticação individual de cada usuário que acessa os compartilhamentos.domain
O mododomain
é semelhante ao modouser
, mas em vez de armazenar as informações de autenticação do usuário localmente no servidor Samba, ele usa um servidor de domínio externo para autenticar os usuários e gerenciar suas permissões de acesso aos compartilhamentos.
Este é um modo muito interessante caso queira usar um sistma de autenticação centralizado como FreeIPA.ADS
Este modo permite que o servidor Samba seja integrado a um domínio Active Directory (AD). Neste modo, os usuários se autenticam usando suas credenciais de AD, e as permissões de acesso aos compartilhamentos são gerenciadas pelo AD. Esse modo é particularmente útil em ambientes de rede complexos, onde há vários servidores Samba e/ou servidores Windows que precisam se integrar a um único domínio AD.server
Este modo de segurança permite que o servidor Samba seja configurado como um servidor autônomo, sem depender de um servidor de autenticação externo, como um servidor de domínio. Neste modo, os usuários se autenticam usando as credenciais armazenadas localmente no servidor Samba.
Este modo de segurança é mais adequado para ambientes de rede pequenos ou redes em que a autenticação centralizada não é necessária.
Ingressando o Samba como membro do AD
Vamos fazer o Samba fazer ingressar num domínio AD já existente, para isso é necessário criar um AD usando Windows Server.
No Samba vamos instalar e configurar ele para ingressar no AD:
# Instale o pacote abaixo:
$ sudo apt install winbind libpam-winbind libnss-winbind krb5-config -y
# Edite o arquivo abaixo:
$ sudo vim /etc/nsswitch.conf
## Adicione o 'winbd':
passwd: files systemd winbd
group: files systemd winbd
# Configure o Samba para usar o servidor DNS que tem no AD:
$ sudo vim /etc/resolv.conf
# Edite o arquivo abaixo:
$ sudo vim /etc/pam.d/common-session
## No final do arquivo adicione:
session optional pam_mkhomedir.so skel=/etc/skel umask=077
# Agora vamos configurar o Samba:
$ sudo vim /etc/samba/smb.conf
## As configurações abaixo devem ficar na seção Global:
workgroup = exemplo
security = ads
realm = exemplo.com.br
netbios name = server-samba # Nome do host visto pelo AD.
# Agora reinicie todos os serviços:
$ sudo systemctl restart winbind nmbd smbd
# Agora vamos ingressar no domínio do AD:
$ sudo net ads join -U Administrator
# Para testar se ingressou podemos testar:
$ wbinfo --ping-dc
checking the NETLOGON for domain[EXEMPLO] dc connection to "windows-server.exemplo.com.br" succeeded
Comandos importantes
Opção | Descrição |
---|---|
pdbedit -L | Lista os usuários que estão no Samba |
sudo testparm | Verifique se existem erros de sintaxe no arquivo de configuração do Samba. |
smbcontrol | Usado para controlar o Samba. |
smbcontrol all reload-config | Faz todos os destinos relerem a configuração. |
smbcontrol all kill-client-ip IP | Mata uma sessão de um usuário no Samba. |
smbstatus | Mostra detalhes das conexões no Samba . |
Em
smbcontrol
o parâmetroall
significa nmbd, smbd e winbindd.
Abaixo seguem comandos importante para se trabalhar com uma máquina que está ingressada num AD ou usada como PDC.
Opção | Descrição |
---|---|
nmblookup | Usado para resolução de Nomes dentro no NetBIOS, fornece mais opções de informação. |
samba-tool | Ferramenta para administrar o Samba, muito usada quando o Samba é um PDC. |
samba-tool dbcheck | Verifica se existem erros no banco de dados do AD. |
samba-tool proccess | Lista os processos. |
net | É uma ferramente para administrar o Samba e servidores CIFS remotos. |
net -S localhost -U username share | Mostra os compartilhamentos de um usuário. |
net -S windows-server time | Mostra a hora do servidor AD (Nesse caso se chama windows-server ). |
Opções de configuração
Opção | Descrição |
---|---|
comment | Comentário para o compartilhamento. |
browseable | Não exibir esse compartilhamento quando buscar por diretórios compartilhados na Rede, para acessar ele, você deve saber da existência dele. |
read only | Esse diretório vai ser somente leitura? No nosso caso sim, então não será possível editar arquivos a menos que seja administrador. |
writeable | Substitui o read only , mas a premissa de uso é invertida, aqui é se vai poder escrever. |
create mask | Permissão padrão para os arquivos criados no compartilhamento do Samba. |
directory mask | Permissão padrão para os diretórios criados no compartilhamento do Samba. |
valid users | Quem são os usuários que podem logar nesse compartilhamento?. O S% indica que é apenas o próprio usuário. |
path | Caminho onde estão as homes dos usuários, %S é uma variável que é substituída pelo nome de usuário do usuário que está acessando o compartilhamento. |
valid users | Quem poderá acessar esse compartilhamento, no caso, se tratando de usuários. As flgas %S, %D%w%S significam que o usuário atual e qualquer usuário no mesmo domínio (indicado pelo "%D") e no mesmo endereço IP (indicado pelo "%w") também terão permissão para acessar seus próprios diretórios pessoais. |
inherit acls = Yes | Define se as permissões de acesso a arquivos/diretórios serão herdadas do diretório pai. Neste caso, as permissões de acesso serão herdadas do diretório físico que contém os diretórios pessoais dos usuários. |
guest ok = yes | Vai permitir que usuários que não estejam no Samba acessem o compartilhamento. |
printable = yes | Permite abrir, escrever e enviar arquivos para impressão. É uma configuração mais usada no segmento de impressoras, para que os clientes possam imprimir. |
Fontes importantes
https://en.wikipedia.org/wiki/Administrative_share#cite_note-hidden-create-delete-1
https://www.samba.org/samba/docs/current/man-html/smb.conf.5.html#PRINTABLE
https://www.server-world.info/en/note?os=Debian_9&p=samba&f=3
https://pt.wikipedia.org/wiki/Controlador_de_dom%C3%ADnio