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 orpcbind
(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
eportmapper
; - 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ç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
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