Личный блог Suvan`a.

Работая и играя с Linux... И что из этого иногда получается.

Сетевая файловая система NFS.

Рубрика: Безопасность -> Защита сервисов
Метки: | | |
Понедельник, 17 августа 2009 г.
Просмотров: 8854
Подписаться на комментарии по RSS

NFS позволяет предоставить общий доступ к каталогам Unix-машины. Небезопасность NFS, и в частности NIS, связана с RPC - по количеству всевозможных эксплоитов RPC представляется негласным лидером (если не считать Sendmail). Так как эти протоколы предназначены для внутренних сетей, защищать их придется от «своих» пользователей. Хотя перед их применением нужно решить, действительно ли они нужны.

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

     Файловая система NFS.

     Сетевая файловая система (Network File System, NFS) была разработана компанией Sun как средство доступа к файлам, размещенным на прочих Unix-машинах в пределах локальной сети. При разработке NFS безопасность вообще не учитывалась, что с годами стало причиной многих уязвимостей.

     NFS может работать по протоколу TCP или UDP, она использует систему RPC, а это означает, что должны быть запущены следующие часто уязвимые приложения: portmapper, nfs, nlockmgr (lockd), rquotad, statd и mountd.

     Не надо запускать NFS - нужно найти альтернативное решение. Если же NFS все-таки нужна, здесь будет рассказано о том, как нужно минимизировать риск ее использования.


     /etc/exports

     Первый шаг заключается в выборе машин, которые будут экспортировать свои файловые системы. Потом можно определить, каким машинам допускается подключаться к NFS-серверам (или серверу, если он один) сети. Не надо использовать NFS на машинах, непосредственно (напрямую) подключенных к Интернету. После того, как будут выбраны машины, надо выбрать каталоги на этих машинах, которые будут экспортированы.

     Каталоги «на экспорт» определяются в файле /etc/exports. Формат каждой записи прост: имя каталога, список пользователей, которым разрешен доступ и режим доступа. К примеру:

/home/user 10.0.0.6(rw)

     Полный доступ (чтение/запись) к каталогу /home/user разрешен машине с IP-адресом 10.0.0.6. Самое лучшее - это не давать полный доступ, а ограничиться доступом «только чтение» (rо). Кроме данного, можно также указать следующие опции:

  • Secure - запрос на монтирование (mount) должен исходить из привилегированного порта (с номером до 1024). Это означает, что команду на монтирование ввел пользователь с привилегиями root.
  • Root_squash - запрос пользователя root будет расцениваться как запрос анонимного пользователя. Это позволяет причинить наименьший вред системе. Эта опция должна быть включена.
  • All_squash - все запросы (не только от пользователя root) будут расцениваться как исходящие от анонимного пользователя. Полезно применять для публично экспортируемых каталогов.

     Если крекер с правами root получит доступ к машине, которой дан rw-доступ к каталогу, указанному в /etc/exports, он получит полный контроль над файловой системой, поэтому нельзя экспортировать корневой каталог (/), и системно-важные каталоги, к примеру /usr, /bin, /sbin, /lib, /opt и /etc. Хорошо для экспорта подходят домашние каталоги пользователей.

Со стороны клиента монтирование общей файловой системы нужно выполнять указанием опции -о nosuid:

# mount -t nfs -о nosuid 10.0.0.3 :/home/user/files /mnt/home/frank

     Это не даст крекеру, получившему доступ к NFS-серверу, получить root-доступ к клиентам.

     Ограничение доступа.

     Независимо от сервиса для ограничения доступа к машине нужно применять IPTables. В случае с NFS-сервером это особенно важно. При применении IPTables надо помнить, что NFS-демон использует порт 2049/TCP/UDP.

     Некоторые RPC-сервисы, к примеру portmapper и NFS, используют постоянные порты (113 и 2049/tcp/udp соответственно), но у остальных RPC-сервисов порты не постоянны, что затрудняет фильтрацию пакетов с помощью IPTables. Единственное, что известно, - это то, что RPC используют порты в диапазоне 32768-65535.

     Если используется ядро 2.4.13 или более новое, то с помощью опции -р <порт> можно точно указать порт для каждого RPC-сервиса.

     Рассмотрим функцию start() из файла /etc/rc.d/init.d/nfslock, используемую для запуска nsflock:

start () {

    #. Start daemons .

    if [ "$USERLAND_LOCKD" ]; then

    echo -n $"Starting NFS locking: "

    daemon rpc.lockd

    echo

    fi

    echo -n $"Starting NFS statd: "

    daemon rpc.statd

    RETVAL=$?

    echo [ $RETVAL -eq 0 ] && touch /var/touch/lock/subsys/nfslock

    return $RETVAL }

     Для того, чтобы заставить демон statd употреблять конкретный порт, можно употреблять опцию -р, к примеру daemon rpc.statd -p 32800 (или какой угодно другой - какой больше нравится). Точно так же нужно установить порт для mountd, nfsd, rquotad - все они запускаются из сценария /etc/rc.d/init.d/nfs:

start () {

    # Start daemons.

    action -n $"Starting NFS services: " /usr/sbin/exportfs -r

    if t _x /usr/sbin/rpc.quotad ] ; then echo -n $"Starting NFS quotas: " daemon rpc.rquotad echo

    fi echo -n $"Starting NFS mountd: "

    daemon rpc.mountd 3RPCMOUNTDOPTS

    echo

    echo -n $"Starting NFS daemon: " daemon rpc.nfsd $RPCNFSDOPTS echo touch /var/lock/subsys/nfs

     Технология изменения порта для lockd (nlockmgr) отличается от вышеприведенной (не надо пытаться изменить файл /etc/rc.d/init.d/nfslock - ничего не выйдет).

     Lockd исполнен или как модуль ядра, или вкомпилирован в ядро статически. Для изменения номера порта надо открыть файл /etc/modules и найти опции, передаваемые модулю:

options lockd nlm_udpport=33000 nlm_tcpport=33000

     Теперь, когда RPC-сервисы используют статические порты, которые известны, надо применять IPTables. В следующем наборе правил предполагается, что NFS - единственный запущенный на машине сервер, доступ к которому разрешен только машинам, перечисленным в файле /usr/local/etc/nfsexports.hosts:

  IPX = "/usr/sbin/iptables"

  # Очищаем все цепочки

  $IPT --flush

  $IPT -t nat --flush $IPT -t mangle --flush $IPT -X

  # Разрешаем loopback-трафик $IPT -A INPUT -i lo -j ACCEPT $IPT -A OUTPUT -o lo -j ACCEPT

  # Правила по умолчанию $IPT -P INPUT DROP $IPT -P OUTPUT DROP $IPT -P FORWARD DROP

  $IPT -A INPUT -m state —state ESTABLISHED,RELATED -j ACCEPT $IPT -A OUTPUT -m state —state NEW,ESTABLISHED,RELATED -j ACCEPT

  # Разрешаем доступ каждому компьютеру,

  # указанному в /usr/local/etc/nfsexports.hosts

  for host in "cat /usr/local/etc/nfsexports.hosts'; do   $IPT -I INPUT -s $host -p tcp —dport 111 -j ACCEPT

  $IPT -I INPUT -s $host -p udp —dport 111 -j ACCEPT

  $IPT -I INPUT -s $host -p udp —dport 2049 -j ACCEPT

  $IPT -I INPUT -s $host -p tcp --dport 32800 -j ACCEPT

  $IPT -I INPUT -s $host -p tcp --dport 32900 -j ACCEPT

  $IPT -I INPUT -s $host -p tcp —dport 33000 -j ACCEPT

  $IPT -I INPUT -s $host -p tcp --dport 33100 -j ACCEPT

  done

     Конечно, это только скелет, нужно будет добавить еще много правил: хотя бы разрешить применение SSH и установить некоторые параметры ядра с помощью /prос.

     Туннелирование NFS через SSH.

     Аббревиатура NFS иногда расшифровывается как «No File Security» - данные три слова говорят сами за себя. Поэтому очень важно обеспечить защиту NFS-трафика. Это легко сделать с помощью ssh.

Начально можно изменить файл /etc/exports на NFS-сервере так, чтобы файловые системы экспортировались локальному узлу:

/home/user 127.0.0.1(rw)

     Затем надо применять SSH для форвардинга портов NFS и mountd. NFS использует порт 2049/udp, a mountd, как было указано, порт с номером 33000:

# ssh root@192.168.0.1 -L 200: localhost:2049 -f sleep 120m

# ssh root@192.168.0.1 -L 200: localhost:33000 -f sleep 120m

     Данные две команды предоставляют пользователю интерактивную оболочку, но, так как она не нужна, SSH выполняет команду sleep 120: возвращаемся обратно в командную строку, но форвардинг портов будет длиться еще 2 часа.

     Монтирование файловой системы со стороны клиента выглядит очень необычно:

mount -t nfs -о nosuid port=200 mountport=210 nfsserver.test.net:/home/user /mnt/another

     SHFS

     Если трюки с ssh-тунпелированием слишком сложны, можно применять проект SHFS (Shell Filesystem) (http: //shfs.sourceforge.net/), который дает возможность автоматизировать всю эту процедуру.

     После установки получить доступ к SHFS надо или с помощью команды mount -t shfs, или с помощью новой команду shfsmount. Синтаксис данной команды похож на предыдущий:

shfsmount user@192.168.10.1:/home/user /mnt/user

     CFS и TCFS

     Криптографическая файловая система (Cryptographic File System) использует прозрачное кодирование и дешифрование NFS-трафика с помощью алгоритма DES. Кроме данного, она поддерживает автоматическое управление ключами, что делает процесс максимально «прозрачным» для пользователя.

     Хотя CFS разработана для SunOS и BSD, она порядком интересна, потому что представляется первой попыткой «прозрачного» кодирования общих файлов. Прозрачная криптографическая файловая система (Transparent Cryptographic File System, TCFS) предоставляет еще более прозрачный способ кодирования NFS-трафика.

     Кроме кодирования данных, данная файловая система поддерживает проверку целостности данных.  

Оставьте комментарий!

Не регистрировать/аноним

Используйте нормальные имена.

Если вы уже зарегистрированы как комментатор или хотите зарегистрироваться, укажите пароль и свой действующий email.
(При регистрации на указанный адрес придет письмо с кодом активации и ссылкой на ваш персональный аккаунт, где вы сможете изменить свои данные, включая адрес сайта, ник, описание, контакты и т.д.)



(обязательно)