Кроме обычной системы идентификации 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. Если бы у карфагенян были компьютеры, то решение подобной проблемы стало бы для них заурядной задачей по программированию.
Современные шифры создаются с учетом существования мощных компьютеров, которые злоумышленник может использовать для их расшифровки. В 1977 году правительство США приняло Стандарт шифрования данных. Этот стандарт широко используется в самых разных областях, включая и производство. DES представляет собой чрезвычайно сложный алгоритм преобразования 64-разрядных блоков открытого текста в 64-разрядные блоки зашифрованного текста с использованием 56-разрядного ключа. Благодаря сложности алгоритма и большого размера ключа, DES взломать практически невозможно. К примеру, если бы у нарушителя был компьютер, обрабатывающий алгоритм DES со скоростью одно значение ключа в миллисекунду, то для перебора всех возможных значений ему бы потребовалась более двух тысяч лет.
Самое слабое место в любом алгоритме шифрования - это ключ. Для обмена шифрованными сообщениями, естественно, необходимо, чтобы ключ был известен и отправителю и получателю. Они должны договориться о том, каким будет значение ключа, либо через независимый канал связи (который, в свою очередь, должен быть защищенным), либо лично.
Эту проблему решили исследователи Диффи и Хелман, придумав способ безопасного открытого обмена ключами между отправителем и получателем. Для применения этого способа необходимо выполнение трех условий:
где E - это ключ шифрования (он общеизвестен), а D - ключ расшифровки (известный только получателю).
Таким образом, функции шифровки и расшифровки должны быть взаимно обратными. Поэтому если взять зашифрованный текст после операции Шифровка( текст, E) и выполнить с помощью ключа D операцию Расшифровка, то в результате мы получим исходный открытый текст.
Ниже кратко описан весь процесс передачи секретного сообщения от отправителя к получателю.
зашифрованный_текст = Шифрование( простой_текст, E )
простой_текст = расшифровка( зашифрованный_текст, D )
Даже если злоумышленнику удастся перехватить сообщение, он не сможет расшифровать его, поскольку он не знает ключа расшифровки. (Более того - даже сам отправитель не может расшифровать текст сообщения.)
Важнейшая область применения средств шифрования - средства идентификации. Обычный способ идентификации (стандартная идентификация в системе UNIX) основан на применении паролей. Иначе говоря, при входе в систему операционная система запрашивает у пользователя пароль, известный только ей и самому пользователю. Если пароль указан пользователем верно, то система считает, что он действительно является именно тем пользователем, за которого себя выдает. Обратите внимание, что в данном случае пользовательский пароль хранится в системе в одном из файлов, хотя и в зашифрованном виде. Таким образом, этот пароль известен двум разным объектам.
Альтернативой идентификации с помощью паролей является использование метода шифрования с общим ключом. Предположим, что отправитель хочет передать сообщение получателю, причем получатель должен быть уверен в том, что оно действительно пришло от отправителя, а не от какого-нибудь мошенника. При этом процесс идентификации будет проходить следующим образом:
Обратите внимание, что в отличие от метода проверки паролей, в данном случае получателю не нужно знать частный ключ отправителя для того, чтобы идентифицировать его. Дополнительная информация о системах идентификации приведена в разделе Understanding RPC Authentication книги AIX 5L Version 5.1 Communications Programming Concepts.
Алгоритм 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.
Оба ключа пользователя, общий и личный, хранятся и индексируются по имени сети в таблице 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 с помощью шифрования с общим ключом. Для каждой пары клиент A - сервер B существует ключ, который могут вычислить A и B. Этот ключ называется совместным ключом. Клиент вычисляет совместный ключ по следующей формуле:
KAB = PKBSKA
где K обозначает совместный ключ, PK - общий ключ, а SK - личный ключ, причем каждое из этих значений представляет собой 128-разрядное число. Сервер получает тот же самый совместный ключ по следующей формуле:
KAB = PKASKB
Вычислить совместный ключ могут только клиент и сервер, поскольку для этого необходимо знать один из личных ключей. Поскольку совместный ключ - это 128-разрядное число, а ключ DES - 56-разрядное, клиент и сервер используют из совместного ключа только 56 разрядов для формирования ключа DES.
Когда клиент хочет обратиться к серверу, он случайным образом создает ключ для шифрования системного времени. Этот ключ называется ключом диалога (CK). Клиент шифрует ключ диалога общим ключом DES (описанным в Требованиях идентификации) и отправляет его серверу в первой транзакции RPC. Этот процесс показан на следующем рисунке.
Рис. 10-1. Процесс идентификации. Процесс идентификации, описанный в тексте.
На этом рисунке показан клиент A, устанавливающий соединение с сервером B. Символ K(CK) означает, что CK зашифрован общим ключом DES K. Во время первого запроса одноразовое разрешение RPC клиента содержит его имя (A), ключ диалога (CK) и переменную с именем win (окно), зашифрованную ключом диалога (CK). (Размер окна по умолчанию - 30 минут.) Идентификатор клиента в первом запросе содержит зашифрованное значение системного времени и зашифрованный идентификатор заданной переменной window win + 1. Благодаря переменной window угадать данные идентификации клиента становится намного труднее, что повышает степень защищенности.
После того как сервер идентифицировал клиента, он сохраняет в таблице идентификации следующие данные:
Сервер принимает только те значения системного времени, которые больше всех предыдущих, поэтому на повторные транзакции сервер всегда будет давать отказ. Сервер возвращает клиенту, указанному в идентификаторе, ИД индекса таблицы идентификации и значение системного времени клиента минус единица, зашифрованное с помощью CK. Таким образом, клиент знает, что этот идентификатор мог быть передан только данным сервером, поскольку только ему известно значение системного времени клиента. Смысл вычитания единицы из значения системного времени заключается в том, чтобы это значение стало непригодным для повторного использования в качестве идентификатора клиента. После первой транзакции RPC клиент отправляет только свой ИД и зашифрованное с помощью CK значение системного времени, уменьшенное на единицу.
При идентификации 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 содержит имена и общие ключи, применяемые NIS и NIS+ для создания таблицы общих ключей publickey. Файл publickey используется для обеспечения защиты сети. Каждая запись в этом файле содержит сетевое имя пользователя (это может быть и имя пользователя, и имя хоста), общий ключ пользователя (в шестнадцатеричной нотации) и, после двоеточия, - зашифрованный секретный ключ пользователя (также в шестнадцатеричной нотации). По умолчанию в файле /etc/publickey имеется всего одна запись - для пользователя nobody.
Поскольку в файле /etc/publickey содержатся ключи шифрования, его не рекомендуется изменять с помощью текстового редактора. Для изменения файла /etc/publickey предназначены команды chkey и newkey.
В случае сбоя из-за отключения электропитания все сохраненные секретные ключи теряются, и при перезагрузке компьютера ни один процесс не сможет получить доступ к защищенным сетевым службам (например, к службе монтирования NFS). Процессы с правами доступа root могут быть запущены только в том случае, если ввести пароль для расшифровки секретного ключа пользователя root. На этот случай рекомендуется хранить в файле незашифрованный секретный ключ пользователя root, чтобы сервер мог прочитать его.
Вызов некоторых функций setuid может привести к ошибке. Например, если подпрограмму setuid вызывает ее владелец A, еще не вошедший в систему после ее загрузки, функция не сможет получить доступ к защищенным сетевым службам под управлением пользователя A. Однако, большая часть вызовов setuid выполняется пользователем root, личный ключ которого считывается при загрузке системы.
Влияние функции защиты NFS на производительность системы двояко.
Во-первых, и клиенту, и серверу необходимо вычислять значение совместного ключа. На это затрачивается примерно одна секунда. Таким образом, на установление начального соединения RPC требуется около двух секунд, поскольку данную операцию должен выполнить и клиент, и сервер. После установления начального соединения RPC сервер ключей кэширует полученный результат, чтобы не приходилось каждый раз заново вычислять совместный ключ.
Во-вторых, каждая транзакция RPC требует выполнения четырех операций шифрования по методу DES:
Поскольку работа NFS в защищенном режиме снижает производительность, вам следует взвесить все преимущества применения защиты с учетом требований к производительности.
Ниже приведена справочная таблица, которая поможет проверить правильность настройки и работы системы NFS:
Для настройки защищенного NFS на главном и подчиненном сервере NIS воспользуйтесь Web-администратором системы или выполните следующую процедуру. Дополнительная информация о взаимодействии NFS и NIS+ приведена в книге AIX 5L Version 5.1 Network Information Services (NIS and NIS+) Guide.
#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
Для настройки защищенной NFS в системах клиентов NIS запустите демон keyserv командой startsrc.
Экспортировать защищенную файловую систему NFS можно либо с помощью приложения Сеть Web-администратора системы, либо одним из следующих способов:
/usr/sbin/exportfs -a
Опция -a команды exportfs означает, что необходимо передать в ядро всю информацию из файла /etc/exports. Если NFS не запущена, запустите ее следуя инструкциям из раздела Запустить демоны NFS.
Введите следующую команду:
exportfs -i -o secure /имя-каталога
где имя-каталога - имя экспортируемой файловой системы. Команда exportfs -i означает, что имя каталога будет задаваться не данными файла /etc/exports, а напрямую параметрами командной строки. Все остальные опции также будет определять командная строка.
Для того чтобы смонтировать защищенную файловую систему NFS явным образом выполните следующие действия:
showmount -e имя-сервера
где имя-сервера - имя сервера NFS. Эта команда показывает список всех каталогов, экспортированных с сервера NFS. Если каталог, который вы хотите смонтировать, отсутствует в этом списке, экспортируйте его с сервера.
mount -o secure имя-сервера:/удаленный/каталог /локальный/каталог
где имя-сервера - имя сервера NFS, /удаленный/каталог - монтируемый каталог сервера NFS, а /локальный/каталог - точка монтирования в системе клиента.
Примечание: Монтировать защищенную файловую систему NFS имеет право только пользователь root.
Дополнительная информация о монтировании NFS приведена в разделе Создание предопределенных монтирований NFS.