segunda-feira, 20 de fevereiro de 2012

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 (3.5 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á customizando 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 =
    map to guest = Bad User
    max log size = 0
    max protocol = SMB2
    load printers = No
    create mask = 0660
    directory mask = 0770
    strict allocate = Yes
    store dos attributes = Yes

[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).

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.

[Atualização - 25/03/2015] Removi a opção log file = /var/log/samba/log.%m. Vem por padrão no arquivo de configuração, mas pensando melhor não vejo motivo para criar um arquivo separado para cada cliente. Sem a opção, os logs ficam concentrados em log.smbd e log.nmbd dentro de /var/log/samba. A partir do Samba 4.3.0 é possível desativá-los usando a opção logging (até o 4.2 não tínhamos como) e enviar logs exclusivamente para o daemon syslog.

max log size = 0
Não rotaciona logs. É tarefa do logrotate.

max protocol = SMB2
Faz o Samba usar o protocolo SMB2 para comunicar-se com clientes Windows Vista, 7, Server 2008 (R2). Está disponível a partir do Samba 3.6.0. [Atualização - 26/01/2013] A partir do Samba 4.0.0, não use mais essa opção. Mais informações aqui.

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

create mask = 0660
directory mask = 0770
Definem globalmente, para todos os compartilhamentos que não usem inherit permissions = Yes, 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
Disponível a partir do Samba 3.5.7, faz o Samba usar as funções posix_fallocate()/fallocate()/fallocate64() da glibc para alocar arquivos. 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>. [Atualização - 14/10/2015] Removidas as opções map archive = No e map readonly = No. São desnecessárias com store dos attributes = Yes. A documentação da versão 4.1 esclareceu a questão.

Crie a pasta e ajuste as permissões. A pasta terá como dono root:root e o usuário nobody terá acesso completo através da permissão para os "outros".

# mkdir -p /srv/samba/pub
# chmod 777 /srv/samba/pub

Se você usar o Fedora 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
    inherit permissions = Yes

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 /srv/samba/priv/{estagiarios,funcionarios}
# chgrp estagiarios /srv/samba/priv/estagiarios
# chgrp funcionarios /srv/samba/priv/funcionarios
# chmod 775 /srv/samba/priv
# chmod 2770 /srv/samba/priv/{estagiarios,funcionarios}

Criei os grupos "estagiarios" e "funcionarios" e pastas com o mesmo nome, associando-as aos grupos. Defini inherit permissions = Yes no compartilhamento. Detalhe importante é permissão "2770". O número "2" configura o SETGID na pasta, que resulta em todos os arquivos e supastas herdarem o grupo de origem (o proprietário não é herdado). Assim, se um usuário, digamos, "fulano", membro do grupo "estagiarios", criar um arquivo (ou pasta), este terá como dono fulano:estagiarios e permissões "2770" nas subpastas (o SETGID também é propagado) e "0660" nos arquivos (o Samba intencionalmente não herda o bit de execução para arquivos com inherit permissions = Yes). 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 "775" na pasta raiz do compartilhamento (/srv/samba/priv). 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 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 e coloque-os nos grupos desejados:

# adduser fulano
# adduser beltrano
# smbpasswd -a fulano
# smbpasswd -a beltrano
# gpasswd -a fulano estagiarios
# gpasswd -a beltrano funcionarios

Com SELinux ativo, não esqueça de fazer um relabel depois de criar novas pastas dentro de /srv/samba:
([Atualização - 23/02/2012] Se você já o fez anteriormente, é desnecessário, pois todos os arquivos e diretórios criados automaticamente herdam o rótulo samba_share_t)

# restorecon -FRv /srv/samba

SEGURANÇA DOS PROTOCOLOS DE AUTENTICAÇÃO

A partir do Samba 3.6.0, a opção client ntlmv2 auth passou a ser habilitada por padrão, significando que, ao atuar como cliente, apenas servidores que suportem autenticação NTLMv2 funcionam. Como resultado, restringe a gama de servidores 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 (lançado em 1º de julho de 2008). Já vão tarde...

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.

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.

[Atualização - 18/12/2015] A seção sobre segurança dos protocolos de autenticação tinha erros. Agora acho que está tudo certo com as versões. Esclarecer que os arquivos de log podem ser suprimidos a partir do Samba 4.3.0.

5 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