Сетевые сервисы: NFS

 

NFS (Network File System) является хорошим способом разделять файловые системы по сети. NFS прежде всего создан для использования в сети с высокой пропускной способностью. Если Вы нуждаетесь в высоком уровне защиты, типа передачи зашифрованных данных между серверами, NFS не самый лучший выбор. Я лично использую это в моей внутренней LAN. Более безопасные варианты включают SAMBA (свободный), и IBM переносит AFS на Linux (дорогостоящий, но AFS того стоит).

NFS имеет несколько рудиментарных средств управления защиты. Первым был firewalling; использование NFS через публичную медленную сеть (под такое определение прекрасно подходит Internet) плохая мысль. NFS работает как набор демонов daemons, TCP_WRAPPERS использовать бесполезно, если NFS не откомпилирована для их использования. Файл настройки NFS имеет несколько директив, большая часть которых имеет дело с идентификатором пользователя и группирует параметры настройки идентификатора, но никаких реальных механизмов для авторизации тут нет (пользователь может утверждать, что был UID 0). NFS-экспорт только для чтения довольно безопасен, Вы должны волноваться только относительно того, что прочитает данные не тот, кому можно.

Поддержка записи должна применяться очень аккуратно, так как единственная 'аутенфикация' основана на IP/hostname (что легко подделать: называется спуфинг) и UID (Вы можете выполнять Linux и иметь UID 0 на своей машине).

Так как же обезопасить NFS? Сначала, используем firewall, особенно если машина с интерфейсом, связанным с публично доступной сетью (Internet. Если Вы планируете выполнять NFS по публично доступной сети, лучше сделать сервис доступным только для чтения.

Вторая и наиболее интересная часть: файл /etc/exports. Он контролирует, как и что позволено делать клиентам.

Пример файла exports:

# Allow a workstation to edit web content /www 10.0.0.11(rw,no_root_squash) # # Another share to allow a user to edit a web site /www/www.example.org 10.0.0.202(rw,no_root_squash) # # Public ftp directory /home/ftp *.example.org(ro,all_squash)

Структура файла exports очень проста: каталог, который Вы желаете экспортировать, пользователь (всегда используйте IP, hostname может легко быть фальшивым) и параметры. Пользователь может быть одиночным IP (10.0.0.1), hostname (gomer.example.org), подсетью (10.0.0.0/255.255.255.0) или подстановочными знаками (*.example.org). Некоторые из наболее интересных и полезных директив для файла exports:
secure: nfs-сеанс должен происходить из привилегированного порта, то есть принадлежащего root.
ro: доступ только для чтения.
noaccess: используется чтобы отключить доступ, то есть экспортируя /home, сделайте noaccess на /home/root
root_squash: считать root UID анонимным UID/GID (обычно 'nobody'), очень полезно для серверов, которым Вы не доверяете на 100% (root может почти всегда читать любой файл)
no_root_squash: полезно, если все-таки доступ root к экспортируемым каталогам (например, чтобы менять права доступа на www-сайте)
squash_uids и squash_gids: считать UID(s) или GID(s) анонимным пользователем, в Red Hat хорошим примером будет 500-10000 (по умолчанию Red Hat присваивает идентификаторы пользователям и группам, начиная с 500), пользователям с меньшим UID (специальным пользователям) имеет смысл расширить права доступа для выполнения специальных задач.
all_squash: все привилегии отменяются, все гости.
anonuid и anongid: определенно устанавливают UID/GID для анонимного пользователя (Вы могли бы сделать специальную 'anonnfs').

Очень много полезной информации можно найти на man-странице для exports.

NFS очень распространен, почти каждая разновидность UNIX поддерживает его, сервис обычно просто в установке и работе. Однако, если защита представляет собой реальную проблему, NFS лучше не ставить.

NFS должен быть ограничен по доступу из внешнего мира, он работает через порт 2049, протокол udp, также использует RPC на порте 111, протоколы udp/tcp, и использует mountd, который выполняется на порте 635, протокол udp. Замените 2049 на 111 и 635 udp и tcp, чтобы обезопасить данный сервис (самая лучшая идея: вообще закрыть порты от 1 до 1024, или еще лучше по умолчанию закрывать все лишние порты).

ipfwadm -I -a accept -P udp -S 10.0.0.0/8 -D 0.0.0.0/0 2049 ipfwadm -I -a accept -P udp -S some.trusted.host -D 0.0.0.0/0 2049 ipfwadm -I -a deny -P udp -S 0.0.0.0/0 -D 0.0.0.0/0 2049

или

ipchains -A input -p udp -j ACCEPT -s 10.0.0.0/8 -d 0.0.0.0/0 2049 ipchains -A input -p udp -j ACCEPT -s some.trusted.host -d 0.0.0.0/0 2049 ipchains -A input -p udp -j DENY -s 0.0.0.0/0 -d 0.0.0.0/0 2049

Back

Security Portal

Written by Kurt Seifried