UP | HOME

LPI-2 202-450 Topico 209.2
Configuração do servidor NFS (Network File System)

Índice

209.2: Configuração do servidor NFS - Objetivos

Peso 3

O candidato deve ser capaz de exportar um sistema de arquivos usando o NFS. Este objetivo inclui restringir o acesso, montar um sistema de arquivos NFS no cliente e segurança do NFS.

Conhecimentos-chave:

  • Arquivos de configuração do NFS versão 3;
  • Ferramentas do NFS;
  • Restrição de acesso para hosts ou sub-redes específicos;
  • Opções de montagem no servidor e no cliente;
  • tcpwrappers;
  • Noção de NFSv4.

Lista parcial dos arquivos, termos e ferramentas utilizados:

  • /etc/exports;
  • exportfs;
  • showmount;
  • nfsstat;
  • /proc/mounts;
  • /etc/fstab;
  • rpcinfo;
  • mountd;
  • portmapper;

209.2: Configuração do servidor NFS - Conteúdo

O que é NFS

Network File System NFS foi basicamente desenvolvido para compartilhar arquivos e pastas entre sistemas Linux/Unix pela Sun Microsystems em 1980. Ele nos permite montar nossos sistemas de arquivos locais em uma rede e hosts remotos para interagir com eles conforme são montados localmente no mesmo sistema. Com a ajuda do NFS, podemos configurar o compartilhamento de arquivos entre o sistema Unix para Linux e vice-versa.

Vantagens do NFS:

  • O NFS permite acesso local para arquivos remotos;
  • Ele usa um padrão client/server para compartilhamento de arquivos entre todos os sistemas baseados em Unix;
  • Com o NFS não é necessário que as duas máquinas utilizem o mesmo SO;
  • Com a ajuda do NFS é possível montar um sistema de armazenamento centralizado;
  • Os usuários podem acessar seus dados sem saber sobre onde são físicamente armazenados;
  • Não há necessidade de atualizações manuais para visualizar novos arquivos;
  • As versões atuais do NFS tem suporte a ACLs e pontos de montagem "pseudo root";
  • Pode ser configurado através de firewalls e Kerberos.

Versões do NFS

Hoje há três versões do NFS. O NFS versão 2 (NFSv2) é o mais antigo e amplamente suportado. O NFS versão 3 (NFSv3) tem mais recursos, mas tem problemas de segurança. E o NFS versão 4 (NFSv4), que é a última versão é a mais completa e segura de todas as versões.

Datas de lançamento das versões do NFS:

  • NFSv2 - Março de 1989;
  • NFSv3 - Junho de 1995;
  • NFSv4 - Dezembro de 2000;
  • NFSv4.1 - Janeiro de 2010.

Para o exame LPIC 2, precisamos trabalhar com o NFS versão 3, mas também precisamos saber um pouco sobre o NFS versão 4 e suas diferenças.

O servidor NFS versão 3 inclui 3 componentes:

  • nfs transmite as requisições de compartilhamento remotas em requisições para o file system local;
  • portmap mapeia chamadas feitas de outras máquinas para o serviço RPC correto. Ele usa o rpcbind (não necessário no NFSv4);
  • rpcbind redireciona o client para o número de porta apropriado para que ele possa se comunicar com o serviço solicitado (não necessário com o NFSv4).

Desvantagens do NFSv3

A grande desvantagem é a segurança. Como o NFSv3 é baseado em Remote Procedure Calls (RPC) ou chamadas de procedimento remoto, ele é inerentemente inseguro e só deve ser usado em uma rede confiável atrás de um firewall. Isso não quer dizer que não seja possível tomar medidas para proteger o NFS, mas ele ainda não estará pronto para a Internet aberta.

NFSv4

  • No NFSv4 não há mais rpcbind e portmapper;
  • No NFSv3 existe um serviço nfslock que inicia os processos RPC apropriados para permitir que os clientes NFS bloqueiem arquivos no servidor, mas o NFSv4 tem mecanismo de bloqueio de arquivo nativo;
  • No NFSv3 o serviço rpc.mountd é responsável pela montagem e desmontagem dos sistemas de arquivos, no NFSv4 não há rpc.mound;
  • Enquanto o NFSv3 funciona com portas TCP/UDP, o NFSv4 funciona apenas com TCP.

Instalação do NFSv3

Por ser um serviço tradicional de servidores Unix like os pacotes do NFS server estão disponíveis nos repositórios de todas as distribuições e pelo fato de que a última atualização dele foi em 2010 todas contam com a mesma versão portanto a instalação pelo gerenciador de pacotes é o mais viável.

Em um sistema RedHat like instala-se os pacotes nfs-utils e rpcbind.

Arquivos de configuração importantes:

/etc/exports
é o arquivo de configuração principal do NFS, aqui onde são configurados todos os compartilhamentos e difinidas as limitações macro;
/etc/fstab
é onde configuramos os pontos de montagem nos clientes;
/etc/sysconfig/nfs
Local onde controla-se a porta onde o rpc e outros serviços escutam.

Definindo um compartilhamento

Para definir um compartilhamento primeiramente qual diretório iremos compartilhar, aqui seguiremos a mesma lógica proposta para o compartilhamento Samba:

$ mkdir /srv/nfs/compartilhamento1
$ chmod 777 /srv/nfs/compartilhamento1

Discutiremos a parte de segurança posteriormente, portanto para fins de teste estamos criando o diretório sem restrições.

Agora precisamos inserir a seguinte linha no arquivo /etc/exports:

/srv/nfs/compartilhamento1 192.168.1.0(ro) 192.168.1.15(rw,no_root_squash)

Segundo o exemplo acima estamos dando permissão de "apenas leitura" para todos os computadores da rede 192.168.1.0, porém para o host de IP 192.168.1.15 estamos dando permissão de escrita, note uma opção importante no_root_squash permite que o usuário remoto de ID 0 (root) monte o compartilhamento. Essa opção é útil quando o diretório local compartilhado é o diretório raiz no cliente remoto.

Explicando melhor a sintaxe das entradas em /etc/exports segue o seguinte padrão:

<export> <host1>(<opções>) <host2> (<opções>) <hostN> (<options>) ...

Além de endereços de rede e ou endereços de IP é possível usar hostnames e curingas. Os seguintes métodos podem ser usados para especificar nomes de host:

Host simples
Onde um determinado host é especificado com um FQDN, nome de host ou endereço de IP;
wildcards
Onde um * ou ? O caractere é usado para levar em consideração um agrupamento de nomes de domínio totalmente qualificados que correspondem a uma determinada sequência de letras. Curingas não devem ser usados com endereços IP; no entanto, é possível que funcionem acidentalmente se as pesquisas reversas de DNS falharem.
Redes IP
Permite a declaração de endereços de rede no formato x.x.x.x/x. Considere que a rede aqui especificada não precisa ser um endereço de rede real, enxerge isso como um range de IPs;
netgroups
Esta opção é muito antiga, mas é interessante saber. Ele permite que um nome de grupo de rede NIS, escrito como @<group-name>, seja usado. Isso efetivamente coloca o servidor NIS a cargo do controle de acesso para este sistema de arquivos exportado, onde os usuários podem ser adicionados e removidos de um grupo NIS sem afetar /etc/exports.

Também há opções para ser usadas em /etc/exports para os compartilhamentos:

ro
define acesso somente leitura;
rw
define acesso de leitura e escrita;
sync
Sincroniza o sistema de arquivos nfs com o disco imediatamente, para reduzir a chance de corrupção do sistema.
no_subtree_check
Esta opção evita a verificação da subárvore. Quando um diretório compartilhado é o subdiretório de um sistema de arquivos maior, o nfs realiza varreduras em todos os diretórios acima dele, a fim de verificar suas permissões e detalhes. Desativar a verificação de subárvore pode aumentar a confiabilidade do NFS, mas reduzir a segurança.
no_root_squash
Esta opção permite acesso root ao diretório compartilhado.
Mapeando IDs de usuários e grupos.

A maneira como as permissões de NFS funcionam baseadas nas permissões para subdiretórios dentro do compartilhamento e também para arquivos criados por usuários, elas têm userid (uid) e groupid (gid) do usuário no sistema remoto que os cria. O problema é que essas IDs de usuário e IDs de grupo podem ser diferentes em sistemas diferentes. Do ponto de vista da segurança, isso parece um problema. Por quê? Vamos imaginar em um ambiente cliente-servidor que temos um usuário com uid 1101 (no servidor) chamado user1, e temos o usuário3 no sistema remoto (sistema cliente) com o mesmo ID de usuário 1101.

O problema é que quaisquer arquivos criados pelo user1 localmente no servidor (ou de qualquer outro sistema), são feitos com permissões para uid1101. Agora imagine que outro usuário como o user3 com o mesmo uid 1101 tem permissão para se conectar ao servidor NFS. o usuário3 é outra pessoa, de um computador diferente, mas ele / ela tem uid 1101, então ele/ela teria as mesmas permissões que o usuário1 tem.

Portanto, temos problemas em sincronizar as permissões do usuário porque elas são gerenciadas pelo ID do usuário e pelo ID do grupo. Assim precisamos mapear uid e gid entre o cliente e o servidor para os usuários que os acessam. Isso poderia ser feito escolhendo o uid e o gid corretos enquanto criamos os usuários. Também existem algumas outras soluções como OpenLDAP para contas sincronizadas automaticamente.

Mas a opção da qual estamos falando seria diferente da perspectiva do usuário root. o usuário root terá o mesmo id no cliente e no servidor. Então vamos explicar novamente:

root_squash
diz para não mapear a conta root do cliente para a conta root do servidor, evita que o usuário root remoto tenha o mesmo acesso ao sistema de arquivos que o usuário root do servidor;
no_root_squash
diz ei, vá e mapeie a conta do cliente raiz dos usuários para a conta raiz do servidor. Depende de você e do perfil de segurança de sua organização.
Finalizando a configuração

Após a edição do arquivo /etc/exports precisamos iniciar alguns serviços, no caso o rpcbind.service e o nfs.service.

O processo nfsd é o processo primário que lida com clientes. Mas, como os serviços baseados em RPC dependem do rpcbind para fazer todas as conexões com solicitações de clientes de entrada, o rpcbind deve estar disponível antes de qualquer um desses serviços iniciar, (1-rpc -> 2-nfs). Vamos verificar os serviços rpc e dar uma olhada mais de perto neles:

[root@srvnfs1 ~]# ps ax | grep rpc
   699 ?        S<     0:00 [rpciod]
 29162 ?        Ss     0:00 /usr/sbin/rpc.statd
 29450 ?        Ss     0:00 /sbin/rpcbind -w
 29451 ?        Ss     0:00 /usr/sbin/rpc.mountd
 29452 ?        Ss     0:00 /usr/sbin/rpc.idmapd
 29623 pts/0    S+     0:00 grep --color=auto rpc

Com base na distribuição Linux que estamos usando, podemos ver alguns serviços rpc adicionais. Os seguintes processos RPC facilitam os serviços NFS. Para quem gosta de detalhes:

rpc.mountd
Este processo recebe solicitações de montagem clientes NFS e verifica se o sistema de arquivos solicitado está exportado no momento. Este processo é iniciado automaticamente pelo serviço nfs e não requer configuração do usuário. Isso não é usado com NFSv4.
rpc.nfsd
Permite a definição de versões e protocolos NFS explícitos que o servidor anuncia. Ele funciona com o kernel Linux para atender às demandas dinâmicas dos clientes NFS, como fornecer threads de servidor cada vez que um cliente NFS se conecta. Este processo corresponde ao serviço NFS.
rpc.lockd
permite que clientes NFS bloqueiem arquivos no servidor. Se rpc.lockd não for iniciado, o bloqueio de arquivo falhará. rpc.lockd implementa o protocolo Network Lock Manager (NLM). Este processo corresponde ao serviço nfslock. Isso não é usado com NFSv4.
rpc.statd
Este processo implementa o protocolo RPC Network Status Monitor (NSM) que notifica os clientes NFS quando um servidor NFS é reiniciado sem ser desligado normalmente. Este processo é iniciado automaticamente pelo serviço nfslock e não requer configuração do usuário. Isso não é usado com NFSv4.
rpc.rquotad
Este processo fornece informações de cota de usuário para usuários remotos. Este processo é iniciado automaticamente pelo serviço nfs e não requer configuração do usuário.
rpc.idmapd
Este processo fornece upcalls de cliente e servidor NFSv4 que mapeiam entre nomes NFSv4 on-the-wire (que são strings na forma de usuário@domínio) e UIDs e GIDs locais. Para idmapd funcionar com NFSv4, o /etc/idmapd.conf deve ser configurado. Este serviço é necessário para uso com NFSv4. Este serviço não existe no NFSv3

rpcinfo

rpcbind fornece coordenação entre os serviços RPC e os números de porta usados para se comunicar com eles, é útil para exibir o status dos serviços RPC atuais usando o comando rpcbind ao solucionar problemas. O comando rpcbind mostra cada serviço baseado em RPC com números de porta, um número de programa RPC, um número de versão e um tipo de protocolo IP (TCP ou UDP).

O rpcinfo faz uma RPC call ao RPC server e reporta o que encontrou. O comando tem várias opções mas para nosso exemplo vamos mostrar apenas a busca de portas:

[root@srvnfs011 ~]# rpcinfo -p
   program vers proto   port  service
    100000    4   tcp    111  portmapper
    100000    3   tcp    111  portmapper
    100000    2   tcp    111  portmapper
    100000    4   udp    111  portmapper
    100000    3   udp    111  portmapper
    100000    2   udp    111  portmapper
    100024    1   udp  39073  status
    100024    1   tcp  53933  status
    100005    1   udp  20048  mountd
    100005    1   tcp  20048  mountd
    100005    2   udp  20048  mountd
    100005    2   tcp  20048  mountd
    100005    3   udp  20048  mountd
    100005    3   tcp  20048  mountd
    100003    3   tcp   2049  nfs
    100003    4   tcp   2049  nfs
    100227    3   tcp   2049  nfs_acl
    100003    3   udp   2049  nfs
    100003    4   udp   2049  nfs
    100227    3   udp   2049  nfs_acl
    100021    1   udp  58591  nlockmgr
    100021    3   udp  58591  nlockmgr
    100021    4   udp  58591  nlockmgr
    100021    1   tcp  37458  nlockmgr
    100021    3   tcp  37458  nlockmgr
    100021    4   tcp  37458  nlockmgr

Se um dos serviços NFS não iniciar corretamente, o rpcbind não conseguirá mapear as solicitações RPC dos clientes desse serviço para a porta correta. Em muitos casos, se o NFS não estiver presente na saída de informações do RPC, reiniciar o NFS faz com que o serviço seja registrado corretamente com o rpcbind e comece a funcionar. Para obter mais informações e uma lista de opções de rpcinfo, consulte a página do manual.

TCP Wrappers

O serviço rpcbind usa o TCP wrappers para controle de acesso, e as regras de controle de acesso para o rpcbind afetam todos os serviços baseados em RPC. Alternativamente é possível especificar regras de controle de acesso usando os arquivos /etc/hosts.allow e /etc/hosts.deny.

Por padrão os dois arquivos estão em branco.

Lembre-se sempre que o arquivo /etc/hosts.allow tem prioridade sobre o arquivo /etc/hosts.deny portanto se um host constar no arquivo /etc/hosts.allow o arquivo /etc/hosts.deny não será avaliado.

Por exemplo vamos liberar uma rede inteira para usar o portmap:

echo "portmap: 192.168.10.0/24" >> /etc/hosts.allow && \
    echo "portmap: ALL" >> /etc/hosts.deny

Nós liberamos apenas a rede 192.168.10.0/24 para alcançar o portmap todas as demais redes estão bloqueadas.

exportfs

O comando exportfs mostra quais compartilhamentos estão disponíveis:

[root@srvnfs01 ~]# exportfs 
/nfsshare         srvnfs011.exemplo.com.br
/nfsshare         <world>

Lista de opções interessantes:

-v
Exibe uma lista de arquivos compartilhados e opções em um servidor;
-a
Exporta todos os compartilhamentos listados em /etc/exports, ou o nome dado;
-u
Desesporta todos os compartilhamentos listados em /etc/exports, ou o nome dado;
-r
Recarrega a lista do servidor após uma modificação no /etc/exports.

nfsstat

O nfsstat nos permite ver as estatísticas do NFS no servidor.

Quando executado no cliente, pode mostrar detalhes do compartilhamento montado, com a opção -m

[root@clientnfs01 ~]# nfsstat -m
/mnt from 192.168.35.30:/nfsshare
Flags: rw,vers=2,rsize=8192,wsize=8192,hard,proto=udp,timeo=7,retrans=3,sec=sys,ad dr=192.168.35.30 

A configuração do cliente NFS

Precisamos instalar os pacotes necessários, em um servidor RedHat-like usaremos os pacotes nfs-utils, nfs-utils-lib e rpcbind.

showmount

O comando showmount nos permite ver a partir do cliente os pontos de montagem disponíveis no servidor NFS. Ele tem as seguintes opções:

-e
Mostra os compartilhamentos disponíveis na máquina local;
-e <ipserver>
Mostra os compartilhamentos em uma máquina remota;
-a
Mostra o host e o diretório montado por ele;
-d
Lista os subdiretórios montados por clientes.
[root@clientnfs01 ~]# showmount -e 192.168.35.30
Export list for 192.168.35.30:
/nfsshare (everyone)

Agora que sabemos que o ponto de montagem está disponível podemos montá-lo com o comando mount:

mount 192.168.35.30:/nfsshare /mnt

Ou também podemos inserir a seguinte linha no /etc/fstab para ter persistência a reboot:

192.168.35.30:/nfsshare /mnt nfs defaults 0 0

Como é um sistema de arquivos de rede, ele pode causar problemas durante o processo de inicialização se a rede não estiver disponível, então mudamos as configurações. Existem vários padrões diferentes que determinaram o comportamento de nossa tentativa de montagem dependendo de sua disponibilidade. Pode ser montagem soft ou hard. Se o servidor não estiver disponível e o definirmos como soft, ele parará de tentar após determinar que o servidor NFS não está disponível; se o definirmos como hard mount, ele continuará tentando até a opção de time out.

Também podemos definir montagens em primeiro plano ou segundo plano, fg ou bg. Ele determina se a tentativa de montagem acontece em primeiro plano, então a inicialização do sistema deve esperar até que seja bem-sucedida ou falhe. Ou em segundo plano, para que a inicialização possa continuar tentando montar silenciosamente enquanto o processo de inicialização está fazendo seu trabalho. bg geralmente é usado com a opção de montagem rígida, para evitar que o sistema seja suspenso.

A opção timeout definimos em tmeo=10 em segundos, e determina o valor limite para considerar a montagem falha.

A opção retrans define quantas vezes o sistema tentará montar durante o boot.

As opções rsize e wsize são os valores máximos de requisições da leitura e escrita permitidas no servidor remoto. Geralmente setado como 8MB ou 8192.

As opções ro e rw representam somente leitura ou leitura e escrita respectivamente, mas do lado do cliente. Obviamente se do lado do server a opção for ro ele terá prioridade.

Assim nosso /etc/fstab com montagem de NFS persistente a reboot com os devidos ajustes ficaria:

192.168.35.30:/nfsshare /mnt nfs hard,bg,timeo=10,rsize=1024,wsize=2048 0 0

Autor: Jeremias Alves Queiroz

Criado em: 2021-12-19 dom 17:06

Valid XHTML 1.0 Strict