Compartilhando arquivos com o Samba
Existe um programa chamado Samba que consegue realizar o compartilhamento de arquivos e impressoras entre redes Linux e Windows. Realiza isso por meio do protocolo SMB.
De conhecimento do Samba, quando uma empresa me contratou para resolver um problema com seu servidor de arquivos. o cenário era o seguinte:
Toda a rede da empresa utiliza Linux, desde os servidores até as máquinas clientes. Contudo um sócio começou a trabalhar alguns dias da semana na empresa com seu notebook particular, que utiliza Windows como sistema operacional.
Ele precisa acessar alguns arquivos do servidor para realizar seu trabalho. Então vamos conectá-lo na rede e falar para tentar acessar o servidor via seu endereço:
Hum… não conseguimos acessar o compartilhamento, por quê?
Isso porque os protocolos usados são diferentes. Logo lembrei do Samba.
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. Sistemas Windows, por padrão, não conseguem se comunicar com sistemas Linux.
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.
Gosta de administração de servidores? Essa é uma parte muito importante se você quiser trabalhar como DevOps. Aqui na Alura temos uma formação DevOps. Nela você aprenderá sobre Linux, Git, Vagrant, entrega contínua e sobre cloud com a Amazon EC2.