[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]

Руководство по управлению системой: Сети и средства связи


Защищенная NFS

Кроме обычной системы идентификации UNIX службы NIS, NIS+ и NFS поддерживают идентификацию пользователей и систем на уровне сообщений. В этой дополнительной системе идентификации применяется алгоритм шифрования DES и шифрование с общим ключом.

В этом разделе рассмотрены следующие темы:

Шифрование

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

Один из древнейших способов шифрования - Шифр Цезаря, изобретение которого приписывается Юлию Цезарю. Этот шифр основан на замене одних букв другими. Например, 'A' заменяют на 'C', 'B' заменяют на 'D', ..., 'Y' заменяют на 'A', а 'Z' - на 'B'. В этом случае зашифрованная фраза ATTACK AT DAWN (напасть на рассвете) будет выглядеть так: CVVCEM CV FCYP.

Если бы карфагеняне поняли этот принцип и взломали бы шифр Цезаря, то римским криптографам пришлось бы создавать принципиально новый шифр. Поскольку разработка шифра - процесс весьма трудоемкий, римляне могли бы использовать ключ шифрования, позволяющий извлечь максимальную пользу из уже созданного шифра. Например, вместо замены буквы соседней, римляне могли бы задать ключ K, где K - это число позиций смещения в алфавите. То есть, если K = 2, то 'A' переходит в 'C'. Если K = 4, то 'A' переходит в 'E', и так далее. Если при использовании этого принципа шифр будет раскрыт, римлянам потребуется всего лишь изменить ключ. Конечно, карфагеняне могли бы понять алгоритм шифрования и сделать полный перебор всех значений ключа от 1 до 26. Если бы у карфагенян были компьютеры, то решение подобной проблемы стало бы для них заурядной задачей по программированию.

Стандарт шифрования данных DES

Современные шифры создаются с учетом существования мощных компьютеров, которые злоумышленник может использовать для их расшифровки. В 1977 году правительство США приняло Стандарт шифрования данных. Этот стандарт широко используется в самых разных областях, включая и производство. DES представляет собой чрезвычайно сложный алгоритм преобразования 64-разрядных блоков открытого текста в 64-разрядные блоки зашифрованного текста с использованием 56-разрядного ключа. Благодаря сложности алгоритма и большого размера ключа, DES взломать практически невозможно. К примеру, если бы у нарушителя был компьютер, обрабатывающий алгоритм DES со скоростью одно значение ключа в миллисекунду, то для перебора всех возможных значений ему бы потребовалась более двух тысяч лет.

Шифрование с общим ключом

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

Эту проблему решили исследователи Диффи и Хелман, придумав способ безопасного открытого обмена ключами между отправителем и получателем. Для применения этого способа необходимо выполнение трех условий:

Ниже кратко описан весь процесс передачи секретного сообщения от отправителя к получателю.

  1. Отправитель узнает у получателя его общий ключ шифрования.
  2. Отправитель преобразует открытое сообщение в зашифрованный текст путем выполнения следующей операции:

    зашифрованный_текст = Шифрование( простой_текст, E )
    
  3. Отправитель передает зашифрованное сообщение получателю.
  4. Получатель принимает шифрованное сообщение и преобразует его в открытый текст путем вычисления результата следующего выражения:

    простой_текст = расшифровка( зашифрованный_текст, D )
    

Даже если злоумышленнику удастся перехватить сообщение, он не сможет расшифровать его, поскольку он не знает ключа расшифровки. (Более того - даже сам отправитель не может расшифровать текст сообщения.)

Идентификация

Важнейшая область применения средств шифрования - средства идентификации. Обычный способ идентификации (стандартная идентификация в системе UNIX) основан на применении паролей. Иначе говоря, при входе в систему операционная система запрашивает у пользователя пароль, известный только ей и самому пользователю. Если пароль указан пользователем верно, то система считает, что он действительно является именно тем пользователем, за которого себя выдает. Обратите внимание, что в данном случае пользовательский пароль хранится в системе в одном из файлов, хотя и в зашифрованном виде. Таким образом, этот пароль известен двум разным объектам.

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

  1. Сначала отправитель шифрует и отправляет "запрос на отправку", используя общий ключ получателя.
  2. Получатель сообщения "запрос на отправку" расшифровывает его своим личным ключом.
  3. Получатель шифрует сообщение-маркер общим ключом отправителя и отправляет его.
  4. Отправитель принимает маркер и расшифровывает его с помощью своего частного ключа. Теперь отправитель будет начинать каждое сообщение, передаваемое получателю, с маркера, подтверждая таким образом свою личность. Если злоумышленник попытается посылать сообщения от имени отправителя, то получатель не примет их, поскольку нарушитель не знает маркера.

Обратите внимание, что в отличие от метода проверки паролей, в данном случае получателю не нужно знать частный ключ отправителя для того, чтобы идентифицировать его. Дополнительная информация о системах идентификации приведена в разделе Understanding RPC Authentication книги AIX 5L Version 5.1 Communications Programming Concepts.

Шифрование в NFS

Алгоритм DES может применяться службами NFS, NIS и NIS+ для достижения различных целей. NFS использует DES при шифровании значения системного времени в сообщениях RPC (протокол Вызова удаленных процедур), которыми обмениваются серверы и клиенты NFS. Это зашифрованное время идентифицирует системы так же, как маркер идентифицирует отправителя в разделе Идентификация. (Дополнительная информация о NIS и NIS+ приведена в книге AIX 5L Version 5.1 Network Information Services (NIS and NIS+) Guide.)

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

Использование шифрования с общим ключом в защищенной NFS

Оба ключа пользователя, общий и личный, хранятся и индексируются по имени сети в таблице publickey.byname. Секретный ключ зашифрован по алгоритму DES с помощью пароля пользователя. Команда keylogin расшифровывает секретный ключ с помощью пользовательского пароля, и передает его защищенному локальному серверу ключей, который и использует этот ключ в последующих транзакциях RPC. Общие и секретные ключи не известны даже самим пользователям, так как команда yppasswd изменяет пользовательский пароль и создает общие и секретные ключи автоматически.

Демон keyserv - служба RPC, запущенная в каждой системе NIS и NIS+. Дополнительная информация о взаимодействии NIS+ и keyserv приведена в книге AIX 5L Version 5.1 Network Information Services (NIS and NIS+) Guide. В NIS демон keyserv выполняет следующие три процедуры с общим ключом:

Функция key_setsecret передает серверу ключей личный ключ пользователя (SKA); обычно эта функция вызывается командой keylogin. Программа-клиент дает подпрограмме key_encryptsession команду создать ключ зашифрованного диалога, который передается серверу во время первой транзакции RPC. Сервер ключей выясняет общий ключ сервера и, сопоставив его с секретным ключом клиента (заданным ранее выполненной подпрограммой key_setsecret), генерирует общий ключ. Сервер, вызывая подпрограмму key_decryptsession дает серверу ключей команду расшифровать ключ диалога.

В этих вызовах подпрограмм имя запрашивающего компьютера явным образом не указывается; оно должно быть каким-то образом идентифицировано. Сервер ключа не может использовать для этой цели идентификацию DES, поскольку это приведет к тупику шифрования. Это затруднение разрешается следующим образом: сервер ключей хранит секретные ключи вместе с ИД пользователя (UID) и предоставляет эту информацию только локальным процессам root. Процесс клиента запускает подпрограмму setuid (владельцем которой является пользователь root), которая от имени клиента дает запрос и сообщает серверу ключей истинный UID клиента.

Требования к идентификации

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

Согласование текущего времени

Если в сети применяется синхронизация времени, часы клиента и сервера синхронизирует демон timed. Иначе клиент вычисляет значения системного времени, основываясь на показаниях часов сервера. Для этого клиент определяет значение времени на сервере перед тем, как начать сеанс RPC, и вычисляет разницу между показаниями часов сервера и своих часов. Затем клиент соответствующим образом устанавливает свое системное время. Если во время сеанса RPC часы клиента и сервера разойдутся настолько, что сервер начнет отклонять запросы клиента, клиент повторит синхронизацию часов.

Использование одного ключа DES

Клиент и сервер вычисляют один и тот же ключ шифрования DES с помощью шифрования с общим ключом. Для каждой пары клиент A - сервер B существует ключ, который могут вычислить A и B. Этот ключ называется совместным ключом. Клиент вычисляет совместный ключ по следующей формуле:

KAB = PKBSKA

где K обозначает совместный ключ, PK - общий ключ, а SK - личный ключ, причем каждое из этих значений представляет собой 128-разрядное число. Сервер получает тот же самый совместный ключ по следующей формуле:

KAB = PKASKB

Вычислить совместный ключ могут только клиент и сервер, поскольку для этого необходимо знать один из личных ключей. Поскольку совместный ключ - это 128-разрядное число, а ключ DES - 56-разрядное, клиент и сервер используют из совместного ключа только 56 разрядов для формирования ключа DES.

Процесс идентификации

Когда клиент хочет обратиться к серверу, он случайным образом создает ключ для шифрования системного времени. Этот ключ называется ключом диалога (CK). Клиент шифрует ключ диалога общим ключом DES (описанным в Требованиях идентификации) и отправляет его серверу в первой транзакции RPC. Этот процесс показан на следующем рисунке.

Рис. 10-1. Процесс идентификации. Процесс идентификации, описанный в тексте.

Рисунок comma9

На этом рисунке показан клиент A, устанавливающий соединение с сервером B. Символ K(CK) означает, что CK зашифрован общим ключом DES K. Во время первого запроса одноразовое разрешение RPC клиента содержит его имя (A), ключ диалога (CK) и переменную с именем win (окно), зашифрованную ключом диалога (CK). (Размер окна по умолчанию - 30 минут.) Идентификатор клиента в первом запросе содержит зашифрованное значение системного времени и зашифрованный идентификатор заданной переменной window win + 1. Благодаря переменной window угадать данные идентификации клиента становится намного труднее, что повышает степень защищенности.

После того как сервер идентифицировал клиента, он сохраняет в таблице идентификации следующие данные:

Сервер принимает только те значения системного времени, которые больше всех предыдущих, поэтому на повторные транзакции сервер всегда будет давать отказ. Сервер возвращает клиенту, указанному в идентификаторе, ИД индекса таблицы идентификации и значение системного времени клиента минус единица, зашифрованное с помощью CK. Таким образом, клиент знает, что этот идентификатор мог быть передан только данным сервером, поскольку только ему известно значение системного времени клиента. Смысл вычитания единицы из значения системного времени заключается в том, чтобы это значение стало непригодным для повторного использования в качестве идентификатора клиента. После первой транзакции RPC клиент отправляет только свой ИД и зашифрованное с помощью CK значение системного времени, уменьшенное на единицу.

Присвоение имен сетевым объектам для идентификации по алгоритму DES

При идентификации DES алгоритм использует сетевые имена. В последующих разделах описывается процесс идентификации по алгоритму DES в NIS. Дополнительная информация о применении в NIS+ идентификации DES приведена в книге AIX 5L Version 5.1 Network Information Services (NIS and NIS+) Guide.

Сетевое имя - это последовательность символов, которая служит идентификатором. Общие и секретные ключи связываются с сетевыми именами, а не с именами пользователей. Структура NIS netid.byname связывает сетевое имя с локальным UID и списком доступа сетевой группы.

Имена пользователей внутри каждого домена должны быть уникальны. Присвоение сетевых имен - это связывание данной операционной системы и ИД пользователя с NIS и именем домена Internet. При этом к имени локального домена обычно добавляют имя домена Internet (com, edu, gov, mil).

Сетевые имена присваивают как компьютерам, так и пользователям. Сетевое имя компьютера формируется примерно так же, как и сетевое имя пользователя. Например, сетевое имя компьютера hal в домене eng.ibm.com будет таким: unix.hal@eng.ibm.com. Правильная идентификация компьютеров очень важна для работы бездисковых клиентов, которым необходимо предоставлять полный доступ по сети к домашним каталогам.

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

Файл /etc/publickey

Файл /etc/publickey содержит имена и общие ключи, применяемые NIS и NIS+ для создания таблицы общих ключей publickey. Файл publickey используется для обеспечения защиты сети. Каждая запись в этом файле содержит сетевое имя пользователя (это может быть и имя пользователя, и имя хоста), общий ключ пользователя (в шестнадцатеричной нотации) и, после двоеточия, - зашифрованный секретный ключ пользователя (также в шестнадцатеричной нотации). По умолчанию в файле /etc/publickey имеется всего одна запись - для пользователя nobody.

Поскольку в файле /etc/publickey содержатся ключи шифрования, его не рекомендуется изменять с помощью текстового редактора. Для изменения файла /etc/publickey предназначены команды chkey и newkey.

Рекомендации по загрузке систем с общим ключом

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

Вызов некоторых функций setuid может привести к ошибке. Например, если подпрограмму setuid вызывает ее владелец A, еще не вошедший в систему после ее загрузки, функция не сможет получить доступ к защищенным сетевым службам под управлением пользователя A. Однако, большая часть вызовов setuid выполняется пользователем root, личный ключ которого считывается при загрузке системы.

Повышение производительности

Влияние функции защиты NFS на производительность системы двояко.

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

Справочная таблица по управлению защищенной NFS

Ниже приведена справочная таблица, которая поможет проверить правильность настройки и работы системы NFS:

Настройка защищенной NFS

Для настройки защищенного NFS на главном и подчиненном сервере NIS воспользуйтесь Web-администратором системы или выполните следующую процедуру. Дополнительная информация о взаимодействии NFS и NIS+ приведена в книге AIX 5L Version 5.1 Network Information Services (NIS and NIS+) Guide.

  1. В системе главного сервера NIS создайте запись для каждого пользователя в файле /etc/publickey NIS командой newkey. У этой команды есть две опции.
  2. Создайте таблицу общих ключей NIS с именем publickey по инструкциям из книги AIX 5L Version 5.1 Network Information Services (NIS and NIS+) Guide. Соответствующая таблица NIS publickey.byname должно находиться только на серверах NIS.

  3. Удалите в файле /etc/rc.nfs символы комментария перед следующими строками:

    #if [ -x /usr/sbin/keyserv ]; then
    #  startsrc -s keyserv
    #fi
    #if [ -x /usr/lib/netsvc/yp/rpc.ypupdated -a -d /etc/yp/`домен` ]; then
    #  startsrc -s ypupdated
    #fi
    #DIR=/etc/passwd
    #if [ -x /usr/lib/netsvc/yp/rpc.yppasswdd -a -f $DIR/passwd ]; then
    #  startsrc -s yppasswdd
    #fi
    
  4. Запустите демоны keyserv, ypupdated и yppasswdd командой startsrc.

Для настройки защищенной NFS в системах клиентов NIS запустите демон keyserv командой startsrc.

Экспорт файловой системы с помощью защищенной NFS

Экспортировать защищенную файловую систему NFS можно либо с помощью приложения Сеть Web-администратора системы, либо одним из следующих способов:

Монтирование файловой системы с помощью защищенной NFS

Для того чтобы смонтировать защищенную файловую систему NFS явным образом выполните следующие действия:

  1. Убедитесь, что данный каталог экспортирован сервером NFS. Для этого введите следующую команду:

    showmount -e имя-сервера
    

    где имя-сервера - имя сервера NFS. Эта команда показывает список всех каталогов, экспортированных с сервера NFS. Если каталог, который вы хотите смонтировать, отсутствует в этом списке, экспортируйте его с сервера.

  2. Создайте локальную точку монтирования командой mkdir. Для того чтобы NFS могла успешно выполнить монтирование, каталог-точка монтирования NFS уже должен быть создан. Необходимо, чтобы каталог был пустым. Этот каталог (точку монтирования) можно создать точно так же, как и любой обычный каталог, для него не требуется никаких специальных атрибутов.
  3. Убедитесь, что файл publickey существует и программа keyserv запущена. Дополнительная информация об этом приведена в разделе Настройка защиты NFS.
  4. Введите следующую команду:

    mount -o secure имя-сервера:/удаленный/каталог /локальный/каталог
    

    где имя-сервера - имя сервера NFS, /удаленный/каталог - монтируемый каталог сервера NFS, а /локальный/каталог - точка монтирования в системе клиента.

    Примечание: Монтировать защищенную файловую систему NFS имеет право только пользователь root.

Дополнительная информация о монтировании NFS приведена в разделе Создание предопределенных монтирований NFS.


[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]