Sunday, November 04, 2012

Montando compartilhamentos do Samba via linha de comando

Nos clientes Linux, a forma mais prática de acessar os compartilhamentos do Samba é utilizar clientes gráficos como o Smb4K e o módulo smb:/ do Konqueror. Apesar disso, o Samba possui também um cliente de modo texto, o smbclient e é possível também montar os compartilhamentos, funcionalidade que equivale à opção "mapear unidade de rede" disponível nos clientes Windows.

É possível também fazer com que os compartilhamentos sejam montados automaticamente durante o boot, adicionando as entradas apropriadas no arquivo "/etc/fstab". Desta forma, os compartilhamentos são montados automaticamente durante o boot e ficam acessíveis de forma permanente nas pastas especificadas por você. Esta é uma opção interessante em muitos ambientes, já que é mais fácil para os usuários simplesmente acessarem os arquivos através de uma pasta, do que terem que montar o compartilhamento usando o Smb4K.

O primeiro passo é aprender a sintaxe da montagem dos compartilhamentos via linha de comando, já que as entradas do fstab utilizam os mesmos argumentos.
Começando do básico, você pode listar os compartilhamentos disponíveis em um servidor da rede usando o comando:

$ smbclient -L 192.168.1.254 -U gdh

Veja que o comando especifica o endereço do servidor (você pode usar também o nome na rede Windows) e a conta de usuário que será usado para abrir a conexão. Depois de fornecer a senha, você obtém uma lista dos compartilhamentos disponíveis, como em:

E230 Printer
print$ Disk Drivers de impress_o para os clientes Windows
arquivos Disk
projetos Disk
backup Disk
IPC$ IPC IPC Service (Samba PDC)
 
O exemplo mais simples para montar um dos compartilhamentos via linha de comando seria:

# mount -t smbfs //servidor/arquivos /mnt/smb

Aqui, estou montando o compartilhamento "arquivos" na pasta "/mnt/smb" (que deve ser previamente criada usando o comando mkdir). O "servidor" pode tanto ser o nome da máquina, dentro da rede Windows, quanto seu endereço IP. Como em outros comandos de montagem, você precisa executar o comando como root.

O comando mount é um dos comandos mais tradicionais do Linux, que permite "mapear" um diretório qualquer dentro de outro diretório do sistema. A opção "-t" serve para especificar o sistema de arquivos, neste caso o "smbfs", usado para acessar compartilhamentos Windows. Note que a localização do compartilhamento é fornecida numa sintaxe muito similar à que usaríamos para mapear um compartilhamento no Windows, com a sintaxe "barra barra servidor barra compartilhamento". A única diferença é que aqui usamos barras "normais" ao invés de barras invertidas. :)

Só para efeito de comparação, ao mapear o mesmo compartilhamento numa máquina Windows, teríamos:

index_html_m71fabe27

O problema com o comando acima é que ele só funciona realmente ao montar compartilhamentos do Windows 98/ME, que não possuem senhas. No Windows 2000/XP/Vista (com exceção das estações com o simple sharing ativado), você vai receber uma mensagem de acesso negado, já que neles você precisa se autenticar para obter acesso aos compartilhamentos. Para isso, é necessário incluir a opção "-o username=usuario" (tudo junto, sem espaços), especificando o login que será usado, como em:

# mount -t smbfs //servidor/arquivos /mnt/smb -o username=gdh

É possível também especificar a senha diretamente no comando, o que permite usar o comando em scripts:

# mount -t smbfs //servidor/arquivos /mnt/smb -o username=gdh,password=1234

Depois de montado o compartilhamento, os arquivos podem ser acessados normalmente, usando o Konqueror, Nautilus ou outro gerenciador de arquivos. É muito similar ao acessar uma compartilhamento mapeado no Windows, a principal diferença é que você define uma pasta onde ele será montado, ao invés de acessá-lo através de uma letra, como "E:" ou "Z:".

Uma peculiaridade do mount é que os arquivos dentro da pasta montada passarão por padrão a ser propriedade do root. Isso não altera as permissões de acesso dos arquivos no servidor (a mudança é apenas local), mas impede que seu login de usuário consiga alterar os arquivos, mesmo que as permissões de acesso do Samba digam o contrário.

Para evitar isso é necessário adicionar a opção "uid=", especificando o login de usuário (na máquina local) correto, como em:
 
# mount -t smbfs //servidor/arquivos /mnt/smb -o username=gdh,password=1234,uid=gdh

A opção "uid=" é interpretada localmente. O login especificado não é repassado ao servidor Samba, de forma que você pode usar qualquer conta de usuário local. Ele serve apenas para corrigir as permissões de acesso, de forma que você possa alterar os arquivos normalmente usando seu login de usuário.

O passo seguinte é tornar a montagem permanente, já que, usando o comando mount, ela é perdida ao reiniciar o micro.

Para isso, inserimos uma nova linha no final do arquivo "/etc/fstab". A ordem dos parâmetros fica um pouco diferente, mas você notará que os parâmetros continuam os mesmos que usamos no comando anterior:
 
//servidor/arquivos /mnt/smb smbfs username=gdh,password=1234,uid=gdh 0 0

Caso necessário, você pode também indicar o grupo, junto com o usuário local, usando a opção "gid=", como em:
 
//servidor/arquivos /mnt/smb smbfs username=gdh,password=1234,uid=gdh,gid=users 0 0

O fstab é um dos principais arquivos de configuração, por isso é sempre importante ter cuidado ao editá-lo. Apenas adicione a nova linha, sem alterar as anteriores e lembre-se sempre de deixar uma linha em branco no final do arquivo.
Um parâmetro útil que pode ser incluído é a opção "users" que permite que você consiga montar e desmontar o compartilhamento usando seu login de usuário, sem precisar usar a conta de root. Para isso, adicione o parâmetro "user", antes do "username=" (sem espaços), como em:
//servidor/arquivos /mnt/smb smbfs users,username=gdh,password=1234,uid=gdh 0 0

A montagem e desmontagem neste caso é feita indicando apenas o diretório, como em "umount /mnt/smb" e "mount /mnt/smb". A principal observação é que o smbmnt só aceita fazer a montagem em uma pasta de propriedade do usuário, por isso é necessário ajustar as permissões da pasta usando o comando chown, como em:
 
# chown gdh.gdh /mnt/smb

O "0 0" incluído sempre no final da linha é um parâmetro passado sistema, que diz que ele não deve verificar o sistema de arquivos usando o fsck durante a inicialização, já que aqui estamos montando um compartilhamento de rede e não uma partição.

Embora não seja muito recomendável do ponto de vista da segurança, também é possível escancarar as permissões, fazendo com que qualquer usuário logado no cliente Linux tenha acesso completo a todos os arquivos. Para isso, você usaria o parâmetro "smbpasswd,fmask=777,dmask=777", como em
//servidor/arquivos /mnt/smb smbfs users,username=gdh,password=1234
smbpasswd,fmask=777,dmask=777 0 0

(tudo em uma única linha) Como estamos adicionando as senhas dos compartilhamentos dentro do arquivo, também é fortemente recomendável manter as permissões de leitura do arquivo em "600", de forma que apenas o root tenha permissão para ver seu conteúdo. Para isso, use o comando:
 
# chmod 600 /etc/fstab

É possível montar diversos compartilhamentos, adicionando uma linha para cada um. Não existe limitação para o número máximo de compartilhamentos que podem ser adicionados, mas você deve ter cuidado de adicionar apenas compartilhamentos de servidores que fiquem ligados continuamente. Se o servidor estiver desligado durante o boot da estação, o boot do cliente vai demorar muito mais que o normal e o usuário verá o erro relacionado à montagem do compartilhamento, o que não é muito elegante, nem muito bom para sua reputação como administrador. :)

Nos exemplos anteriores, especificamos as senhas de montagem dos compartilhamentos diretamente no arquivo "/etc/fstab". Mesmo protegendo o arquivo com o "chmod 600", muita gente afirma que isso é um problema grave de segurança, já que alguém que conseguisse obter acesso ao arquivo, obteria automaticamente as senhas dos compartilhamentos.

Uma opção é usar um arquivo externo para armazenar as senhas. Ele pode ser armazenado tanto dentro do diretório /home/root, quanto dentro do home do usuário do sistema que tem acesso ao compartilhamento. Você pode também usar diversos arquivos de senha, um para cada compartilhamento que precisa ser montado.

Para criar os arquivos de senha, use os três comandos abaixo, ainda como root:
 
# echo "username=gdh" > /home/gdh/.smbpasswd
# echo "password=1234" >> /home/gdh/.smbpasswd
# chmod 600 /home/gdh/.smbpasswd

Usado desta forma, o comando echo permite criar arquivos de texto e adicionar novas linhas. O primeiro comando cria o arquivo, adicionando a linha com o nome do usuário, enquanto o segundo adiciona a linha com a senha. Se por acaso o arquivo já existir, ele é subscrito.

Como o arquivo foi criado pelo root, o comando "chmod 600" usado no final faz com que, mesmo colocado dentro do home do usuário "joao", apenas o root tenha acesso ao arquivo, evitando acidentes.
Você pode também criar o arquivo usando um editor de textos qualquer e ajustar as permissões manualmente. Neste caso, bastaria adicionar as duas linhas:
 
username=gdh
password=1234

Com o arquivo criado, você pode modificar a(s) linha(s) no fstab, especificando a localização do arquivo, ao invés de colocar o usuário e senha diretamente, como em:
 
//servidor/arquivos /mnt/smb smbfs users,credentials=/home/gdh/.smbpasswd 0 0
 
ou:
 
//servidor/arquivos /mnt/smb smbfs users,credentials=/home/gdh/.smbpasswd
smbpasswd,uid=gdh,gid=gdh 0 0

(tudo em uma única linha)

Ao montar vários compartilhamentos, que são acessados usando o mesmo login e senha, você pode especificar o mesmo arquivo em todas as linhas, mas, no caso de diversos compartilhamentos, montados usando credenciais diferentes, você deve criar arquivos separados para cada um e especificar o arquivo correto dentro da linha de montagem de cada compartilhamento.

Você pode criar quantos arquivos de senha diferentes quiser, mas cada arquivo deve conter um único usuário e senha.

No comments: