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:
nfstransmite as requisições de compartilhamento remotas em requisições para o file system local;portmapmapeia chamadas feitas de outras máquinas para o serviço RPC correto. Ele usa orpcbind(não necessário no NFSv4);rpcbindredireciona 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 
rpcbindeportmapper; - 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
rpce 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.lockdnão for iniciado, o bloqueio de arquivo falhará.rpc.lockdimplementa o protocolo Network Lock Manager (NLM). Este processo corresponde ao serviçonfslock. 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 
nfslocke 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 
idmapdfuncionar com NFSv4, o/etc/idmapd.confdeve 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