NFS (Network File System) — это протокол, позволяющий удалённый доступ к файловой системе через сеть. Все системы Unix могут работать с этим протоколом.
NFS — очень полезный инструмент, но исторически он страдал от множества ограничений, большинство из которых были устранены в версии 4 протокола. Обратной стороной является то, что последнюю версию NFS сложнее настроить, если вы хотите использовать базовые функции безопасности, такие как аутентификация и шифрование, поскольку для этих частей она использует Kerberos. А без них протокол NFS должен быть ограничен доверенной локальной сетью, поскольку данные передаются по сети в незашифрованном виде (т.е. sniffer может его перехватить), а права доступа предоставляются на основе IP-адреса клиента (который можно подделать).
11.4.1. Усиление безопасности NFS
Если вы не используете функции безопасности на основе Kerberos, крайне важно обеспечить, чтобы только машины, которым разрешено использовать NFS, могли подключаться к различным необходимым серверам RPC, поскольку базовый протокол доверяет данным, полученным из сети. Брандмауэр также должен блокировать IP spoofing, чтобы не допустить, чтобы внешний компьютер действовал как внутренний, а доступ к соответствующим портам должен быть ограничен машинами, предназначенными для доступа к общим ресурсам NFS.
Старые версии протокола требовали других сервисов RPC, которые использовали динамически назначаемые порты. К счастью, в NFS -версии 4 необходимы только порт 2049 (для NFS) и 111 (для portmapper), и, и поэтому их легко защитить брандмауэром.
Сервер NFS является частью ядра Linux; в ядрах, предоставляемых Debian, он построен как модуль ядра. Если сервер NFS должен запускаться автоматически при загрузке, nfs-kernel-server пакет должен быть установлен; он содержит соответствующие сценарии запуска.
Файл(ы) конфигурации сервера NFS, /etc/exports
и /etc/exports.d/
, содержит каталоги, доступные по сети (exported). Для каждого общего ресурса NFS доступ предоставляется только указанному списку компьютеров. Более детальный контроль доступа можно получить с помощью нескольких опций. Синтаксис этого файла довольно прост:
/directory/to/share machine1(option1,option2,...) machine2(...) ...
Обратите внимание, что в NFSv4 все экспортированные каталоги должны быть частью одной иерархии, а корневой каталог этой иерархии должен быть экспортирован и идентифицирован с помощью параметра fsid=0
или fsid=root
.
Каждую машину можно идентифицировать либо по DNS-имени, либо по IP-адресу. Целые наборы машин также могут быть указаны с использованием синтаксиса, такого как *.falcot.com
или диапазон IP-адресов, например 192.168.0.0/255.255.255.0
или 192.168.0.0/24
.
По умолчанию каталоги доступны только для чтения (или с помощью опции ro
). Опция rw
разрешает доступ для чтения и записи. Клиенты NFS обычно подключаются через порт, ограниченный root (ниже 1024); это ограничение может быть снято опцией insecure
(опция secure
подразумевается, но при необходимости для ясности её можно сделать явной).
По умолчанию сервер отвечает на запрос NFS только после завершения текущей операции с диском (опция sync
); это можно отключить с помощью опции async
. Асинхронная запись немного увеличивает производительность, но снижает надёжность, поскольку существует риск потери данных в случае сбоя сервера между подтверждением записи и фактической записью на диск. Поскольку значение по умолчанию недавно изменилось (по сравнению с историческим значением NFS), то значение рекомендуется указать явно.
Чтобы не предоставлять root-доступ к файловой системе любому клиенту NFS, все запросы, поступающие от пользователя root, рассматриваются сервером как исходящие от пользователя nobody
. Это поведение соответствует параметру root_squash
и включено по умолчанию. Параметр no_root_squash
, отключающий такое поведение, является рискованным и его следует использовать только в контролируемых средах. Если все пользователи должны быть сопоставлены с пользователем nobody
, используйте all_squash
. Параметры anonuid=uid
и anongid=gid
позволяют указать другого поддельного пользователя вместо UID/GID 65534 (что соответствует пользователю nobody
и группе nogroup
).
В NFSv4 вы можете добавить параметр sec
, чтобы указать желаемый уровень безопасности: sec=sys
используется по умолчанию без каких-либо специальных функций безопасности, sec=krb5
включает только аутентификацию, sec=krb5i
добавляет целостность. защита, а sec=krb5p
— это наиболее полный уровень, включающий защиту конфиденциальности (с шифрованием данных). Чтобы это работало, вам нужна работающая настройка Kerberos (эта служба не рассматривается в этой книге).
Доступны другие варианты; они задокументированы в странице руководства exports(5).
Как и в случае с другими файловыми системами, интеграция общего ресурса NFS в системную иерархию требует монтирования (и пакета nfs-common). Поскольку эта файловая система имеет свои особенности, потребовалось внести некоторые изменения в синтаксис команды mount
и файла /etc/fstab
.
Пример 11.19. Manually mounting with the mount
command
#
mount -t nfs4 -o rw,nosuid arrakis.internal.falcot.com:/shared /srv/shared
Пример 11.20. NFS entry in the /etc/fstab
file
arrakis.internal.falcot.com:/shared /srv/shared nfs4 rw,nosuid 0 0
Запись, описанная выше, монтирует при запуске системы каталог NFS /shared/
из сервера arrakis
в локальный каталог /srv/shared/
. Запрашивается доступ для чтения и записи (следовательно параметр rw
). Опция nosuid
— это мера защиты, которая стирает любой бит setuid
или setgid
из программ, хранящихся на общем ресурсе. Если общий ресурс NFS предназначен только для хранения документов, другой рекомендуемый вариант — noexec
, что предотвращает выполнение программ, хранящихся на общем ресурсе. Обратите внимание, что на сервере каталог shared
находится ниже корневого экспорта NFSv4 (например, /export/shared
), это не каталог верхнего уровня.
nfs(5) на странице руководства все параметры описаны довольно подробно.