Product SiteDocumentation Site

11.4. Servidor de Arquivos NFS

O NFS (Network File System) é um protocolo que permite acesso remoto a um sistema de arquivos através da rede. Todos os sistemas Unix podem trabalhar com esse protocolo; mas quando sistemas Windows estão envolvidos, o Samba tem que ser usado.
O NFS é uma ferramenta muito útil, mas suas deficiências devem ser levadas em consideração, especialmente quando questões de segurança são importantes: todos os dados trafegam pela rede em texto puro (um sniffer pode interceptá-los); o servidor reforça as restrições de acesso baseando-se no endereço IP do cliente (o qual pode ser falsificado); e finalmente, quando uma máquina cliente ganha acesso ao compartilhamento NFS mal configurado, o usuário root do cliente pode acessar todos os arquivos do compartilhamento (mesmo aqueles pertencentes a outros usuários), já que o servidor confia no nome de usuário que recebe do cliente (essa é uma limitação histórica desse protocolo).

11.4.1. Proteção do NFS

Como o NFS confia nas informações que recebe da rede, é vital garantir que apenas máquinas que tem permissão de usá-lo possam se conectar nos vários servidores RPC requeridos. O firewall tem também que bloquear IP spoofing para prevenir que uma máquina de fora atue como uma de dentro, e acesso às portas apropriadas tem que ser restrito às máquinas destinadas a acessar os compartilhamentos NFS.
Outros serviços RPC podem ser necessários para o NFS funcionar de forma otimizada, incluíndo rpc.mountd, rpc.statd e lockd. Contudo, esses serviços usam uma porta aleatória (atribuída pelo portmapper) por padrão, o que torna difícil filtrar o tráfego que tem como alvo esses serviços. Os administradores da Falcot Corp encontraram um jeitinho para resolver esse problema, descrito abaixo.
Os dois primeiros serviços mencionados acima são implementados por programas espaço-usuário, começando respectivamente pelo /etc/init.d/nfs-kernel-server e /etc/init.d/nfs-common. Eles fornecem opções de configuração para forçar portas; os arquivos relevantes a serem modificados para sempre usar essas opções são /etc/default/nfs-kernel-server e /etc/default/nfs-common.

Exemplo 11.22. O arquivo /etc/default/nfs-kernel-server

# Number of servers to start up
RPCNFSDCOUNT=8

# Runtime priority of server (see nice(1))
RPCNFSDPRIORITY=0

# Options for rpc.mountd.
# If you have a port-based firewall, you might want to set up
# a fixed port here using the --port option. For more information, 
# see rpc.mountd(8) or http://wiki.debian.org/SecuringNFS
# To disable NFSv4 on the server, specify '--no-nfs-version 4' here
RPCMOUNTDOPTS="--manage-gids --port 2048"

# Do you want to start the svcgssd daemon? It is only required for Kerberos
# exports. Valid alternatives are "yes" and "no"; the default is "no".
NEED_SVCGSSD=

# Options for rpc.svcgssd.
RPCSVCGSSDOPTS=

Exemplo 11.23. O arquivo /etc/default/nfs-common

# If you do not set values for the NEED_ options, they will be attempted
# autodetected; this should be sufficient for most people. Valid alternatives
# for the NEED_ options are "yes" and "no".

# Do you want to start the statd daemon? It is not needed for NFSv4.
NEED_STATD=

# Options for rpc.statd.
#   Should rpc.statd listen on a specific port? This is especially useful
#   when you have a port-based firewall. To use a fixed port, set this
#   this variable to a statd argument like: "--port 4000 --outgoing-port 4001".
#   For more information, see rpc.statd(8) or http://wiki.debian.org/SecuringNFS
STATDOPTS="--port 2046 --outgoing-port 2047"

# Do you want to start the idmapd daemon? It is only needed for NFSv4.
NEED_IDMAPD=

# Do you want to start the gssd daemon? It is required for Kerberos mounts.
NEED_GSSD=
Uma vez que essas alterações sejam feitas e os serviços sejam reiniciados, o rpc.mountd usa a porta 2048; rpc.statd ouve na porta 2046 e usa a porta 2047 para conexões de saída (outgoing).
O serviço lockd é manipulado por uma thread do núcleo (processo leve); esse recurso é construído como módulo nos núcleos Debian. O módulo tem duas opções que permitem sempre escolher a mesma porta, nlm_udpport e nlm_tcpport. Para que essas opções sejam usadas sistematicamente, é preciso ter um arquivo /etc/modprobe.d/lockd com o seguinte:

Exemplo 11.24. O arquivo /etc/modprobe.d/lockd

options lockd nlm_udpport=2045 nlm_tcpport=2045
Uma vez que esses parâmetros estejam configurados, se torna fácil controlar o acesso ao serviço NFS a partir do firewall de maneira refinada, filtrando o acesso as portas 111 e de 2045 até 2049 (tanto UDP quanto TCP).

11.4.2. Servidor NFS

O servidor NFS é parte do núcleo Linux; nos núcleos fornecidos peloDebian ele é construído como um módulo do núcleo. Se o servidor NFS tem que ser rodado automaticamente na inicialização, o pacote nfs-kernel-server deve ser instalado; ele contém os scripts de inicialização relevantes.
O arquivo de configuração do servidor NFS, /etc/exports, lista os diretórios que estão disponíveis através da rede (exported). Para cada compartilhamento NFS, apenas uma determinada lista de máquinas tem acesso permitido. Um controle mais refinado de acesso pode ser obtido com algumas opções. A sintaxe para esse arquivo é bem simples:
/directory/to/share machine1(option1,option2,...) machine2(...) ...
Cada máquina pode ser identificada tanto pelo seu nome no DNS quanto seu endereço IP. Todo um conjunto de máquinas pode também ser especificado usando tanto uma sintaxe como *.falcot.com ou um intervalo de endereços IP como 192.168.0.0/255.255.255.0 ou 192.168.0.0/24.
Os diretórios ficam disponíveis apenas para leitura por padrão (ou com a opção ro). A opção rw permite o acesso a leitura-escrita. Os clientes NFS tipicamente fazem a conexão a partir de uma porta restrita ao root (em outras palavras, abaixo da 1024); essa restrição pode ser elevada pela opção insecure (a opção secure é implícita, mas pode ser explícita para mais clareza).
Por padrão, o servidor apenas responde a uma consulta NFS quando a operação de disco corrente é concluída (opção sync); isso pode ser desabilitado com a opção async. A escrita assíncrona aumenta um pouco a performance, mas ela diminui a confiança já que existe o risco de perda de dados no caso do servidor falhar entre comunicar a escrita e realmente escrever no disco. Como o valor padrão foi alterado recentemente (comparado ao valor histórico do NFS), uma configuração explícita é recomendada.
Para que não seja dado acesso de root no sistema de arquivos a nenhum cliente NFS, todas as consultas que parecem vir do usuário root são consideradas pelo servidor como vindo do usuário nobody. Esse comportamento corresponde à opção root_squash, e é habilitado por padrão. A opção no_root_squash, que desabilita esse comportamento, é arriscada e só deveria ser usada em ambientes controlados. As opções anonuid=uid e anongid=gid permitem especificar outro usuário falso a ser usado ao invés de UID/GID 65534 (que corresponde ao usuário nobody e ao grupo nogroup).
Outras opções estão disponíveis; elas estão documentadas na página de manual exports(5).

11.4.3. Cliente NFS

Como acontece com outros sistemas de arquivos, a integração do compartilhamento NFS na hierarquia do sistema requer montagem. Já que esse sistema de arquivos tem suas peculiaridades, alguns ajustes foram necessários na sintaxe do comando mount e do arquivo /etc/fstab.

Exemplo 11.25. Montando manualmente com o comando mount

# mount -t nfs -o rw,nosuid arrakis.internal.falcot.com:/srv/shared /shared

Exemplo 11.26. Entrada NFS no arquivo /etc/fstab

arrakis.internal.falcot.com:/srv/shared /shared nfs rw,nosuid 0 0
A entrada descrita acima monta, ao levantar o sistema, o diretório NFS /srv/shared/ no servidor arrakis dentro do diretório local /shared/. O acesso de leitura-escrita é requisitado (visto o parâmetro rw). A opção nosuid é uma medida de proteção que apaga qualquer bit setuid ou setgid de programas armazenados no compartilhamento. Se o compartilhamento NFS é apenas para armazenar documentos, outra opção recomendada é a noexec, a qual previne a execução de programas armazenados no compartilhamento.
A página de manual nfs(5) descreve todas as opções com alguns detalhes.