Artigo visualizado 26 vezes

Usando NFS no Linux: Exemplificando com Ubuntu Server 20.04 LTS

Introdução

NFS – Network File System (Sistema de Arquivos em Rede)

NFS, ou Network File System (Sistema de Arquivos em Rede), é um protocolo de sistema distribuído de arquivos desenvolvido inicialmente pela Sum Microsystems Inc. que permite montagem de diretórios remotos entre computadores conectados em rede, formando um diretório virtual. O protocolo é especificado nas RFCs 1094, 1813 e 7931, esta última atualizando a RFC7530 que por sua vez obsoletou a RFC3530.

O cliente NFS tem por finalidade tornar o acesso remoto transparente para o usuário do computador, de forma  afazer parecer que o acesso aos arquivos é local e não remoto como de fato.

Para estabelecer um NFS, são necessários minimamente dois computadores com ao menos um deles operando como servidor que compartilhará seu sistema de arquivos com o outro computador.

Considerações de segurança

Os superusuários (root) podem fazer qualquer coisa no sistema deles, mas os diretórios montados via NFS não fazem parte do sistema no qual estão montados, eles estão sob o controle do superusuário do servidor de tais diretórios, o servidor. Por isso o NFS, por padrão, não permite operações que requerem privilégios de superusuário. Ou seja, os superusuários dos clientes não podem gravar arquivos como root, reatribuir posse e outras tarefas de superusuário na montagem NFS.

Construindo um servidor e um cliente NFS

O cenário

Vamos nos ater especificamente ao uso de Linux como sistema operacional. Serão usados dois computadores nesta prática, ambos executando Linux, especificamente Ubuntu 20.04, no entanto diversos podem ser utilizados e com diferentes versões e distribuições Linux. Um dos computadores executará o servidor de arquivos remoto, executando a versão servidor do Ubuntu, o outro, o cliente, pode ser uma instalação desktop ou servidor.

Os computadores terão além do usuário root ao menos um usuário com privilégios SUDO, além de usuários ditos comuns e não terão firewall ativado por simplicidade. O servidor será chamado HOST e o outro será chamado CLIENTE. O endereço IP de ambos deve ser conhecido e vamos assumir como IP do HOST o endereço 192.168.0.2 e o IP do CLIENTE 192.168.0.7.

Baixando e Instalando os componentes

Serão necessários dois pacotes básicos para colocar o serviço para funcionar, um a ser instalado no HOST que é o nfs-kernel-server o outro no CLIENTE que é o nfs-common.

Obs.: Caso a distribuição seja da família Red-Hat, o pacote nfs-utils serve tanto para o HOST quanto para o CLIENTE. Já para o Suse os pacotes são NFS Server e NFS Client.

Como de praxe inicie a instalação por garantir que o índice de pacotes local está atualizado com o comando atp update tanto no HOST quanto no CLIENTE.

HOST & CLIENTE
$ sudo apt update

Agora na máquina desempenhando o papel de HOST faça:

HOST
$sudo apt install nfs-kernel-server

E na máquina com o papel de CLIENTE faça:

CLIENTE
$ sudo apt install nfs-common

Fazendo compartilhamentos no HOST

Podemos compartilhar diretórios por NFS de uso geral, ou forma que possa ser administrado remotamente pelos administradores locais dos CLIENTES possam ter gerenciamento conveniente.

Compartilhamento para uso geral

Um compartilhamento para uso geral, pelo bem da segurança, deve dificultar ao máximo a interação do usuário com privilégios de root. Assim é que após criado o diretório de compartilhamento sua propriedade deve ser passada para nobody e seu grupo deve ser nogroup.

A seguir será mostrada uma sequência de comandos em que o root cria um diretório (que seria o caso de maior exposição), e o concede ao usuário e grupo referidos acima.

HOST
$ sudo mkdir -p /var/dummy/usogeral
$ sudo chown nobody:nogroup /var/dummy/usogeral

Lembre-se que com estes comandos ao criar o diretório seu proprietário e seu grupo são root (drwxr-xr-x root:root 4096 Jul 19 13:00 usogeral) e que após o chown seu proprietário passa a ser nobody e seu gurpo nogroup (drwxr-xr-x nobody:nogroup 4096 Jul 19 13:00 usogeral).

Desta forma o diretório está pronto para ser compartilhado.

Compartilhamento para poder ser gerenciado

Por vezes existem usuários confiáveis no sistema CLIENTE que precisam realizar ações de reatribuir posse e outras tarefas de superusuário no sistema de arquivos montado, mas não precisam de acesso de superusuário no HOST. Para isso você pode configurar o servidor NFS para permitir tais ações, mesmo com isso representando um certo grau de risco de segurança.

Para fins de exemplo será compartilhado o diretório /home, pré-existente e não serão feitas quais quer alterações de propriedade  ou grupo.

Configurando os compartilhamentos

A configuração dos compartilhamentos é efetuada no arquivo /etc/exports do HOST,  este arquivo funciona como uma lista de controle de acesso.

Abrindo-o para edição (com privilégios de root) serão feitas declarações que relacionam o diretório a ser compartilhado, com o computador CLIENTE e as opções de compartilhamejto, com o seguinte formato geral:

diretório  cliente(opção1, opção2, ..., opçãoN)

Temos de criar uma linha para cada diretório a ser compartilhado e cada cliente que o poderá montar. Na especificação do CLIENTE pode ser usado o endereço IP, o que pode ser problemático em ambiente que utilizam DHCP.

Neste exemplo faremos que exports tenha o seguinte conteúdo:

/var/dummy/usogeral	192.168.0.7(rw,sync,no_subtree_check)
/home	                192.168.0.7(rw,sync,no_root_squash,no_subtree_check)

Explorando as opções:

rw:       fornece ao CLIENTE tanto acesso à leitura quanto à escrita

sync:    obriga o NFS a gravar alterações no disco antes de responder, resultando em um ambiente mais estável, porém mais lento.

no_subtree_check:     impede a verificação de subárvore, que é um processo no qual o HOST deve verificar se o arquivo está de fato disponível na árvore compartilhada para cada pedido. no_root_squash:         desativa a tradução das solicitações de um root remoto como usuário sem privilégios no servidor.


Ao completar as alterações, salvar e fechar o arquivo, force a reiniciação do serviço NFS para tornar efetiva a nova configuração com o comando:

HOST
$ sudo systemctl restart nfs-kerne-server
ou
$ sudo service nfs-kernel-server restart

Garantindo outras condições de funcionamento

Caso o HOST esteja “atrás” de um firewall, este deve permitir o tráfego entre CLIENTES e HOST. Verifique o status do firewall, para verificar se está habilitado, com o comando:

HOST:
$ sudo ufw status

Obs.: Isto claro admitindo que o firewall presente seja o UFW

Se estiver ativo, poderá ser necessário adicionar uma regra para o tráfego NFS. Se para muitos aplicativos, é possível utilizar o nome do aplicativo para criar regras, o UFW não é um deles, mas como o ufw consulte o /etc/services para a porta e o protocolo ainda é possível trabalhar a regra pelo nome nfs. Seguindo as boas práticas criaremos uma regra bastante restritiva permitindo apenas o tráfego entre o HOST e o nosso CLIENTE e não que qualquer endereço.

O comando a seguir abre a porta 2049 (serviço NFS) no HOST para o CLIENTE específico.

HOST
$ sudo ufw allow from 192.168.0.7 to any port nfs

Em verificação à criação da regra consultado o status do firewall obtemos algo como:

HOST:
$ sudo ufw status

$ Status: active

To	Action	From
--	------	----
OpenSSH	ALLOW	Anywhere
2049	ALLOW	192.168.0.7

Confirmando que o UFW permitirá tráfego NFS na porta 2049 a partir de nosso CLIENTE.

Com isto fica concluída a configuração do servidor NFS.

Criando os pontos de montagem e montando-os no CLIENTE

Para tornar os compartilhamentos disponíveis no CLIENTE é necessário montar os diretórios compartilhados no HOST em diretórios vazios no CLIENTE.

Inicialmente criamos os diretórios necessários para a montagem dos compartilhamentos, por exemplo com os comandos:

CLIENTE:
$ sudo mkdir -p /nfs/usogeral
$ sudo mkdir -p /nfs/home

Tendo assim os pontos de montagem, vamos montar os compartilhamentos usando o endereço IP do HOST e os comandos:

CLIENTE:
$ sudo mount 192.168.0.2:/var/dummy/usogeral  /nfs/usogeral
$ sudo mount 192.168.0.2:/home  /nfs/home

Assim teremos montados os compartilhamentos que podem ser utilizados até que o CLIENTE seja reiniciado, quando deverá acontecer novamente a montagem dos compartilhamentos. Podemos comprovar a montagem executando o comando df -h como a seguir:

CLIENT:
$ df -h

Filesystem                    Size  Used Avail Use% Mounted on
udev                          3.8G     0  3.8G   0% /dev
tmpfs                         790M  1.1M  789M   1% /run
/dev/sda3                     219G  6.5G  201G   4% /
tmpfs                         3.9G     0  3.9G   0% /dev/shm
tmpfs                         5.0M     0  5.0M   0% /run/lock
tmpfs                         3.9G     0  3.9G   0% /sys/fs/cgroup
/dev/mapper/vg1-lv1           8.2T  2.0T  6.2T  25% /home
tmpfs                         790M     0  790M   0% /run/user/1000
192.168.0.7:/var/nfs/general   55G  6.4G   46G  13% /nfs/usogeral
192.168.0.7:/home              55G  6.4G   46G  13% /nfs/home

Os compartilhamentos aparecem ao final da saída e como se observa apresentam o mesmo uso de disco, isso porque foram compartilhados de um mesmo sistema de arquivos. Caso seja desejável saber o uso em disco de cada um dos pontos de montagem pode-se fazer uso do comando du, como exemplificado a seguir:

CLIENTE:
$ du -sh /nfs/home

60K     /nfs/home

Testando a funcionalidade do compartilhamento /nfs/usogeral podemos criar um arquivo e em seguida verificar sua existência com os comandos touch e ls, como exemplificado:

CLIENTE:
$ touch /nfs/usogeral/teste.txt
$ ls -l /nfs/usogeral/
total 0
-rw-rw-r-- 1 nobody nogroup 0 Jul 20 02:37 teste.txt

E testando a funcionalidade do compartilhamento /nfs/home podemos usar o mesmo método, como exemplificado:

CLIENTE:
$ sudo touch /nfs/home/meu.dir
$ ls -l /nfs/home/meu.dir
-rw-rw-r-- 1 root root 0 Jul 20 02:45 /nfs/home/meu.dir

Como meu.dir foi criado pelo root, ele é exibido como sendo da propriedade do root e não de nobody.

Montando os compartilhamentos automaticamente na iniciação

Para que a montagem dos compartilhamentos ocorra de forma automática na inicialização do CLIENTE, basta adicioná-los no arquivo /etc/fstab do CLIENTE.

Para tanto edita-se o arquivo e em seu final adiciona-se uma linha para cada um dos compartilhamentos cuja forma geral é:

Ip_host:/path_host  /path_local   tipo   opções     fs_freq    fs_passno

e após editadas elas se parecerão como a seguir:

# /etc/fstab: static file system information.
.
.
.
192.168.0.7:/var/dummy/usogeral     /nfs/usogeral   nfs     auto,nofail,noatime,nolock,intr,tcp,actimeo=1800        0       0
192.168.0.7:/home       /nfs/home       nfs     auto,nofail,noatime,nolock,intr,tcp,actimeo=1800        0       0

Desmontando os compartilhamentos

Quando não desejar mais os compartilhamentos ou precisar desfazê-los temporariamente, basta desmontá-los com o comando umount seguido no caminho local de montagem, por exemplo, assim:

CLIENTE:
$ sudo umount /nfs/usogeral
$ sudo umount /nfs/home

Se for o caso de não serem mais montados automaticamente na inicialização, basta excluir as linhas correspondentes aos compartilhamentos indesejados do arquivo /etc/sftab.


Obs.: Consulte as páginas MAN dos seguintes itens para aumentar seu entendimento desse mecanismo de compartilhamento de arquivos em rede: nfs; fstab; mount; umount; exports; nfsd; e kerberos.


Este trabalho mostrou de forma bastante objetiva como criar compartilhamentos em redes de computadores Linux. No entanto não houve aprofundamento nos aspectos de segurança relacionados, por exemplo o NFS não criptografa o tráfego, portanto melhor manter seu uso em ambientes privados. Há alternativas que utilizam criptografia, por exemplo VPN.

Referências

BOUCHERON, Brain. Como configurar uma montagem NFS no Ubuntu 20.04. Digital Ocean, LLC. 2020. Disponível em <https://www.digitalocean.com/community/tutorials/how-to-set-up-an-nfs-mount-on-ubuntu-20-04-pt>, acesso em 18/jul./2021

HASHIMOTO, Cleuber Silva. Configurando um Servidor de NFS no Linux. 2018. Disponível em < https://cleuber.com.br/index.php/2018/03/21/configurando-um-servidor-de-nfs-no-linux>, acesso em 15 de set. de 2019.

Páginas MAN dos tópicos: nfs; fstab; mount; umount; e exports.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.