СЕРГЕЙ СУПРУНОВ
FreeBSD tips: повышаем безопасность с помощью одноразовых паролей
Одним из «узких мест» в плане защиты информации является использование системного пароля для удаленного входа на сервер, который может быть подобран, перехвачен или вскрыт иным способом. Решим эту проблему с помощью одноразовых паролей.
Иногда возникает ситуация, когда нужно войти на сервер с чужого компьютера. Например, выехав к клиенту, вы выясняете, что он начисто забыл свой пароль. Не возвращаться же из-за этого в офис? А заходить на сервер с машины клиента достаточно опасно – кто знает, какие «шпионы» там установлены? Конечно, решить эту проблему можно несколькими способами. Например, используя ssh с аутентификацией ключевым файлом, который записан на дискету (к слову, дискету можно на радостях и в дисководе забыть, что отнюдь не поспособствует безопасности сервера). Или хорошим решением выглядит LiveCD – в этом случае вы гарантируете себе не только повышение безопасности, но и наличие всех необходимых программ.
Система FreeBSD предоставляет еще один удобный инструмент – одноразовые пароли. Начиная с FreeBSD 5-й версии, они реализуются системой OPIE (One-time Passwords In Everything), основанной на S/Key. Замечу, что OPIE существует и в большинстве дистрибутивов Linux, так что все описанное вы можете применить в этих системах. Однако для конкретизации изложения я буду описывать именно реализацию OPIE на FreeBSD 5.3.
В чем заключается идея
В общих чертах это выглядит следующим образом: при попытке войти на сервер после ввода имени пользователя вы получаете строку-оклик, содержащую номер итерации и некоторую последовательность символов – так называемое «зерно» (seed):
login as: serg
otp-md5 496 ko5622 ext
Password:
|
Далее вам нужно ввести парольную фразу (отзыв), соответствующую указанному номеру и «зерну». Для генерации паролей используется утилита opiekey (поэтому одноразовые пароли на жаргоне иногда называют «опиками»). Ей нужно передать текущий номер последовательности и «зерно», затем будет запрошена секретная фраза (она задается во время активации учетной записи пользователя) и выведен список шести коротких слов, которые и являются одноразовым паролем-отзывом.
В отличие от системного пароля одноразовый нечувствителен к регистру символов, так что вводить его можно и маленькими буквами.
Если в ответ на первое приглашение «Password:» просто нажать , то появится еще одно, с включенным эхо-отображением вводимых символов, что позволит вам видеть вводимый текст на экране.
При следующем входе номер последовательности уменьшится, и вводить нужно будет уже другой отзыв. Таким образом, вам не нужно заботиться о сохранности одноразового пароля после того, как он будет использован, – вы можете смело разложить листок с паролем на столе в присутствии пользователя, включить эхо-повтор вводимых символов и, ни от кого не прячась, спокойно набирать парольную фразу. Поскольку после нажатия данный пароль теряет свою актуальность, его знание уже никому ничего не дает.
Собственно, основная идея использования одноразовых паролей как раз и заключается в том, что никакая секретная информация (в данном случае таковой является секретная фраза, на основе которой осуществляется генерация паролей) по сети не передается.
Приступаем к реализации
Во FreeBSD уже все готово для использования одноразовых паролей. Достаточно создать для пользователей, которые будут работать по данной схеме, соответствующие записи в файле /etc/opiekeys.
Новая запись создается следующей командой:
root# opiepasswd -c test
Adding test:
Only use this method from the console; NEVER from remote.
If you are using telnet, xterm, or a dial-in, type ^C now or exit
with no password.
Then run opiepasswd without the -c parameter.
Using MD5 to compute responses.
Enter new secret pass phrase:
Again new secret pass phrase:
ID test OTP key is 499 ko6010
RACE DAYS CHEF ARE CAW LEAF
|
Ключ -c дает команду создать запись для пользователя, в данном случае это пользователь test. Если имя пользователя не указано, создается (или изменяется) запись для текущего пользователя. Обычный пользователь может управлять своей записью, root – записями всех пользователей.
Перед началом работы выводится предупреждение, что утилиту opiepasswd следует запускать только в защищенном режиме (с физической консоли или через ssh), чтобы исключить возможность перехвата секретной фразы. Знание данной фразы позволит любому человеку сгенерировать одноразовый пароль для входа под вашим именем.
После всех предупреждений запрашивается секретная фраза. Она понадобится вам в дальнейшем для генерации паролей и управления своей записью. Утилита требует, чтобы длина этой фразы была от 10 до 127 символов, иначе вы получите сообщение об ошибке:
Secret pass phrases must be between 10 and 127 characters long. |
В конце работы утилита выдает текущие номер последовательности (по умолчанию – 499) и слово-«зерно», в данном примере – ko6010. Запоминать эти значения не нужно – они будут выводиться на экран при каждой попытке войти в систему. Последней строкой выводится парольная фраза, которая к данному моменту уже бесполезна и служит только для проверки, – следующий номер последовательности устанавливается в 498.
Обратите внимание, что как только счетчик достигнет 0, вход в систему станет невозможным. Поэтому необходимо заблаговременно осуществлять повторную инициализацию записи в /etc/opiekeys, для чего используется opiepasswd без ключей. Также с помощью ключа -n вы можете задать начальное значение счетчика. Замечу, что переинициализация выполняется без запроса секретной фразы (она остается прежней). Используются только одноразовые пароли, так что повторная инициализация может быть выполнена и удаленно, с использованием небезопасного соединения.
Также утилита opiepasswd используется для дезактивации записи того или иного пользователя. Для этого используется ключ -d. Дезактивация не удаляет запись пользователя из файла opiekeys, а просто «забивает» секретную фразу звездочками. Теперь при входе пользователя в систему по-прежнему будет выдаваться строка-«оклик», но получить для нее правильную парольную фразу будет уже невозможно.
Чтобы полностью отменить запрос на ввод одноразового пароля и вернуться к прежней аутентификации системным паролем, достаточно удалить для соответствующего пользователя строку в файле /etc/opiekeys.
Следующая утилита, которая может быть полезна, – opieinfo. Она возвращает текущие значения номера последовательности и «зерна» для пользователя. Например, ее можно использовать, перед тем как генерировать пароли.
Утилита opiekey имеет несколько полезных ключей. Например, с помощью ключа -n можно указать, сколько паролей должно быть сгенерировано начиная с текущего номера итерации:
serg$ opieinfo
498 ko5623
serg$ opiekey -n 5 498 ko5623
Using the MD5 algorithm to compute response.
Reminder: Don"t use opiekey from telnet or dial-in sessions.
Enter secret pass phrase:
494: LOOK RUSH WIFE BREW ROBE LAM
495: TERN MOCK MA LED PA MELD
496: NIL FALL AKIN FUSE MIND SLUR
497: GINA MOP AKIN SHAW CALF COMA
498: FLY GONE GAB MYRA WONT SANK
|
Теперь эти пароли можно аккуратно сохранить в надежное место и ехать с ними в командировку или к клиенту – средство для пяти безопасных входов в систему у вас есть.
Естественно, генерировать пароли можно и по мере необходимости, например, на своем домашнем компьютере или ноутбуке с помощью соответствующей утилиты. Но к такому инструменту предъявляются серьезные требования безопасности, поскольку во время генерации вы должны быть уверены, что никто не узнает вашу секретную фразу.
Вы можете настроить вход в систему как исключительно по одноразовым паролям, так и разрешив использование постоянных паролей, предоставив пользователю право выбирать в зависимости от ситуации, как входить в систему. Например, вам может быть удобнее вводить системный пароль при работе из офиса, а «опики» использовать при необходимости зайти на сервер с «чужой» территории.
Для определения возможных способов доступа используется файл /etc/opieaccess. По умолчанию, как только для пользователя появляется запись в /etc/opiekeys, он уже не может пользоваться системным паролем.
Чтобы разрешить вход по обоим паролям, нужно в opieaccess создать запись типа permit для нужных адресов. Например, чтобы разрешить вход под системным паролем из локальной сети, а для внешних соединений оставить только «опики», можно использовать следующую строку:
permit 192.168.0.0 255.255.255.0
# permit 0.0.0.0 0.0.0.0
Закомментированная строка разрешит использование обоих типов паролей с любого адреса. Правило deny позволяет явно запретить использование системного пароля для указанной подсети.
Обратите внимание, что разрешение вводить системные пароли делает возможным использование уже скомпрометированного пароля, сводя на нет преимущества системы OPIE. Единственное, что при этом достигается,– это существенное снижение вероятности раскрыть свой пароль при работе в незащищенном режиме. Поэтому к вопросу раздачи прав следует относиться очень внимательно.
Более тонко процедуру входа в систему можно определить в настройках PAM (см. /etc/pam.d/system и прочие файлы). Нужно заметить, что не все приложения могут работать с одноразовыми паролями. Например, во FreeBSD утилиты login, su, ssh, telnetd поддерживают аутентификацию OPIE, popper – нет (но если вход с системным паролем разрешен, проблем с использованием этой программы не возникает). По умолчанию, если поддержка OPIE каким-то сервисом имеется, в соответствующем файле каталога /etc/pam.d будет присутствовать pam_opie.so.
Попытка аутентификации на FTP-сервере (FreeBSD 5.3, стандартный ftpd) с одноразовым паролем выявила интересную проблему – с помощью клиента ftp вход по «опику» выполнялся нормально, а вот попытка войти под системным паролем (например, с использованием менеджера FAR) завершалась неудачей, хотя настройки позволяли использование системного пароля. Разбор полета показал, что проблема заключается в разрешении имен. Происходило следующее – в процессе установки соединения IP-адрес клиента преобразовывался в доменное имя типа client.domain.provider.ru, которое обрезалось до client.domain, после чего система пыталась определить IP-адрес этого «хоста», чтобы установить права на вход с системным паролем в соответствии с /etc/opieaccess. Это, естественно, не получалось, и возвращалась ошибка «Неизвестный хост client.domain». Если же вход на сервер FTP выполнялся с машины, адрес которой не присутствует в базе DNS, то все работало отлично. Вылечить это удалось добавлением следующей строчки в /etc/resolv.conf:
options ndots:3
Эта строка заставляет функции разрешения имен (см. man resolver) возвращать в качестве доменного имени часть имени хоста до третьей точки, то есть целиком. По умолчанию параметр ndots равен 1, что и приводило к описанной выше ситуации. Во FreeBSD 5.4 данная проблема уже не наблюдается.
В заключение замечу, что на моей системе права доступа к файлу /etc/opiekeys по умолчанию были установлены в rw-r--r--, что позволяло читать его абсолютно всем. Поскольку данный файл хранит, хоть и в зашифрованном виде, ключевую фразу, которая используется при генерации одноразовых паролей, то такой либеральный доступ к нему выглядит не самой лучшей идеей. Возможно, это необходимо для работы некоторых утилит, но в моем случае после установки прав в rw------- никаких проблем пока не обнаружилось.
И, несмотря на банальность того, что я сейчас скажу, считаю своим долгом предупредить – любые действия, связанные с изменением порядка входа в систему, должны выполняться осознанно и с предельной осторожностью. В случае с OPIE нужно очень постараться, чтобы полностью заблокировать себе доступ в систему. Но тем не менее всегда полезно иметь запасной вариант, например, создать для использования одноразовых паролей другую учетную запись и, лишь убедившись в ее работоспособности, переводить на новую схему остальных пользователей.