Compartilhando arquivos com o Samba

(Last Updated On: 14 de novembro de 2017)

Uma empresa me contratou para resolver um problema com seu servidor de arquivos. Toda a rede da empresa utiliza Linux, desde os servidores até as máquinas clientes.

Contudo sócio começou a trabalhar alguns dias da semana na empresa com seu notebook particular, que utiliza Windows como sistema operacional.

Ela precisa acessar alguns arquivos do servidor para realizar seu trabalho. Então vamos conectá-la na rede e falar para tentar acessar o servidor via seu endereço:

Hum… não conseguimos acessar o compartilhamento, por quê?

Sistemas Windows, por padrão, não conseguem se comunicar com sistemas Linux. Isso porque os protocolos usados são diferentes.

Enquanto redes Windows utilizam o NetBIOS (Network Basic Input/Output System) para compartilhar os arquivos na rede, sistemas Linux utilizam o NFS (Network File System). Esses dois protocolos, por padrão, não conseguem se comunicar.

Então como podemos fazer para que esse computador acesse nosso compartilhamento no Linux?

Bem, existe um programa chamados Samba que consegue realizar o compartilhamento de arquivos e impressoras entre redes Linux e Windows. Realiza isso por meio do protocolo SMB.

Esse protocolo permite a comunicação e compartilhamento de arquivos e impressoras na rede.

Mas, antes de mais nada, precisamos adicionar o samba em nossa máquina!

Instalando o Samba

Para instalar o Samba basta abrir o terminal e falar para seu gerenciador de pacotes instalá-lo. No meu caso, o sistema do servidor é um Linux CentOs que utiliza o YUM. Portanto:

yum install samba

Pronto! Samba instalado, temos que dizer para ele como fazer o compartilhamento. Lembra que o Samba utiliza o protocolo SMB para realizar os compartilhamentos? Então vamos configurar como o Samba realizará o compartilhamento por meio desse protocolo.

Para isso podemos usar o arquivo do próprio Samba chamado: smb.conf. Este arquivo fica no diretório /etc/samba.

Algumas vezes esse arquivo vem com um exemplo de configuração, porém como vamos fazer a nossa própria configuração, podemos apagá-la.

Vimos que mesmo conectando o computador na rede, ele não tem acesso ao compartilhamento. Isso porque nosso servidor não faz parte do mesmo grupo de trabalho (workgroup) do computador.

Podemos dizer isso para o Samba, especificando qual o grupo de trabalho do compartilhamento.

Mas temos que configurar esse grupo de trabalho em todas as pastas que forem compartilhadas?

Não, esses tipos de configurações globais podemos configurá-las uma única vez. Para isso abrimos uma seção global ([global]).

Neste caso, o nome do grupo de trabalho será o caminho do servidor no domínio:


[global]
    workgroup = servidor01.acme.corp

Como as máquinas Windows saberão quem é o servidor rede? Ele precisa de um nome certo?

O Windows utiliza uma API chamada NetBIOS para nomear as máquinas em sua rede. Como queremos dizer o nome do servidor, podemos usar o netbios name:


[global]
    workgroup = servidor01.acme.corp
    netbios name = servidor01

Acabamos nossas configurações globais. Hum… mas ainda não especificamos qual será o compartilhamento… Como podemos fazer isso?

Para especificar o compartilhamento, basta abrir outra seção, como abrimos em [global] , só que agora com o nome do compartilhamento.

No meu caso, eu quero compartilhar a pasta pública, logo, vou chamar meu compartilhamento assim.


[global]
    workgroup = servidor01.acme.corp
    netbios name = servidor01

[publica]

Mas não basta dizer qual o nome do compartilhamento, temos que dizer onde o diretório compartilhado se encontra no servidor. Ou seja, precisamos dizer o caminho (path) até a pasta.

Neste caso, a pasta se chama publica, e está dentro de outra pasta chamada compartilhamento:


[global]
    workgroup = servidor01.acme.corp
    netbios name = servidor01

[publica]
    path = /compartilhamento/publica

E como o computador Windows conseguirá achar essa pasta? Precisamos falar que esse diretório poderá ser encontrado (browseable):


#Configurações globais
[publica]
    path = /compartilhamento/publica
    browseable = yes

O sócio da empresa precisa salvar e alterar alguns arquivos que estão contidos nesta pasta. Logo ela precisa escrever (writable) essas mudanças, isto é, salvá-las de fato.

Ou seja, se ela consegue escrever essas informações, o diretório não é apenas para a leitura dos arquivos (read only).


#Configurações globais
[publica]
    path = /compartilhamento/publica
    browseable = yes
    writable = yes
    read only = no

Configurações terminadas! Mas como o Samba vai saber que esta é a configuração para ser utilizada?

Nós podemos reiniciar o serviços que fazem parte do Samba, dessa forma ele já passa a usar a nossa configuração. O Samba usa dois serviços para realizar o compartilhamento. Um já vimos, é o smb, o outro é chamado de nmb.

O nmb é o serviço que entende as requisições feitas pela API NetBIOS.

Então vamos falar para o sistema (systemctl) reiniciar (restart) esses dois serviços (smb.service e nmb.service):

systemctl restart smb.service

systemctl restart nmb.service

Também precisamos habilitar o compartilhamento no firewall. Do contrário os computadores não conseguirão acessá-lo.

Vamos então passar um comando para nosso firewall (firewall-cmd), que será permanente (--permanent) na zona pública (--zone=public) que adiciona o serviço do Samba (–add-service=samba):

firewall-cmd --permanent --zone=public --add-service=samba

Feito isso, temos que reiniciar nosso firewall:

firewall-cmd --reload

Tudo certo! Samba configurado, firewall também. Vamos tentar acessar nosso serviço de compartilhamento em um Windows.

Para isso, basta digitar no explorador de arquivos o endereço do servidor. No meu caso esse endereço é o: 192.168.0.10. Temos que usar duas barras invertidas antes do endereço (\\):

\\192.168.0.10

Hum… não apareceu nosso compartilhamento… Por quê?

No CentOs existe uma camada extra de segurança chamada SELinux. Nós temos que habilitar o serviço do Samba nessa camada também, além do firewall.

Para isso, basta dizer que queremos mudar o contexto do SELinux (chcon, change context) , do nosso serviço do tipo (-t) compartilhamento utilizando o Samba (samba_share_t) na nossa pasta pública (/compartilhamento/publica):

chcon -t samba_share_t /compartilhamento/publica

Vamos tentar acessar novamente o nosso compartilhamento:

Ainda não conseguimos acessar o compartilhamento… Por quê?

O Samba faz um mapeamento de usuários. Por padrão apenas usuários do domínio podem acessar o compartilhamento.

Podemos resolver esse problema de duas formas:

  • A primeira seria colocar esse computador Windows no domínio, porém esse é o notebook particular da esposa do dono da empresa. Se colocássemos esse computador no domínio todas as vezes que ela fosse usar fora da empresa, teria que tirá-lo do domínio, o que não seria viável.
  • Outra forma é mudar o modo como o Samba mapeia esses usuários. Dessa forma conseguimos fazer com que usuários que não estão no domínio acessem o compartilhamento.

Como essa configuração ocorre para todos os diretórios compartilhados ela é realizada na seção global.

Nela, podemos falar que o mapeamento do usuário (map to guest), poderá receber membros fora do domínio, desde que estejam autenticados.

Bem para isso podemos usar a opção Bad User:


[global]
    workgroup = servidor01.acme.corp
    netbios name = servidor01
    map to guest  = Bad User

A opção Bad User permite que um usuário acesse o compartilhamento depois de realizar uma autenticação.

Mas como o Samba realizará essa autenticação?

Nós podemos adicionar esse novo usuário no sistema e no Samba. Assim, quando o Samba exigir uma autenticação esse novo usuário poderá ser usado.

Vamos adicionar esse novo usuário no sistema (adduser). No meu caso, vou chamá-lo de user.

adduser user

Pronto! Adicionamos o usuário no sistema. Porém ainda precisamos adicionar ao Samba… como podemos fazer isso?

Adicionando usuários no samba

O Samba oferece um programa que podemos usar para alterar a senha e/ou adicionar usuários ao seu sistema.

Esse programa é chamado de smbpasswd. Por padrão ele altera a senha de usuários no Samba. Porém, utilizando o parâmetro -a (adicionar) ele adiciona um novo usuário já cadastrado no sistema.

Assim, podemos adicionar o usuário que acabamos de inserir.

smbpasswd -a user

Já que alteramos o arquivo de configuração, temos que reiniciar os serviços do Samba novamente.

Perfeito! Agora se tentarmos acessar o compartilhamento. Basta digitar o usuário e senha:

Sucesso! Conseguimos acessar o compartilhamento!

Vamos tentar adicionar um arquivo nesta pasta para testar essa funcionalidade:

Não conseguimos, mesmo com a permissão writable no arquivo do Samba… está buggado, ou nós fizemos alguma coisa errada?

No Linux, quando uma pasta é criada, são atribuídos automaticamente algumas permissões ao diretório.

Conseguimos ver as permissões de uma pasta utilizando o comando ls (list) com o parâmetro -l (lista longa).

ls -l /compartilhamento

A saída do comando ls nos retorna algumas informações sobre os arquivos ou diretórios. Essas informações são divididas em colunas, a primeira coluna nos mostra o tipo e as permissões do arquivo ou diretório.

A primeira letra nos indica que é um diretório (d), as demais nos mostram as permissões. Essas são divididas em três partes, as do usuário dono, as do grupo dono e as dos demais usuários.

Cada letra significa um tipo de permissão:

  • r → Leitura (read);
  • w → Escrita (write);
  • x → Execução (execute).

Caso não tenha essa permissão é apresentado como um traço (-) no lugar da letra.

Se analisarmos essas informações vamos perceber que nem o grupo dono do arquivo, ou os demais usuários conseguem escrever na pasta, isto é, criar diretórios ou arquivos.
Para resolver esse problema, podemos utilizar um programa chamado chmod (change mode).

Com esse programa, podemos falar que o usuário dono tem todas as permissões, escrever, ler e executar (u=rwx), o mesmo para o grupo dono (g=rwx) e para os outros usuários. (o=rwx):

Agora se nós tentarmos adicionar um arquivo vamos conseguir salvá-lo:

Tudo certo! Conseguimos realizar a configuração do compartilhamento! Agora é só salvar os arquivos.

Para saber mais

Veja que no compartilhamento demos todas as permissões (rwx) para todos os usuários, até a usuários desconhecidos no sistema. Por isso, por questões de segurança esse tipo de configurações devem ser evitadas.

Neste caso, nós utilizamos o chmod com suas opções simbólicas (rwx), porém poderíamos ter utilizado o modo octal (0, 1, 2, 4).

Para evitar esse tipo de configuração, pode-se criar um grupo e colocá-lo como grupo dono da pasta compartilhada.

Esse exemplo é apenas um simples exemplo de compartilhamento. Podemos fazer muito mais como:

  • Restringir o acesso a um diretório ou arquivo a um usuário ou grupo de usuários específicos;
  • Criar pastas únicas para cada usuário no sistema;
  • Bloquear alguns tipos de arquivos de serem salvos no sistema.

Além de compartilhar arquivos e diretórios, o Samba consegue fazer o papel de Active Directory nas redes Windows.

Veja que realizamos essa configuração como superusuário (root), logo, cuidado!

Neste caso, nossa pasta está apenas no servidor, porém conseguimos sincronizá-la com algum serviço na nuvem. Dessa forma podemos sempre acessar seus arquivos, ou pela rede local, ou pela nuvem.

Compartilhando com todos os sistemas

Nosso problema era o compartilhamento de arquivos entre diferentes sistemas operacionais (Windows e Linux). Entendendo que o problema são os diferentes protocolos usados por esses sistemas, encontramos como solução o Samba.

Com ele conseguimos compartilhar arquivos e diretórios, além de impressoras. Isso porque o Samba utiliza o protocolo SMB para realizar o compartilhamento. Dessa forma, as máquinas Windows conseguem acessar os diretórios compartilhados no Linux.

E aí o que achou? Já conhecia essas técnicas? Conhece outras? Compartilhe conosco nos comentários! 🙂
Gosta de administração de servidores? Essa é uma parte muito importante se você quiser trabalhar como DevOps. Aqui na Alura temos uma carreira de Engenheiro DevOps.
Nela você aprenderá sobre Linux, Git, Vagrant, entrega contínua e sobre cloud com a Amazon EC2.

FIQUE POR DENTRO

Próximo ArtigoDiferença entre int e Integer em Java