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 historicamente, ela tem sofrido com muitas limitações, a maioria delas tendo sido atribuídas a versão 4 do protocolo. A contrapartida é que a última versão do NFS é mais difícil de configurar quando você quer usar recursos básicos de segurança tais como autenticação e criptografia já que ele faz uso do Kerberos para esses assuntos. E sem isso, o protocolo NFS tem que ficar restrito a uma rede local confiável já que os dados viajam pela rede sem criptografia (um sniffer pode interceptá-los) e os direitos de acesso são optidos com base no endereço IP do cliente (que pode ser falsificado ("spoofed")).
Se você não usa recursos de segurança baseados no Kerberos, é vital garantir que apenas máquinas com permissão de usar o NFS possam se conectar nos vários servidores RPC requeridos, porque o protocolo básico confia nos dados recebidos a partir da rede. 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.
Versões mais antigas do protocolo necessitavam de outros serviços RPC que usavam portas dinamicamente atribuídas. Felizmente, com a versão 4 do NFS, apenas a porta 2049 (para NFS) e 111 (para o portmapper) são necessárias, e assim, fácil de configurar no firewall.
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:
/diretório/para/compartilhar máquina1(opção1,opção2,...) máquina2(...) ...
Note que com o NFSv4, todos os diretórios exportados tem que ser parte de uma única hierarquia e que o diretório raiz dessa hierarquia tem que ser exportado e identificado com a opção fsid=0
ou fsid=root
.
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
).
Com o NFSv4, você pode adicionar uma opção sec
para indicar o nível de segurançaque você quer: sec=sys
é o padrão, sem recursos especiais de segurança, sec=krb5
habilita apenas a autenticação, sec=krb5i
adiciona proteção de integridade, e sec=krb5p
é o mais completo nível, que inclui proteção de privacidade (com criptografia de dados). Para isso funcionar você precisa do Kerberos configurado e funcionando (esse serviço não é coberto por esse livro).
Outras opções estão disponíveis; elas estão documentadas na página de manual exports(5).
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.22. Montando manualmente com o comando mount
#
mount -t nfs4 -o rw,nosuid arrakis.internal.falcot.com:/shared /srv/shared
Exemplo 11.23. Entrada NFS no arquivo /etc/fstab
arrakis.internal.falcot.com:/shared /srv/shared nfs4 rw,nosuid 0 0
A entrada descrita acima monta, ao levantar o sistema, o diretório NFS /shared/
no servidor arrakis
dentro do diretório local /srv/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. Note que no servidor, o diretório shared
está abaixo da raiz NFSv4 exportada ( por exemplo, /export/shared
), não é um diretório de nível mais alto.
A página de manual nfs(5) descreve todas as opções com alguns detalhes.