Guia de configuração do Samba não-PDC

Se você pesquisar por "smb.conf" no Google achará uma infinidade de tutoriais mostrando arquivos gigantes de configuração, sempre com uma tonelada de opções inúteis e obsoletas (quando não prejudiciais), que são passados adiante por blogs, fóruns, sites, sem a mínima análise do seu conteúdo.

Minha motivação aqui é ir contra a maré do copiar/colar e explicar uma configuração enxuta, baseada em versões recentes do Samba (4.3.0 ou superior), para o comum cenário de tê-lo servindo algumas pastas na rede da sua casa ou escritório em um grupo de trabalho, sem atuar como controlador de domínio (PDC).

O primeiro conselho é não ir atrás dos smb.conf gigantes. Faça justamente o contrário: a partir de uma configuração mínima, vá adaptando até chegar no que for ideal. As opções padrão que o Samba usa para o que não estiver especificado no arquivo são na maioria dos casos suficientes e otimizadas. E use a ferramenta testparm, que é muito útil para enxugar baboseira do arquivo.

Comecemos por:

[global]
    workgroup = GRUPO
    server string =
    logging = systemd
    map to guest = Bad User
    load printers = No
    create mask = 0660
    directory mask = 0770
    strict allocate = Yes
    store dos attributes = Yes
    hide dot files = No
    ntlm auth = No

[Publico]
    path = /srv/samba/pub
    read only = No
    guest ok = Yes

Vamos a cada opção:

workgroup = GRUPO
Grupo de trabalho.

server string =
Retira a descrição do servidor (preferência pessoal).

logging = systemd
Logs são enviados para o journal. Em distribuições sem systemd, use logging = syslog.

map to guest = Bad User
Essa é uma opção importante. Por padrão, o Samba usa o modo de security = USER, que força todos os acessos ao servidor serem autenticados. Porém isso impossibilita compartilhamentos públicos para convidados, já que o Samba bloqueia todos os acessos que não confiram com um usuário local do servidor. A opção map to guest = Bad User faz o Samba, quando o usuário não existir no servidor, autenticar usando a conta configurada em guest account (que por padrão usa nobody). Com isso, usuários que possuem conta local no servidor são autenticados normalmente e os que não possuem passam a ter acesso apenas aos compartilhamentos com permissão para convidados, ou seja, que tenham guest ok = Yes.

load printers = No
Não lista impressoras eventualmente presentes.

create mask = 0660
directory mask = 0770
Definem globalmente as permissões Unix dos arquivos e pastas criadas pelos clientes. Estamos dando permissão total para o dono e grupo e nenhuma para os outros. Para os arquivos, não estamos configurando a permissão de execução — nada pior que ao tentar abrir qualquer coisa através do Linux ter que responder se quer "executar ou abrir" o arquivo. Não deixa de ser uma medida de segurança também.

strict allocate = Yes
Aloca arquivos com posix_fallocate()/fallocate()/fallocate64(). Melhora o desempenho de escrita e diminui a fragmentação (sim, sistemas de arquivos Linux fragmentam, ao contrário do mito que é muito difundido por aí). Atenção: só use essa opção com sistemas de arquivos que suportem pré-alocação persistente, como o EXT4, XFS e Btrfs. Nos demais, pode causar perda de desempenho.

store dos attributes = Yes
Faz o Samba emular a semântica do NTFS (atributos DOS, carimbos de data/hora) usando atributos estendidos (xattr) do sistema de arquivos Linux. EXT4, XFS e Btrfs têm atributos estendidos habilitados por padrão. Se você usar outro sistema de arquivos, confira suas opções de montagem para ver como habilitar. O Samba cria o atributo user.DOSATTRIB, que você pode visualizar com getfattr -n user.DOSATTRIB <arquivo|pasta>. Habilitada por padrão desde a versão 4.9.0.

hide dot files = No
Arquivo criados com um ponto no início do nome não são ocultados pelo Samba. Sem essa opção, é certo que cedo ou tarde seus usuários reclamarão que alguns arquivos "sumiram" do servidor. No mundo Windows, ponto no início do nome nada significa. Portanto, siga a semântica do Windows para evitar dor de cabeça.

ntlm auth = No
Suporta apenas autenticação NTLMv2. O parâmetro No foi renomeado a partir do Samba 4.7.0 para ntlmv2-only (No continua sendo aceito).

Crie a pasta e ajuste as permissões. A pasta terá como dono nobody:nobody (a opção -m do mkdir apenas aplica-se ao último diretório quando -p está presente).

# mkdir -p -m 0750 /srv/samba/pub
# chown nobody:nobody /srv/samba/pub

Se você usar o Fedora, CentOS e derivados, é necessário definir o rótulo correto na pasta compartilhada para o SELinux permitir o acesso:
(ver Colocar o Samba a funcionar com o SELinux)

# semanage fcontext -a -t samba_share_t '/srv/samba(/.*)?'
# restorecon -FRv /srv/samba

Pronto. Você tem agora o Samba com uma configuração enxuta e otimizada para um compartilhamento público sem autenticação.

COMPARTILHAMENTO PROTEGIDO POR SENHA

Para adicionar um compartilhamento protegido por senha, adicione o seguinte bloco ao smb.conf:

[Restrito]
    path = /srv/samba/priv
    valid users = +estagiarios +funcionarios
    read only = No

A ideia é ter dentro do compartilhamento "Restrito" diversas pastas, sendo cada uma acessível apenas por grupos específicos. Também não será permitido aos usuários alterar o nome da pasta raiz na qual possuam permissão de escrita.

# groupadd estagiarios
# groupadd funcionarios
# mkdir -p -m 0770 /srv/samba/priv/{estagiarios,funcionarios}
# chgrp estagiarios /srv/samba/priv/estagiarios
# chgrp funcionarios /srv/samba/priv/funcionarios
# restorecon -FRv /srv/samba

Criei os grupos "estagiarios" e "funcionarios" e pastas com o mesmo nome, associando-as aos grupos. Visto que estamos usando create mask = 0660 e directory mask = 0770, arquivos e pastas terão permissão de escrita para o grupo primário. Isso permite que todos os usuários de um mesmo grupo façam alterações no compartilhamento no qual têm permissão de acesso.

A proibição de alteração das pastas pai nós conseguimos com a permissão 0755 na pasta raiz do compartilhamento (/srv/samba/priv) — o umask padrão da conta root em todas as distribuições é 0022, assim o mkdir criará diretórios com permissão 0755 por padrão. Levando em conta que ela tem como dono root:root, todos os acessos provenientes dos usuários cairão na permissão dos outros, que está configurada para somente leitura.

Ao usar compartilhamentos com autenticação, é importante adicionar a opção guest only = Yes aos compartilhamentos que tenham guest ok = Yes, pois do contrário os arquivos e pastas criadas neles pelos usuários não-convidados (os que tiverem uma conta local no Samba) não usarão a conta nobody e será uma salada de proprietários/permissões. Como o objetivo do compartilhamento público é ser acessível a todos, tanto usuários autenticados quanto convidados, guest only = Yes resolve o problema forçando todos os acessos à pasta pública serem feitos através da conta nobody.

Outro cenário útil é ter a pasta pública somente leitura para todos, com exceção de determinados usuários e/ou grupos. Para conseguir esse resultado, remova read only = No (que equivalerá a read only = Yes) e adicione a opção write list = +grupo (permite escrita a um grupo), ou write list = usuario (permite escrita a um usuário). Você pode especificar mais de um grupo ou usuário (basta colocá-los um ao lado do outro separados por espaços ou vírgulas) e também misturar usuários e grupos, apenas tendo o cuidado de colocar o sinal "+" antes do nome dos grupos.

Por fim crie os usuários pertencendo aos grupos desejados:

# useradd -M -g estagiarios -s /sbin/nologin fulano
# useradd -M -g funcionarios -s /sbin/nologin beltrano
# smbpasswd -a fulano
# smbpasswd -a beltrano

SEGURANÇA DOS PROTOCOLOS DE AUTENTICAÇÃO

A partir do Samba 4.5.0, autenticação NTLMv1 passou a ser desativada no servidor (ntlm auth = No). Na versão 4.7.0, o parâmetro No foi renomeado para ntlmv2-only, para corretamente refletir seu comportamento (aceitar apenas NTLMv2). Como resultado, restringe a gama de clientes suportados à família Windows NT a partir do NT 4.0 SP4 e Samba 3.0.0 e superiores. Windows 9x/ME e DOS ficam de fora: nem NTLMv1 suportam; trabalham com LANMAN, que não possui segurança alguma e é desativado por padrão desde o Samba 3.2.0.

A propósito, em muitos dos arquivos smb.conf gigantes que achamos por aí, o método de autenticação LANMAN está ativado no servidor (lanman auth = Yes). É uma péssima configuração de segurança. Se você tiver compartilhamentos que exijam autenticação, não existe motivo para arruinar a segurança para dar suporte a sistemas operacionais obsoletos cuja probabilidade de você vir a usar é zero. Felizmente essa maléfica configuração não tem efeito caso a autenticação NTLMv1 esteja desativada.

Windows 10 1709 descontinuou o inseguro protocolo SMB 1.0, que não vem mais instalado. Do Samba 4.0.0 para cima, SMB 2.0 e 3.0 são suportados e o servidor negocia com o cliente a melhor versão a ser usada na conexão. Não use a opção server max protocol (antiga max protocol), pois é desnecessária!

REFERÊNCIAS

Recomendo o livro Using Samba, 3rd Edition, de Gerald Carter, Jay Ts e Robert Eckstein, lançado em 2007 pela O'Reilly. Apesar de ser um pouco antigo (usa como referência o Samba 3.0.22), é um livro bem escrito e com muita informação útil.

Comentários

  1. Estou na area de informatica há 38 anos (acredite se quiser), já ví centenas de dicas, blog's etc e tal, mas com cderteza seu Blog é o que melhor existe na minha opinião, existem é claro blogs excelentes na europa e EUA, mas aquí no Brasil não tem prá ninguém. Sou Linuxista entusiasta (Fedora e Ubuntu) e venho de MainFrame IBM - Burrough's e etc e tal, depois fui para UNix (grande Unix), sempre que quero acompanhar novidades e dicas interessantes consulto seu Blog. meus Parabéns...!

    ResponderExcluir
    Respostas
    1. Obrigado, Brasilio. Fico feliz que o conteúdo seja útil.

      Excluir
  2. Muito ótimo. Simplicidade e praticidade. Se todos começassem do básico como neste guia fica mais simples partir para o mais avançado. Obrigado.

    ResponderExcluir
  3. Valeu pelas informações meu caro! SETGID salvou minha vida haha!

    ResponderExcluir
  4. marcos parabéns excelente !!! explicativo e ao mesmo tempo prático como nenhum outro! abraço

    ResponderExcluir
  5. Reformei o texto. Criando os usuários com o grupo primário correto permite evitar o uso de SETGID e inherit permissions, o que simplifica a configuração.

    ResponderExcluir

Postar um comentário