Организация SSH-доступа по одноразовым паролям

В любой серьезной компании иногда возникает необходимость в том, чтобы сотрудник, уехавший в отпуск, срочно выполнил свои должностные обязанности. Рассмотрим ситуацию, когда компании необходим конкретный сотрудник, например, системный администратор, который в данный момент возлежит на пляже в тысяче километров от душного офиса. Допустим даже, что этот сотрудник согласен выполнить неожиданно свалившуюся ему на голову работу и на курорте есть интернет-кафе. Но вот проблема: кафе располагается в темном переулке, на его компьютерах стоят популярная ОС, трояны, кейлоггеры и прочие хактулзы, так что набирать пароль root’а от главного сервера компании на подобных машинах довольно неразумно.

Существует несколько решений этой задачи. Например, можно использовать одноразовые пароли, а именно систему s/key, использующую для генерации паролей алгоритмы md4 и md5. Об этой системе и будет рассказано далее.

S/key работает по принципу клиент-сервер следующим образом: пользователь задает секретный ключ, который затем хешируется несколько сотен раз (напр, 500). На компьютере пользователя (сервере) запоминается последний (500ый) хеш секретной фразы. Для
авторизации пользователю нужно будет ввести предыдущий (499ый) хеш секретного ключа, который будет сгенерирован клиентским приложением. Сервер хеширует введенную пользователем комбинацию и, в случае совпадения с ранее запомненными данными, авторизует пользователя и запоминает только что введенный (499ый) хеш, чтобы в следующий раз спросить предыдущий (498ой) к текущему хеш.

Подробнее о s/key можно почитать на Википедии и в RFC 1760.

Переходим к практике. Мы будем использовать PAM (набор API для аутентификации пользователей) и OPIE (PAM-модуль для работы с одноразовыми паролями). Предполагается, что SSH уже установлен.

Установим OPIE:
$ apt-get install opie-client opie-server

Затем необходимо отредактировать конфигурационный файлы:

В файле /etc/pam.d/sshd нужно закомментировать строку “@include common-auth“:
#@include common-auth
и добавить после нее следующее:
auth sufficient pam_unix.so
auth sufficient pam_opie.so
auth required pam_deny.so

Первая строка оставляет возможность авторизации по паролю от аккаунта. Если это не требуется, то ее можно убрать.

Подробнее о настройке PAM можно почитать тут и тут.

Далее отредактируем /etc/ssh/sshd_config — в строке “ChallengeResponseAuthentication nono нужно поменять на yes.

Теперь перезапускаем SSH:
$ service ssh restart

Данные OPIE хранятся в файле /etc/opiekeys, который имеет следующий формат:

Поле Описание
name Логин пользователя.
sequence Порядковый номер хеша.
seed Семя — несекретная случайная последовательность.
key Последний использованный хеш.
date Дата последнего изменени.
time Время последнего изменени.

Изначально этот файл пуст. Для задания начальных данных (генерации того самого 500ого хеша) нужно запустить команду opiepasswd:
$ opiepasswd
Adding username:
You need the response from an OTP generator.
New secret pass phrase:
otp-md5 499 no8327
Response:

Чтобы получить запрашиваемый ответ (Response), открываем вторую консоль и запускаем команду otp-md5 499 no8327:
$ otp-md5 499 no8327
Using the MD5 algorithm to compute response.
Reminder: Don't use opiekey from telnet or dial-in sessions.
Enter secret pass phrase:

Придумываем и вводим пароль. В ответ видим нечто, похожее на WATS NIP DUD BRAD LIME DRUM.

Приятный момент: иногда одноразовые пароли состоят из коротких английских слов, которые довольно легко запомнить. Возвращаемся на предыдущую консоль к приложению opiepasswd и вводим выданную нам последовательность (WATS NIP DUD BRAD LIME DRUM). Большими буквами и с пробелами. Согласно мнению специалистов, вводить можно и маленькими буквами, но автор этого не проверял.

$ opiepasswd
Adding username:
You need the response from an OTP generator.
New secret pass phrase: *********
otp-md5 499 no8327
Response: WATS NIP DUD BRAD LIME DRUM

ID username OTP key is 499 no8327
WATS NIP DUD BRAD LIME DRUM
$

Если теперь открыть файл /etc/opiekeys, то можно увидеть строку, похожую на
username 0499 no8327 f825803faf1afaee Jul 10,2010 20:12:12

Уезжая в отпуск, можно взять с собой список заранее сгенерированных одноразовых паролей. Получить этот список можно, запустив opiekey -n 100 499 no8327. Нас спросят секретную фразу, а в ответ мы получим список из 100 (количество задается ключом -n 100) одноразовых паролей вида


480: SLUR ROVE TONE ADAM MUST IRK
481: FULL NAY LYLE BROW MARY COD
482: WERE LOB DOME LIT GIN CHAD

Лист с паролями можно спрятать поглубже в чемодан или скопировать на телефон в виде простого текстового файла. В конце этой статьи будет рассмотрен более удобный и безопасный способ получения/хранения одноразовых паролей.

Вернемся к нашему SSH-доступу:

$ ssh username@host
Password:

Для авторизации с помощью одноразового пароля на запрос пароля от учетной записи нужно ввести пароль «opiepasswd», после чего с нас спросят одноразовый пароль:

$ ssh username@host
Password: opiepasswd
otp-md5 498 no8327 ext, Response:

В качестве ответа вводим последовательность, которую можно получить, запустив
$ otp-md5 498 no8327
или
$ opiekey 498 no8327

На самом деле сгенерировать ответ можно на любом компьютере, используя любой s/key-генератор вместо otp-md5 или opiekey.

Если все сделано правильно, то мы получим ssh-доступ.

Вернемся к нашей легенде про отпуск. Мало в каком интернет-кафе можно найти ssh-клиент. В качестве решения этой проблемы можно использовать ssh-клиент в виде java апплета. К сожалению, не все ssh-клиенты одинаково полезны поддерживают s/key. Автору этой статьи встретился всего лишь один работающий так как надо апплет: JCTerm от Jcraft,Inc. Исходный код доступен на сайте разработчика. Апплет можно испытать тут.

Завершая статью, стоит упомянуть об open source java2me приложении OneTimePassword, доступном по адресу sourceforge.net/projects/otp-j2me/. Загрузив его себе в мобильный телефон, можно спокойно отправляться в отпуск, не заботясь о сохранности ненужного теперь листа одноразовых паролей — OneTimePassword легко сгенерирует их.

Счастливого отпуска!

При написании статьи использовались материалы следующих сайтов:

ru.wikipedia.org/wiki/S/Key
tools.ietf.org/html/rfc1760
www.delta-xi.net/index.php?/archives/16-OTPs-Using-sKey-with-SSH-via-OPIE.html
blog.bogosity.se/2008/05/31/debian-ubuntu-skey-and-opie/
www.opennet.ru/cgi-bin/opennet/man.cgi?topic=opiekeys&category=5
alexustes.dev.juga.ru/pam/article.html
www.ibm.com/developerworks/ru/library/l-pam/index.html
sourceforge.net/projects/otp-j2me/
www.jcraft.com/jcterm/
wiredx.net/jcterm/

Добавить комментарий

Войти с помощью: