Configuração Avançada do Samba no Linux: Guia Detalhado para Compartilhamento Seguro e Eficiente

 

Configuração Avançada do Samba no Linux: Guia Detalhado para Compartilhamento Seguro e Eficiente



O Samba é uma suíte de software livre fundamental que implementa o protocolo SMB/CIFS (Server Message Block / Common Internet File System) em sistemas operacionais do tipo Unix, como o Linux. Ele permite que máquinas Linux compartilhem arquivos e impressoras com clientes Windows, macOS e o
utros sistemas Linux de forma transparente, funcionando como um servidor de arquivos e impressão em redes heterogêneas.

Enquanto uma configuração básica do Samba pode ser relativamente simples, este guia avançado destina-se a administradores de sistema e usuários experientes que buscam aprofundar seus conhecimentos, explorando configurações de segurança robustas, integração com Active Directory, gerenciamento granular de acesso e otimizações de performance.

Pré-requisitos:

  • Conhecimento básico de administração de sistemas Linux (terminal, gerenciamento de pacotes, permissões de arquivos).
  • Acesso root ou sudo ao servidor Linux.
  • Compreensão de conceitos básicos de rede (endereçamento IP, firewall).

1. Instalação do Samba

Os pacotes do Samba estão disponíveis nos repositórios da maioria das distribuições Linux.

Para Debian/Ubuntu e derivados:

Bash
sudo apt update
sudo apt install samba samba-client cifs-utils -y

Para RHEL/CentOS/Fedora e derivados:

Bash
sudo dnf install samba samba-client samba-common cifs-utils -y # Para Fedora e RHEL/CentOS 8+
# ou
sudo yum install samba samba-client samba-common cifs-utils -y # Para CentOS 7 e RHEL 7

Após a instalação, os principais serviços do Samba (smbd e nmbd) geralmente precisam ser habilitados e iniciados:

Bash
sudo systemctl enable smb
sudo systemctl enable nmbd
sudo systemctl start smb
sudo systemctl start nmbd

Verifique o status:

Bash
sudo systemctl status smb
sudo systemctl status nmbd

2. Entendendo o Arquivo de Configuração smb.conf

A configuração principal do Samba reside no arquivo /etc/samba/smb.conf. Este arquivo é dividido em seções:

  • [global]: Contém configurações que se aplicam a todo o servidor Samba.
  • Seções de Compartilhamento (Ex: [publico], [documentos]): Definem diretórios ou impressoras específicas a serem compartilhadas, com suas respectivas configurações de acesso e permissões.
  • Seções Especiais (Ex: [homes], [printers]): Compartilhamentos com funcionalidades predefinidas.

É uma boa prática fazer um backup do arquivo original antes de realizar modificações:

Bash
sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bkp

3. Configuração Global Avançada ([global])

A seção [global] é crucial para definir o comportamento geral do servidor Samba.

Ini, TOML
[global]
# --- Identificação na Rede ---
workgroup = GRUPODETRABALHO # Ou o nome do seu domínio NT4/Workgroup. Se for integrar com AD, será o nome NetBIOS do domínio.
server string = Servidor de Arquivos Samba Avançado %v # %v insere a versão do Samba
netbios name = MEUSERVIDORLINUX # Nome NetBIOS do servidor
# --- Segurança ---
security = user # Padrão e recomendado. Usuários precisam se autenticar.
# Outras opções: ads (para Active Directory), domain (para NT4 domain member)
passdb backend = tdbsam # Backend para senhas. tdbsam é o padrão. smbpasswd é mais antigo.
# ldapsam para integração com LDAP (não AD).
map to guest = Bad User # Mapeia logins inválidos para o usuário guest (se guest ok = yes)
# --- Logging ---
log file = /var/log/samba/log.%m # Arquivo de log por máquina cliente (%m)
max log size = 1000 # Tamanho máximo do log em KB antes de rotacionar
log level = 1 auth:3 winbind:2 # Nível de detalhe do log. Aumente para depuração.
# --- Protocolo SMB ---
server min protocol = SMB2_10 # Versão mínima do protocolo SMB a ser suportada
server max protocol = SMB3 # Versão máxima do protocolo SMB a ser suportada
# (Use SMB3 para melhor segurança e performance com clientes modernos)
# --- Rede ---
# interfaces = lo eth0 192.168.1.0/24 # Especifica em quais interfaces o Samba escutará
# bind interfaces only = yes # Garante que o Samba só escute nas interfaces listadas
# --- Interoperabilidade e Performance ---
# socket options = TCP_NODELAY SO_RCVBUF=131072 SO_SNDBUF=131072
# use sendfile = yes
# strict locking = no # Pode ser 'auto' ou 'yes' dependendo da necessidade de locking
# oplocks = yes
# level2 oplocks = yes
# read raw = yes
# write raw = yes
# --- Impressão (se for compartilhar impressoras via Samba) ---
# load printers = yes
# printing = cups
# printcap name = cups
# --- Para integração com Windows ACLs (mais avançado) ---
# vfs objects = acl_xattr
# map acl inherit = yes
# store dos attributes = yes

Observações Importantes na Seção [global]:

  • security = user: Este é o modo mais comum e seguro para compartilhamentos que exigem autenticação. Cada usuário precisará ter uma conta no sistema Linux e uma senha Samba correspondente.
  • passdb backend: tdbsam é o padrão moderno. Se você estiver migrando de uma configuração muito antiga, pode encontrar smbpasswd.
  • server min/max protocol: Essencial para segurança. Desabilitar SMB1 (NT1) é altamente recomendado devido a vulnerabilidades. Use SMB2 e SMB3 sempre que possível.

4. Criação e Gerenciamento de Usuários Samba

Com security = user, os usuários Samba devem primeiro existir como usuários no sistema Linux. Depois, suas senhas para o Samba são gerenciadas separadamente com o utilitário smbpasswd.

  1. Crie um usuário Linux (se ainda não existir):

    Bash
    sudo adduser nome_do_usuario
    

    (Siga as instruções para definir a senha do sistema e outras informações).

  2. Adicione o usuário ao banco de dados do Samba e defina uma senha Samba:

    Bash
    sudo smbpasswd -a nome_do_usuario
    

    Você será solicitado a digitar uma nova senha para o Samba para este usuário. Esta senha pode ser diferente da senha de login do sistema Linux.

Outros comandos smbpasswd úteis:

  • sudo smbpasswd -x nome_do_usuario: Exclui um usuário do Samba.
  • sudo smbpasswd -d nome_do_usuario: Desabilita um usuário Samba.
  • sudo smbpasswd -e nome_do_usuario: Habilita um usuário Samba previamente desabilitado.
  • sudo smbpasswd nome_do_usuario: Permite que um usuário (ou root) altere a senha Samba de nome_do_usuario.

5. Configurando Compartilhamentos Seguros e Avançados

Defina cada compartilhamento em sua própria seção no smb.conf.

Exemplo 1: Compartilhamento Privado Autenticado

Suponha que você tenha um diretório /srv/samba/documentos_confidenciais que deve ser acessível apenas por usuario1 (leitura/escrita) e usuario2 (apenas leitura).

Primeiro, crie o diretório e defina as permissões Linux apropriadas:

Bash
sudo mkdir -p /srv/samba/documentos_confidenciais
sudo chown root:users /srv/samba/documentos_confidenciais # Exemplo: dono root, grupo 'users'
sudo chmod 770 /srv/samba/documentos_confidenciais # Permissões para dono e grupo, nenhum para outros

(Ajuste o proprietário e grupo conforme sua política. usuario1 e usuario2 devem ser membros do grupo users ou ter permissões específicas via ACLs Linux.)

Adicione ao smb.conf:

Ini, TOML
[documentos_privados]
comment = Documentos Confidenciais da Equipe
path = /srv/samba/documentos_confidenciais
browseable = yes
writable = no # Padrão é não permitir escrita globalmente
read only = yes # Sinônimo de writable = no
# Controle de Acesso
valid users = usuario1, usuario2, @grupo_gerencia # Permite acesso a estes usuários e membros do grupo_gerencia
write list = usuario1, @grupo_gerencia # Permite escrita para usuario1 e grupo_gerencia
# usuario2 terá apenas leitura (não está no write list)
admin users = admin_samba # Usuário com privilégios de administrador neste share
# Permissões de Arquivos e Diretórios
create mask = 0664 # Permissões para novos arquivos (rw-rw-r--)
directory mask = 0775 # Permissões para novos diretórios (rwxrwxr-x)
force user = usuario_padrao # Força que todos os arquivos sejam criados como este usuário (cuidado)
force group = grupo_padrao # Força que todos os arquivos sejam criados com este grupo (cuidado)

Explicação dos Parâmetros de Compartilhamento:

  • comment: Descrição do compartilhamento.
  • path: Caminho absoluto para o diretório no servidor Linux.
  • browseable: Se o compartilhamento será listado quando os clientes navegarem na rede (sim/não).
  • writable (ou write ok): Se o compartilhamento permite escrita. read only = yes é o mesmo que writable = no.
  • valid users: Lista de usuários e/ou grupos (prefixados com @) que têm permissão para acessar o compartilhamento.
  • write list: Lista de usuários/grupos que têm permissão de escrita, mesmo que writable = no ou read only = yes esteja definido globalmente para o share.
  • read list: Lista de usuários/grupos que têm permissão apenas de leitura.
  • admin users: Usuários que terão privilégios de root dentro deste compartilhamento (use com extrema cautela).
  • create mask / directory mask: Define as permissões Unix máximas para novos arquivos e diretórios criados via Samba. O Samba combina isso com as permissões solicitadas pelo cliente.
  • force user / force group: Força a propriedade de todos os arquivos/diretórios criados neste compartilhamento para o usuário/grupo especificado, independentemente de quem os criou. Útil para garantir consistência de permissões em compartilhamentos de equipe.

Exemplo 2: Compartilhamento de Diretórios Home ([homes])

Esta seção especial mapeia automaticamente o diretório home de um usuário Linux quando ele se conecta.

Ini, TOML
[homes]
comment = Diretório Home do Usuário
browseable = no # Geralmente não se quer listar todos os homes
read only = no # Usuário deve ter permissão de escrita em seu próprio home
create mask = 0700 # Apenas o dono tem permissão total
directory mask = 0700 # Apenas o dono tem permissão total
valid users = %S # %S é substituído pelo nome do usuário da sessão
# Mantenha este compartilhamento seguro, geralmente acessível apenas pelo próprio usuário

Quando um usuário autenticado se conecta a \\servidor\nome_do_usuario, o Samba automaticamente compartilha o diretório home dele (/home/nome_do_usuario).

Exemplo 3: Compartilhamento de Impressoras ([printers])

Se você configurou o CUPS (Common Unix Printing System) no seu servidor Linux.

Ini, TOML
[printers]
comment = Todas as Impressoras
path = /var/spool/samba
browseable = yes
guest ok = yes # Ou no, se quiser autenticação para imprimir
writable = no
printable = yes
# create mask = 0700 # Para arquivos de spool
[print$]
comment = Drivers de Impressora
path = /var/lib/samba/printers # Local para armazenar drivers de impressora para Windows
browseable = yes
read only = yes
guest ok = no
# write list = @ntadmins, root # Quem pode adicionar drivers

6. Integração com Active Directory (como Member Server)

Integrar o Samba como um servidor membro de um domínio Active Directory (AD) permite que usuários do AD acessem os compartilhamentos Samba usando suas credenciais de domínio. Este é um cenário avançado.

Pré-requisitos:

  • Um domínio Active Directory funcional.
  • Servidor Linux com horário sincronizado com o DC (via NTP).
  • Resolução DNS correta (o servidor Linux deve conseguir resolver os nomes do domínio AD e dos DCs).
  • Pacotes necessários: samba, realmd, sssd, krb5-user, adcli, samba-common-bin, samba-libs, samba-winbind-clients. (Os nomes podem variar ligeiramente entre distribuições).

Passos Gerais (Podem variar significativamente entre distribuições e versões):

  1. Instalar Pacotes Adicionais:

    Bash
    # Debian/Ubuntu
    sudo apt install realmd sssd sssd-tools adcli krb5-user samba-common-bin packagekit
    # RHEL/CentOS/Fedora
    sudo dnf install realmd sssd sssd-tools adcli krb5-workstation samba-common-tools
  2. Configurar /etc/krb5.conf (geralmente realmd ajuda com isso): Pode ser necessário configurar o realm Kerberos manualmente ou deixar o realmd descobrir.

  3. Juntar-se ao Domínio: Use realm join:

    Bash
    sudo realm discover SEUDOMINIO.COM
    sudo realm join -U usuario_admin_do_dominio SEUDOMINIO.COM

    Você será solicitado a senha do usuario_admin_do_dominio. Alternativamente, net ads join:

    Bash
    sudo net ads join -U usuario_admin_do_dominio
    
  4. Configurar smb.conf para AD: A seção [global] precisará de ajustes significativos:

    Ini, TOML
    [global]
    workgroup = NOMENETBIOSDODOMINIO # Ex: EMPRESA
    realm = SEUDOMINIO.COM # Ex: EMPRESA.LOCAL
    security = ads
    # Configurações de ID Mapping com SSSD/Winbind
    # (Esta parte é complexa e depende da sua configuração SSSD/Winbind)
    # Exemplo usando SSSD (preferível para sistemas modernos):
    idmap config * : backend = tdb
    idmap config * : range = 100000-1999999
    idmap config SEUNOMENETBIOSDODOMINIO : backend = sss # ou rid, ou ad
    idmap config SEUNOMENETBIOSDODOMINIO : range = 2000000-29999999 # Ajuste o range
    # idmap config SEUNOMENETBIOSDODOMINIO : schema_mode = rfc2307
    # idmap config SEUNOMENETBIOSDODOMINIO : unix_primary_group = yes
    kerberos method = secrets and keytab # ou system keytab
    # dedicated keytab file = /etc/krb5.keytab
    # client signing = yes
    # client use spnego = yes
    # winbindd use default domain = yes
    winbind enum users = yes
    winbind enum groups = yes
    winbind refresh tickets = yes
    # winbind offline logon = yes
    # Para permitir acesso a usuários do domínio sem criar contas locais manualmente:
    # (Requer configuração SSSD apropriada para prover usuários e grupos do AD ao sistema)
    # template shell = /bin/bash
    # template homedir = /home/%D/%U
    # ACLs
    vfs objects = acl_xattr
    map acl inherit = yes
    store dos attributes = yes

    A configuração de idmap é crítica e complexa. Ela define como os SIDs do Windows são mapeados para UIDs/GIDs do Unix. sssd é geralmente preferido sobre winbind para idmapping em sistemas modernos. Consulte a documentação do Samba e do SSSD para sua distribuição.

  5. Configurar sssd (se estiver usando): O arquivo /etc/sssd/sssd.conf precisará ser configurado para o seu domínio AD. Isso envolve definir domínios, provedores de identidade (id_provider = ad), provedores de acesso (access_provider = ad), etc.

  6. Reiniciar Serviços:

    Bash
    sudo systemctl restart sssd smb nmbd
    
  7. Verificar Integração:

    • wbinfo -u (para listar usuários do domínio via Winbind)
    • wbinfo -g (para listar grupos do domínio via Winbind)
    • getent passwd nome_usuario_do_dominio
    • getent group "nome_do_grupo_do_dominio"

Agora, nos seus compartilhamentos, você pode usar usuários e grupos do AD em valid users, write list, etc. Ex: valid users = "SEUDOMINIO\usuario" @"SEUDOMINIO\grupo_do_ad".

7. Segurança Adicional

  1. Firewall: Configure seu firewall para permitir o tráfego Samba.
    • firewalld (Fedora, RHEL, CentOS):
      Bash
      sudo firewall-cmd --permanent --add-service=samba
      sudo firewall-cmd --reload
    • ufw (Ubuntu, Debian):
      Bash
      sudo ufw allow samba
      # ou especificar portas:
      # sudo ufw allow 137/udp
      # sudo ufw allow 138/udp
      # sudo ufw allow 139/tcp
      # sudo ufw allow 445/tcp
      sudo ufw enable
  2. SELinux (Security-Enhanced Linux): Se o SELinux estiver no modo enforcing, você precisará configurar os contextos corretos para os diretórios compartilhados e habilitar booleans do Samba:
    • Definir o contexto para o diretório compartilhado:
      Bash
      sudo semanage fcontext -a -t samba_share_t "/srv/samba/nome_do_compartilhamento(/.*)?"
      sudo restorecon -Rv /srv/samba/nome_do_compartilhamento
    • Habilitar booleans para permitir que o Samba compartilhe diretórios e diretórios home:
      Bash
      sudo setsebool -P samba_export_all_ro=1 samba_export_all_rw=1 # Para leitura/escrita geral
      sudo setsebool -P samba_enable_home_dirs=1 # Se estiver usando [homes]
    • Verifique os logs do SELinux (/var/log/audit/audit.log ou usando ausearch) se houver negações.
  3. AppArmor: Distribuições como Ubuntu usam AppArmor. Normalmente, os perfis padrão do Samba já permitem as operações necessárias, mas se você mover o smb.conf ou os diretórios compartilhados para locais não padrão, pode precisar ajustar os perfis em /etc/apparmor.d/.

8. Diagnóstico e Manutenção

  • testparm: Verifica a sintaxe do seu arquivo smb.conf.
    Bash
    testparm
    
  • smbclient: Um cliente SMB de linha de comando para testar o acesso aos compartilhamentos.
    • Listar compartilhamentos em um servidor:
      Bash
      smbclient -L //localhost -U nome_do_usuario
      # ou
      smbclient -L //ip_do_servidor -U nome_do_usuario
    • Conectar a um compartilhamento:
      Bash
      smbclient //localhost/nome_do_compartilhamento -U nome_do_usuario
      
  • smbstatus: Mostra as conexões Samba atuais, arquivos bloqueados e informações da sessão.
    Bash
    sudo smbstatus
    
  • Logs do Samba: Localizados em /var/log/samba/ (ou conforme definido em log file). Aumentar o log level na seção [global] para depuração.

9. Considerações de Performance (Breve)

Para ambientes com alta demanda, algumas otimizações podem ser consideradas no smb.conf (na seção [global]):

Ini, TOML
socket options = TCP_NODELAY IPTOS_LOWDELAY SO_RCVBUF=131072 SO_SNDBUF=131072
use sendfile = yes
aio read size = 1
aio write size = 1
read raw = yes
write raw = yes
oplocks = yes
level2 oplocks = yes

Nota: Teste cuidadosamente qualquer alteração de performance, pois o impacto pode variar dependendo da sua rede, hardware e carga de trabalho.

Conclusão

Configurar o Samba de forma avançada oferece um controle granular sobre segurança, acesso e funcionalidade, tornando-o uma solução poderosa para integração em redes corporativas e para usuários domésticos que exigem mais de seus compartilhamentos de arquivos. A integração com Active Directory, o gerenciamento preciso de permissões e a atenção aos aspectos de segurança como firewall e SELinux/AppArmor são cruciais para um ambiente robusto e confiável.

Lembre-se sempre de testar exaustivamente suas configurações e consultar a documentação oficial do Samba (man smb.conf) para obter detalhes sobre parâmetros específicos e cenários de configuração. A flexibilidade do Samba é uma de suas maiores forças, permitindo adaptá-lo a uma vasta gama de necessidades.

Postar um comentário