NFS HOWTO, v0.7, 3 Ноября 1997 г.

Как установить клиента и сервер NFS.

[Nicolai Langfeldt, перевод: Alex Ott]

1. Преамбула

1.1 Легальная часть

Авторские права Nicolai Langfeldt, 1997. Не модифицировать без исправления авторских прав, распространяется свободно но должен оставаться этот параграф. Раздел FAQ основывается на NFS FAQ собранном Alan Cox. Раздел Список проверки основан на списке проверки проблем монтирования собранном IBM Corporation.

1.2 Остальное

Это будет никогда не завершенный документ, пожалуйста посылайте мне сообщения о ваших успехах и проблемах -- это сделает этот документ лучше. Пожалуйста посылайте деньги, комментарии и/или вопросы janl@math.uio.no. Если вы посылаете сообщение по электронной почте, пожалуйста будьте уверены, что ваш обратный адрес правилен и работает, я получаю довольно много сообщений по электронной почте и определение вашего адрес может дать мне лишнюю работу. Пожалуйста.

Если вы хотите перевести этот HOWTO пожалуйста дайте мне знать, чтобы я мог отслеживать на каких языках я опубликован :-).

Проклятья и благодарности Olaf Kirch, кто заставил меня написать этот документ и кто дал много пожеланий для него :-)

Этот HOWTO делает обзор NFS в ядре версии 2.0. В ядре версии 2.1 существуют значительные расширения и изменения.

1.3 Посвящение

Этот документ посвящен Anne Line Norheim Langfeldt. Хотя она вероятно никогда не прочитает его, поскольку она не относится к этому классу девушек.

2. README.first

NFS --- Network File System (Сетевая файловая система) имеет три важных характеристики:

  • Она делает возможным разделение файлов по сети.
  • Она в большинстве работает достаточно хорошо.
  • Ее открытие может быть риском для безопасности, что хорошо понимается кракерами и может быть легко взломано чтобы получить доступ (чтение, запись, удаление) ко всем вашим файлам.

Я расскажу об обоих вопросах в этом документе. Пожалуйста будьте уверены, что вы читали раздел о безопасности в этом документе и вы уменьшите уязвимость для глупых проблем безопасности. Пассажи о секретности будут довольно техническими и требовать некоторых знаний о работе IP сетей и используемых терминов. Если вы не знаете эти термины, то вы должны вернуться назад и просмотреть относящиеся к сети HOWTO или взять книгу о сетевом администрировании TCP/IP чтобы ознакомить себя с TCP/IP. В любом случае это хорошая идея если вы занимаетесь администрированием машин с UNIX/Linux. Очень хорошая книга о данном предмете это книга TCP/IP Network Administration автор Craig Hunt, опубликовано O'Reilly & Associates, Inc. И после того как вы прочитаете и поймете ее у вас будет больший вес в при поиске работы, вы не сможете быть слабым ;-)

В этом документе есть два раздела чтобы помочь вам найти неисправности при работе с NFS, эти разделы называются Список проверки проблем монтирования и FAQs. Пожалуйста посмотрите их, если что-то не работает как объявлено.

3. Установка сервера NFS

3.1 Непременные условия

До того как вы продолжите читать этот документ вам будет необходимо мочь выполнять операцию telnet между машинами, котрые вы будете использовать как сервер и клиент. Если что-то не работает, вам нужно проверить NET-3 HOWTO и правильно настроить работу сети.

3.2 Первый шаг

До того что мы сможем сделать что-нибудь другое нам необходимо настроить сервер NFS. Если вы являетесь частью сети факультета или университета, то у вас вероятно есть несколько настроенных серверов NFS. Конечно если они позволят вам получить доступ к ним и если вы читаете этот документ чтобы получить доступ к одному из них, то вам очевидно не нужно читать это раздел и вы можете просто пропустить его до раздела Установка клиента NFS

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

То о чем вы читали будет требовать настройки нескольких программ.

3.3 Portmapper

Portmapper на Linux называется либо portmap либо rpc.portmap. Справочная страница на моей системе говорит что это "Преобразователь номеров портов DARPA в вызовы соответствующих программ RPC". Это первая дыра в безопасности, которую вы откроете читая этот документ. Описание как закрыть одну из дыр находится в разделе безопасности. Который я советую вам прочитать.

Запустите portmapper. Он называется либо portmap либо rpc.portmap и должен находиться в директории /usr/sbin (на некоторых машинах он называется rpcbind). Вы можете запустить его сейчас вручную, но он должен запускаться при каждом запуске вашей машины, так что вам необходимо создать/отредактировать rc-скрипты. Ваши rc-скрипты объяснены более близко в справочной странице init, они обычно находятся в директориях /etc/rc.d, /etc/init.d или /etc/rc.d/init.d. Если там есть скрипт названный inet, то это нужный для редактирования скрипт. Но что написать или что сделать находится вне области этого документа. Запустите portmap, и проверьте что он запущен с помощью команды ps aux. Это сделано? Хорошо.

3.4 Mountd и nfsd

Следующие программы, которые нам нужно запустить это mountd и nfsd. Но сначала мы отредактируем другой файл. Это /etc/exports. Скажем я хочу, чтобы файловая система /mn/eris/local, которая находится на машине eris была доступна для машины названной apollon. Тогда я помещу в файл /etc/exports на eris следующие строки:


/mn/eris/local  apollon(rw)


Вышеприведенные строки дают apollon доступ на чтение/запись на /mn/eris/local. Вместо rw мы можем сказать ro, что означает только чтение (если вы ничего не поместите, то по умолчанию будет только чтение. Существуют другие опции, которые вы можете дать, и я позже буду обсуждать некоторые из них относящиеся к безопасности. Они все перечислены в справочной странице exports, которую вы должны прочитать по крайней мере раз в жизни. Существуют также лучшие способы чем перечисление всех машин в файле exports. Вы например можете использовать сетевые группы, если у вас работает NIS (или NYS) (NIS также известен как YP), и всегда использовать шаблоны (wild cards) домэйнов и подсетей IP как машины, которым разрешено что-то монтировать. Но вы учитывать, кто может получить доступ к серверу неавторизованным способом, если вы используете такую всеобъемлющую авторизацию.

Замечание: Этот файл exports не имеет тот же синтаксис, котрый используют другие системы Unix. В этом документе есть отдельный раздел о файлах exports других Unix-систем.

Сейчас мы готовы к запуску mountd (или он может называться rpc.mountd) и nfsd (который может называться rpc.nfsd). Обе эти программы читают файл exports.

Если вы отредактировали файл /etc/exports, то вы должны быть уверены, что nfsd и mountd знают что файл изменен. Традиционный способ сделать это -- это запустить программу exportfs. Во многих дистрибутивах Linux программа exportfs отсутствует. Если это так вы можете создать такой скрипт на вашей машине:


#!/bin/sh

killall -HUP /usr/sbin/rpc.mountd

killall -HUP /usr/sbin/rpc.nfsd

echo re-exported file systems


Сохраните его в файле, скажем /usr/sbin/exportfs, и не забудьте выполнить chmod a+rx. Сейчас, после того как вы изменили ваш файл exports, вы должны запустить exportfs как root.

Теперь вы должны проверить, что mountd и nfsd запущены правильно. Сначала это делается с помощью rpcinfo -p. Вывод программы должен показать что-то подобное следующему:


   program vers proto   port

    100000    2   tcp    111  portmapper

    100000    2   udp    111  portmapper

    100005    1   udp    745  mountd

    100005    1   tcp    747  mountd

    100003    2   udp   2049  nfs

    100003    2   tcp   2049  nfs


Как вы видите portmapper анонсировал свои сервисы, и что имеются mountd и nfsd.

Если вы получили сообщение rpcinfo: can't contact portmapper: RPC: Remote system error - Connection refused или что-то подобное вместо этого, то значит portmapper не запущен. Исправьте это. Если вы получили сообщение No remote programs registered., то либо portmapper не хочет говорить с вами, либо что-то не в порядке. Завершите nfsd, mountd и portmapper и попытайтесь выполнить заново стартовую последовательность.

После проверки что portmapper объявил сервисы вы также можете выполнить проверку с помощью ps. Portmapper будет продолжать объявлять свои сервисы даже после того как программы расширяющие его возможности завершили работу. Так что проверка с помощью ps может быть умной, если что-то выглядит сломанным.

Конечно вам будет нужно исправить ваши системные rc-файлы для запуска mountd и nfsd также как и portmapper при загрузке. Очень вероятно, что эти скрипты уже существуют на вашей машине, и вам будет нужно только раскомментировать нужный раздел или активизировать скрипт на нужном уровне запуска.

Справочные страницы, которые вы должны сейчас знать: portmap, mountd, nfsd и exports.

Хорошо, если вы сделали все как я сказал, вы должны установить все для запуска сервера NFS.

4. Настройка клиента NFS

Первым делом вам нужно ядро с поддержкой файловой системы NFS либо вкомпилированной в ядро, либо доступной как модуль. Это настраивается до компиляции ядра. Если вы никогда не компилировали ядро, то вам может быть нужно прочитать Rernel HOWTO и выяснить как это делается. Если вы используете хороший дистрибутив (такой как RedHat) и вы никогда не экспериментировали с ядром или модулями (и таким образом разрушали его ;-), вероятно что nfs автоматически доступен для вас.

Теперь вы можете, в командной строке администратора, ввести соответствующую команду монтирования и файловая система появится у вас. Продолжая пример из предыдущего раздела мы хотим смонтировать /mn/eris/local с машины eris. Это делается с помощью такой команды:


mount -o rsize=1024,wsize=1024 eris:/mn/eris/local /mnt


(Мы вернемся к опциям rsize и wsize). Файловая система сейчас доступна в /mnt и вы можете перейти туда и выполнить ls в ней, и посмотреть на индивидуальные файлы. Вы заметите, что это не так быстро как локальная файловая система, но более удобно чем ftp. Если вместо монтирования файловой системы команда mount выдаст сообщение об ошибке mount: eris:/mn/eris/local failed, reason given by server: Permission denied, то файл exports является неправильным или вы забыли запустить exportfs после редактирования файла exports. Если команда сообщит mount clntudp_create: RPC: Program not registered это означает, что nfsd или mountd не запущены на сервере.

Чтобы избавиться от файловой системы вы можете выполнить:


umount /mnt


Чтобы выполнить системное монтирование файловой системы nfs при загрузке вам нужно отредактировать файл /etc/fstab как обычно это делается. Для нашего примера требуется такая строка:


# device      mountpoint     fs-type     options              dump fsckorder

...

eris:/mn/eris/local  /mnt    nfs        rsize=1024,wsize=1024 0    0

...


Это почти все что есть. Читайте пожалуйста дальше.

4.1 Опции монтирования

Здесь даны некоторые опции, которые вы должны рассмотреть сразу добавляя их. Они управляют способом, которым клиент NFS отрабатывает падение сервера или отключение сети. Одно из свойств NFS в том, что он может изящно обрабатывать эти неполадки. Если вы правильно установите клиента. Существует два различающихся режима обработки ошибок:

soft

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

hard

Программа имеющая доступ к файлу на смонтированной по NFS файловой системе просто повесится при крахе сервера. Процесс не может быть прерван или убит до тех пор пока вы явно не укажите опцию intr. Когда сервер NFS будет запущен заново, то программа будет безмятежно продолжать работу с прерванного места. Это скорее всего то что вам нужно. Я рекомендую использовать опции hard,intr на всех файловых системах смонтированных NFS.

Продолжая предыдущий пример, теперь в нашем файле fstab запись будет выглядеть так:


# device      mountpoint     fs-type    options                  dump fsckorder

...

eris:/mn/eris/local  /mnt    nfs        rsize=1024,wsize=1024,hard,intr 0 0

...


4.2 Оптимизация NFS

Обычно, если опции rsize и wsize не заданы, то NFS будет читать и писать блоками по 4096 или 8192 байтов. Некоторые комбинации ядер Linux и сетевых карт не могут обрабатывать такие большие блоки, и это может быть неоптимально. Так что нам нужно экспериментировать и найти значения rsize и wsize, которые работают так быстро насколько это возможно. Вы можете протестировать скорость при заданных вами опциях с помощью некоторых простых комманд. Задав вышеприведенную команду монтирования и получив доступ с правом записи на диск, вы можете выполнить тестирование производительности последовательной записи:


time dd if=/dev/zero of=/mnt/testfile bs=16k count=4096


Эта команда создает 64Mb файл, заполненный нулями (этот файл должен быть достаточно большим, настолько большим, чтобы кэширование не сыграло значительную роль в производительности, используйте больший размер файла, если у вас достаточно много памяти). Проделайте эту операцию несколько раз (5-10?) и усредните полученные результаты. Полученная величина это время `прохода', т.е. величина наиболее интересующая нас в этом эксперименте. Затем вы можете измерить производительность чтения, прочитав файл обратно на свою машину:


time dd if=/mnt/testfile of=/dev/null bs=16k


сделайте это также несколько раз и усредните результат. Затем отмонтируйте диск и примонтируйте заново с увеличенными значениями rsize и wsize. Они вероятно должны быть кратными 1024, и не больше чем 16384 байтов, поскольку это максимальный размер в NFS версии 2. Прямо после монтирования с увеличенными значениями перейдите в смонтированную файловую систему и выполните команду подобную ls, исследуйте файловую систему, чтобы убедиться, что все в норме. Если значения rsize/wsize слишком большие, то симптомы очень необычные и не 100%-но очевидные. Типичный симптом в неполном списке файлов при выполнении команды 'ls', и отсутствие сообщений об ошибках. Или чтение файлов загадочно срывается без сообщения об ошибке. После установления факта, что заданные значения rsize/wsize раюотают, вы можете далее продолжать тестировать производительность. различные серверные платформы вероятно имеют различные оптимальные размеры блоков. SunOS и Solaris по общему мнению довольно быстрее при размере блока равном 4096 байт, чем при других значениях.

Новые ядра Linux (с версии 1.3) выполняют предваряющее чтение для значений rsize больших или равных размеру страницы машины. На процессорах Intel размер страницы равен 4096 байтам. Предваряющее чтение значительно увеличит производительность NFS при чтении. Так что на машинах с процессором Intel вы захотите использовать значение rsize равное 4096 байтам из всех возможных.

Помните, что вам нужно отредактировать /etc/fstab для задания найденных значений rsize/wsize.

Прием для увеличения производительности NFS при записи заключается в запрещении синхронной записи на сервер. Спецификация NFS требует, чтобы запросы NFS на запись не считались законченными до записи данных на неизменчивый носитель (обычно диск). Это ограничивает производительность записи, а асинхронная запись увеличит скорость записи по NFS. Демон nfsd для Linux никогда не делает синхронную запись, поскольку реализация файловой системы Linux сама не дает сделать это, но серверах работающих на отличных от Linux системах вы можете увеличить производительность этим способом, поместив в ваш файл exports:


/dir    -async,access=linuxbox


или что-нибудь подобное. Пожалуйста посмотрите справочную страницу exports на данной машине. Также запомните, что это увеличивает риск потери данных.

5. NFS через медленные линии

Медленные линии включают в себя модемы, ISDN и возможно другие соединения на дальние расстояния.

Этот раздел базируется на знании об используемых протоколах, а не на настоящих экспериментах. Мой домашний компьютер был выключен в течении 6 месяцев (плохой жесткий диск и отсутствие денег), так что у меня не было модемного соединения для тестирования. Пожалуйста дайте мне знать, если вы попробуете сделать это :-)

Первая вещь которую вы должны помнить, это то что NFS -- медленный протокол. Использование NFS в большинстве своем подобно использованию протокола kermit для переноса файлов. Это медлено. Почти все быстрее чем NFS. FTP быстрее. HTTP быстрее. rcp быстрее. ssh быстрее.

Все еще хотите попробовать это? Ok.

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

первая вещь которую вам необходимо сделать -- это не использовать опцию монтирования soft. Это вызовет возвращение программному обеспечению сигналов об ошибках при таймаутах, в основном обычное программное обеспечение не слишком хорошо обрабатывает такие ошибки. Это хороший способ получить странные сбои. Вместо этого используйте опцию монтирования hard. Когда активна опция hard, то таймауты вызывают бесконечные попытки возобновления вместо прерывания работы ваших программ. Это то что вам нужно. Действительно.

Следующая вещь которую нужно сделать -- это поиграть с опциями монтирования timeo и retrans. Они описаны в справочной странице nfs(5), здесь приводится выдержка из нее:


       timeo=n        Величина в десятых долях секунды до посылки

                      первой ретрансляции после таймаута RPC. По

                      умолчанию эта величина равна 7 десятых

                      секунды. После первого таймаута, время таймаута

                      удваивается после каждого таймаута, пока не

                      будет достигнута величина максимального таймаута 

                      равна 60 секундам, или произойдет достаточно

                      ретрансляции, вызвав главный таймаут. Затем если 

                      файловая система смонтирована с опцией hard, то

                      каждый новый таймаут каскадно запускается с

                      начальным значением в два раза больше, чем при

                      предыдущем каскаде, кроме того удваиваясь на

                      каждой ретрансляции. максимальный таймаут всегда 

                      равен 60 секундам. Наилучшая общая

                      производительность может быть достигнуто

                      увеличением таймаута при монтировании на

                      загруженной сети, к медленному серверу, или

                      сквозь несколько маршрутизаторов.



       retrans=n      Эта величина задает количество неосновных

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

                      произойти до возникновения главного таймаута. По 

                      умолчанию эта величина равно 3. Когда возникает

                      главный таймаут, то файловые операции либо

                      прерваны или на консоли печатается сообщение 

                      "server  not responding".


Другими словами: Если не будет передан за таймаут равный 0.7 секунды (700ms), то клиент NFS повторит запрос и увеличит таймаут в два раза до 1.4 секунды. Если ответ не придет в течении 1.4 секунды, то запрос повторится снова и таймаут будет увеличен до 2.8 секунды.

Скорость линии может быть измерена с помощью команды ping с тем же самым размером пакета, который вы установили в опциях rsize/wsize.


$ ping -s 8192 lugulbanda

PING lugulbanda.uio.no (129.240.222.99): 8192 data bytes

8200 bytes from 129.240.222.99: icmp_seq=0 ttl=64 time=15.2 ms

8200 bytes from 129.240.222.99: icmp_seq=1 ttl=64 time=15.9 ms

8200 bytes from 129.240.222.99: icmp_seq=2 ttl=64 time=14.9 ms

8200 bytes from 129.240.222.99: icmp_seq=3 ttl=64 time=14.9 ms

8200 bytes from 129.240.222.99: icmp_seq=4 ttl=64 time=15.0 ms



--- lugulbanda.uio.no ping statistics ---

5 packets transmitted, 5 packets received, 0% packet loss

round-trip min/avg/max = 14.9/15.1/15.9 ms


Время здесь показывает как долго пакет ping идет туда и обратно к машине lugulbanda. 15ms это довольно быстро. При работе через модем со скоростью 28.000 бод вы можете ожидать где-то 4000-5000ms, и если линия нагружена еще кем-то, то время будет даже выше может быть раза в два. Когда это время высоко, мы говорим что это 'высокое запаздывание'. В общем для больших пакетов и для более загруженных линий запаздывание будет увеличиваться. Увеличьте timeo соответственно вашей линии и загрузке. И поскольку запаздывание увеличивается когда вы используете линию для других вещей: даже если вы хотите использовать FTP и NFS в одно и тоже время, то вы должны попытаться измерить время ping во время использования FTP для передачи файлов.

6. Безопасность и NFS

Я ни коим образом не являюсь экспертом в области компьютерной безопасности. Но у меня есть маленький совет для сознающих безопасность. Но будьте предупреждены: это ни в коем случае не полный список относящихся к NFS проблем, и если вы думаете, что вы обезопасились один раз прочитав и выполнив, все что я даю здесь, то я хочу предать вас.

Этот раздел не должен беспокоить вас если вы находитесь в закрытой сети, где вы доверяете всем пользователям, и никто кому вы не доверяете ни может получить доступ к машинам в сети. Например не должно быть dial-соединения в сеть, и не должно быть никакого способа подключиться к сети, в которой вы не доверяете всем. Вы думаете я параноик? Я не параноик во всех областях. Это базовый совет по безопасности. Безопасный требует наличия тщательного и знающего администратора, который знает где найти информацию о текущих и потенциальных проблемах безопасности.

NFS имеет основную проблему в том, что клиент, если не задано будет доверять серверу и наоборот. Это может быть плохо. Это значит, что если запись администратора сервера NFS взломана, то также легко может быть взломана запись администратора клиентской машины. И наоборот. Существует набор полицейских стратегий для этого, к которым мы вернемся.

Что вам необходимо читать -- это консультационные материалы CERT относящиеся к NFS, большинство текстов приведенных ниже связаны с советами, написанными в выпусках CERT. Смотрите ftp.cert.org/01-README для обновленного списка консультаций CERT. Здесь приведены некоторые относящиеся к NFS консультации:


CA-91:21.SunOS.NFS.Jumbo.and.fsirand                            12/06/91

     Уязвимость в отношении сетевой файловой системы (NFS) Sun

     Microsystems, Inc. (Sun) и программы fsirand. Эта уязвимость

     возможна в версиях SunOS 4.1.1, 4.1, and 4.0.3 на всех

     архитектурах. Заплатки (Patches) доступны для SunOS

     4.1.1. Также доступна начальная заплатка для SunOS 4.1 NFS. Sun

     будет обеспечит полные заплатки для SunOS 4.1 и SunOS 4.0.3 позже.



CA-94:15.NFS.Vulnerabilities                                    12/19/94

     Этот консультационный материал обеспечивает измерение

     безопасности для охраны против против некоторых дыр в безопасности

     в сетевой файловой системе (NFS). Этот материал выпущен в связи с

     увеличением случаев взлома машин используя утилиты для

     использования уязвимых точек.



CA-96.08.pcnfsd                                                 04/18/96

     Этот материал описывает проблемы с безопасностью в программе pcnfsd

     (также известной как rpc.pcnfsd). Заплатка для исправления ошибки

     прилагается. 


6.1 Безопасность клиента

На клиентской стороне мы можем решить, мы не хотим слишком сильно доверять серверу, это делается несколькими способами с помощью опций монтирования. Например, мы можем запретить выполнение программ с установленным битом suid в файловой системе NFS, это делается опцией монтирования nosuid. Это хорошая идея и вы должны рассмотреть ее, используя смонтированные по NFS. Это означает что администратор сервера не сможет сделать программы с установленным suid-администратора на файловой системе, затем войти на машину клиента как обычный пользователь и затем используя программу с suid-администратора стать приобрести также права администратора на машине клиента. Мы также можем запретить выполнение файлов на смонтированной файловой системе с помощью опции noexec. Но менее распространено по сравнению с опцией nosuid, поскольку файловая система вероятно содержит по крайней мере некоторые скрипты, или программы, которые необходимо выполнить. Вы можете ввести эти опции в колонке опций вместе с опциями rsize и wsize, разделенными запятыми.

6.2 Безопасность сервера: nfsd

на сервере мы можем решить, что мы не хотим доверять администратору клиента. Мы можем сделать это используя опцию root_squash в файле exports:


/mn/eris/local apollon(rw,root_squash)


Теперь, если пользователь с UID 0 на клиенте попытается получить доступ (чтение, запись, удаление), то файловый сервер выполнит подстановку UID пользователя `nobody' на сервере. Это означает, что администратор клиента не сможет получить доступ или изменять файлы, которые может изменять или иметь доступ только администратор сервера. Это хорошо и вы должны вероятно использовать опцию root_squash на всех экспортируемых файловых системах. Вы скажете, что "Администратор клиента все равно может выполняить команду 'su', чтобы зайти как любой другой пользователь и получить доступ и изменить любые пользовательские файлы". На это есть ответ: "Да есть такой способ, и это работает в Unix и NFS. Это имеет одно важное заключение: Все важные файлы и программы должны иметь владельцем пользователя root, а не пользователя bin или другого пользователя не-администратора, поскольку только администратор клиента не может получить дочтуп как администратор сервера. С справочной странице NFSd есть несколько других подобных опций, так что вы можете решить, что вы (не) доверяете кому-либо со стороны клиента. У вас также имеются опции для осечения любых диапазонов UID и GID которые вы хотите. Это описывается в справочной странице Linux NFSd.

root_squash является установленным по умолчанию для Linux NFSd, для передачи администраторских полномочий для доступа к файловой системе используйте опцию no_root_squash.

Другая важная вещь, которую необходимо сделать, это проверить, что nfsd проверяет, что все запросы приходят с привелигированного порта. Если он принимает запросы с любого старого порта на клиенте, то пользователь без специальных привелегий может запустить программу, которую легко получить по Internet. Он умеет "говорить" на языке протокола nfs и будет притворяться, что пользователь является любым пользователем, которым он хочет быть. NFSD на Linux делает эту проверку по умолчанию, но для других операционных систем вы должны разрешить эту проверку сами. Это должно быть описано в справочной странице nfsd для вашей операционной системы.

Другая вещь. Никогда не экспортируйте файловую систему для хоста 'localhost' или 127.0.0.1. Доверяйте мне.

6.3 Безопасность сервера: portmapper

Основа portmapper, в соединении с nfsd имеют проблему проектирования, которая делает возможной получить файлы с серверов NFS без каких-либо привелегий. К счастью portmapper под Linux использует относительную безопасность против такой атаки, и может быть сделано более безопасной настройкой списка доступа в двух файлах.

Сначала мы отредактируем файл /etc/hosts.deny. Он должен содержать строку


portmap: ALL


которая запретит доступ всем. Это может быть слишком решительным, так что мы снова откроем доступ отредактировав файл /etc/hosts.allow. Но сначала нам надо определить, что мы туда поместим. Он должен перечислять все машины, которые должны иметь доступ к вашему portmapper. Среди множества работающих под Linux систем только некоторым машинам нужен любой доступ для любой работы. Portmapper обслуживает nfsd, mountd, ypbind/ypserv, pcnfsd, и 'r' сервисы, такие как ruptime и rusers. Из них только nfsd, mountd, ypbind/ypserv и возможно pcnfsd имеют какое-либо значение. Всем машинам, которым необходим доступ к сервисам на вашей машине должно быть разрешено делать это. Скажем адрес машины равен 129.240.223.254 и что она находится в подсети 129.240.223.0, и она должна иметь доступ к сервисам на вашей машине (эти термины введены HOWTO по сетям, вернитесь к нему и освежите свои знания, если это необходимо). Затем мы напишем


portmap: 129.240.223.0/255.255.255.0


в hosts.allow. Это тоже самое, что и сетевой адрес, который вы даете командой route и маска подсети, которую вы даете ifconfig. Для устройства eth0 на этой машине ifconfig должен показывать


...

eth0      Link encap:10Mbps Ethernet  HWaddr 00:60:8C:96:D5:56

          inet addr:129.240.223.254  Bcast:129.240.223.255  Mask:255.255.255.0

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:360315 errors:0 dropped:0 overruns:0

          TX packets:179274 errors:0 dropped:0 overruns:0

          Interrupt:10 Base address:0x320 

...


и netstat -rn должен показывать


Kernel routing table

Destination     Gateway         Genmask         Flags Metric Ref Use    Iface

...

129.240.223.0   0.0.0.0         255.255.255.0   U     0      0   174412 eth0

...


(Сетевой адрес находится в первой колонке).

Файлы hosts.deny и hosts.allow описаны в справочных страницах с теми же именами.

ВАЖНО: Не помещайте ничего кроме IP НОМЕРОВ в строках portmap в этих файлах. Поиск имен машин может вызвать активность portmap, которая вызовет поиск имен машин, которое вызовет portmap, которое вызовет...

Вышеприведенные вещи должны вызвать переключение вашего сервера. Остающаяся проблема в том, что кто-то взломает бюджет администратора (или загрузит MS-DOS) на машине, которой доверяют и использует эти привелегии для посылки запросов на безопасный порт, как любой пользователь, которым он захочет быть.

6.4 NFS и firewall

Очень хорошая идея защитить порты nfs и portmap с помощью firewall на вашем маршрутизаторе или firewall. Nfsd работает на порту 2049, на обоих протоколах udp и tcp. Portmapper работает на порту 111, tcp и udp, и mountd работает на портах 745 и 747, tcp и udp. Обычно. Вы должны проверить номера портов, используя команду rpcinfo -p.

Если вы хотите использовать NFS сквозь firewall, то есть опции для новых версий NFSd и mountd, для того, чтобы заставить их использовать специфические (нестандартные) порты, которые могут быть открыты в firewall.

6.5 Резюме

Если вы используете hosts.allow/deny, root_squash, nosuid и привилегированные порты в программном обеспечении portmapper/nfs, то вы можете избежать известных ошибок в nfs и можете чувствовать себя почти в безопасности. Но все равно: Когда взломщик имеет доступ к вашей сети, то он/она может добавить странные команды в ваш файл .forward или почтовый ящик, когда /home или /var/spool/mail смонтирован через NFS. По той же причине, вы никогда не должны осуществлять доступ к вашим личным ключам PGP через nfs. Или по крайней мере вы должны знать какой риск существует. И знать о нем хотя бы немного.

NFS и portmapper создают комплексную систему и поэтому не полностью невероятно,что новые ошибки будут найдены, либо в основе проекта, либо в реализации, которую мы используем. Также могут быть известные дыры, которые кто-нибудь использует. Но такова жизнь. Чтобы быть в курсе таких вещей, вы должны как минимум читать группы новостей comp.os.linux.announce и comp.security.announce, как абсолютный минимум.

7. Контрольный список монтирования

Это раздел основан на контрольном списке проблем монтирования, этот документ написан в IBM Corp. Я благодарен им за то, что они сделали его доступным для использования в этом документе. Если у вас есть проблема с монтированием файловой системы NFS, то пожалуйста проверьте это список до того как вы пошлете сообщение об ошибке. Каждый пункт описывает конкретную проблему и ее решение.

  1. Файловая система не экспортируется, или не экспортируется при запросе клиента.

    Исправление: Экспортируйте ее

  2. Система разрешения имен не выдает соответствия со списком машин в файле exports.

    Например: список экспортируемых ресурсов задает экспортирование johnmad, но имя johnmad разрешается как johnmad.austin.ibm.com. Запрещено монтирование.

    Исправление: Экспортируйте ресурс для обоих форм имени машины.

    Это также случается если клиент имеет 2 интерфейса с разными имена для каждого из них и экспортируется только для одного указанного имени.

    Исправление: Экспортируйте оба интерфейса.

    Это также может произойти, если сервер не может выполнить функции lookuphostbyname или lookuphostbyaddr (это библиотечные функции) на клиенте. Убедитесь, что клиент может выполнять команды host <name>; host <ip_addr>; и обе они указывают на одну и ту же машину.

    Исправление: наладьте систему разрешения имен.

  3. Файловая система была смонтирована, после того как NFS был запущен (на том сервере). В таком случае сервер экспортирует саму точку монтирования, а не смонтированную файловую систему.

    Исправление: Выключите NFSd и затем перезапустите его.

    Заметчание: Клиенты, которые уже были примонтированы к точке монтирования файловой системы будут иметь проблемы с доступом к ней после перезапуска сервера.

  4. Дата наобум изменяется на одной или обоих машинах (это может спутать make).

    Исправление: Установите правильную дату.

    Автор HOWTO рекомендует использовать NTP для синхронизации часов. Поскольку существуют экспортные ограничения на NTP в US, то вы можете получить NTP для debian, redhat или slackware с ftp://ftp.hacktic.nl/pub/replay/pub/linux или с сервера-зеркала.

  5. Сервер не допускает монтирования от пользователя, который находится больше чем в 8 группах.

    Исправление: уменьшите количество групп в которые входит пользователь или смонтируйте под именем другого пользователя.

8. Часто Задаваемые Вопросы (FAQ)

Это раздел часто задаваемых вопросов (FAQ). Большая часть его написана Alan Cox.

  1. Я получаю сообщения об ошибках 'stale nfs handle (устарелый дескриптор nfs)' при использовании Linux как сервера nfs.

    Это вызывается ошибкой в одной из устаревших версий nfsd. Это исправлено в nfs-server2.2beta16 и более поздних.

  2. Когда я пытаюсь примонтировать файловую систему я получаю сообщение
     can't register with portmap: system error on send
    
     (не могу зарегистрироваться с помощью portmap: системная ошибка при посылке)
    
    

    Вы вероятно используете систему Caldera. Это ошибка в скриптах rc. Пожалуйста свяжитесь с Caldera для получения исправления.

  3. Почему я не могу выполнить файл после копирования его на NFS сервер?

    Причина в том, что nfsd кэширует дескрипторы открытых файлов для улучшения производительности (помните, что он запущен в пространстве пользователей). Пока nfsd держит файл открытым (как в этом случае, после записи в него) ядро не позволит вам выполнять его. Nfsds новее чем примерно выпуска весны 95 держат файлы открытыми в течении нескольких секунд, более старые могут держать файл открытым в течении нескольких дней.

  4. Мои файлы на NFS все считаются с правом только на чтение

    По умолчанию сервер NFS для Linux выдается все как только для чтения. Перечитайте справочные страницы по ``exports'' и nfsd. Вам необходимо изменить файл /etc/exports.

  5. Я монтирую файловую систему с сервера nfs под linux и пока работает команда ls я не могу читать или записывать файлы.

    На старых версиях Linux вы должны монтировать сервер NFS с опциями rsize=1024,wsize=1024.

  6. Я монтирую файловую систему с сервера NFS под Linux с размером блока между 3500-4000 и это регулярно роняет машину с Linux

    Обычно не делайте так.

  7. Может Linux делать NFS по TCP

    Нет

  8. Я получаю странные ошибки при монтировании машины с машины под Linux.

    Убедитесь6 что ваш пользователь находится в 8 или меньшем количестве групп. Старые сервера требую этого.

  9. Когда я перезагружаю свою машину она иногда вешается при попытке отмонтироваться от зависшего сервера NFS.

    Не отмонтируйтесь от серверов NFS при перезагрузке или выключении, просто проигнорируйте его, ничто не повредится, если вы не отмонтируетесь от него. Команда будет выглядеть следующим образом umount -avt nonfs.

  10. Клиент NFS для Linux работает очень медлено при записи на системы Sun и BSD.

    Обычно NFS записывает в синхронном режиме (вы можете запретить это, если вы считаете, что вы не рискуете потерять данные). Хуже всего то, что ядра произошедшие от BSD не могут работать с маленькими блоками. Так когда вы пишете 4K данных с машины под Linux в 1K пакетах, то BSD выполняет это следующим образом

            прочитать страницу размером 4K
    
            изменить 1K
    
            записать страницу размером 4K обратно на диск
    
            прочитать страницу размером 4K
    
            изменить 1K
    
            записать страницу размером 4K обратно на диск
    
            и т.д...
    
    

9. Экспортирование файловых систем

Способ экспортирования файловых систем с помощью NFS не является полностью совместимым между платформами. В этом случае отличаются Linux и Solaris 2. Этот раздел поверхностно перечисляет способы сделать это на большинстве систем. если ваша система не была перечислена, то посмотрите справочные страницы по вашей операционной системе. Ключевые слова следующие: nfsd, system administration tool (утилиты системного администрирования), rc scripts (скрипты ресурсов), boot scripts (скрипты загрузки), boot sequence (последовательность загрузки), /etc/exports, exportfs. Я буду использовать один пример для всего раздела: Как экспортировать /mn/eris/local для apollon с правами на чтение/запись.

9.1 IRIX, HP-UX, Digital-UNIX, Ultrix, SunOS 4 (Solaris 1), AIX

Эти операционные системы используют традиционный формат экспортирования Sun. В файле /etc/exports напишите:


/mn/eris/local -rw=apollon


Полная документация находится в справочной странице exports. После редактирования файла запустите exportfs -av для экспортирования файловых систем.

точный синтаксис команды exportfs различается. На некоторых операционных системах вы можете обнаружить, что введенные строки читаются как:


/mn/eris/local apollon


или даже ухудшаясь вот так:


/mn/eris/local rw=apollon


Я рекомендую быть формальным. Вы рискуете, что если следующая версия exportfs будет другая и тогда все внезапно перестанет работать.

9.2 Solaris 2

Sun полностью переизобрел колесо при разработке Solaris 2. Так что он полностью отличается от других операционных систем. ТО, что вам нужно сделать -- это отредактировать файл /etc/dfs/dfstab. В нем вы помещаете команды организации доступа (share) как описано в справочной странице share(1M). Примерно такие:


share -o rw=apollon -d "Eris Local" /mn/eris/local


После редактирования запустите программу shareall для экспортирования файловой системы.

10. PC-NFS

Вы не должны запускать PC-NFS. Вы должны запустить samba.

Извинение: Я ничего не знаю о PC-NFS. Если кто может написать что-нибудь о нем, то пожалуйста сделайте это и я включу материал здесь.

[ опубликовано 09/02/2003 ]

Nicolai Langfeldt, перевод: Alex Ott - NFS HOWTO, v0.7, 3 Ноября 1997 г.   Версия для печати