Организация 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 no" no нужно поменять на 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
    Поделиться публикацией
    Комментарии 45
      +1
      Спасибо. Мельком про s/key читал в статьях про керберос, а что он есть в ssh не знал.
        +1
        это PAM-модуль, тут дело не в ssh
        +28
        Есть другой рецепт: едешь в отпуск — отключай телефон )
          –8
          И? А оно не работает. Что делаем?
            +2
            Чувство юмора включаем перед чтением комментариев )
              +7
              Оно не работает, а мы об этом не знаем :)
              0
              > едешь в отпуск — отключай телефон )

              Всё правильно сделал! Нефиг из отпуска человека дёргать.
              Зарезервировали серваки — зарезервируйте и админов!
                +2
                Да, но ноут бери с собой-иначе какой же ты админ (;
                  0
                  Предлагаю конкретизивовать! Заменить «с собой» на «с собой на пляж» )))
                  0
                  +1. Плохо быть незаменимым. В крупных компаниях такого не бывает, кстати, непозволительный риск.
                  +6
                  >В любой серьезной компании иногда возникает необходимость в том, чтобы сотрудник, уехавший в отпуск, срочно выполнил свои должностные обязанности.

                  «Незаменимых людей нет» (с) Что будет делать «серьёзная компания», если «ключевой» сотрудник уехал в отпуск в Гималаи, Антарктиду или просто на дачу, где нет покрытия сотовых операторов? Не знаю, как в окрестностях «дефолт-сити» и Гималаев (откуда они взялись в башке, почему не Тибет, например? Неужто попса так влияет? Точно: «отпустите меня в Гималаи… где никто не коннектит ко мне» :D ), но в окрестностях «культурной столицы» такие дачи точно есть)?

                  А за статью спасибо, коллективный разум хабра как всегда телепат, на днях обсуждали методики генерации одноразовых паролей, кроме как до рандомного списка «в конверте» толком не дообсуждались:)

                    0
                    >Что будет делать «серьёзная компания», если «ключевой» сотрудник уехал в отпуск в Гималаи, Антарктиду

                    или сотрудника туда отпускать не будут, или он будет обязан вести подробную вики с описанием возможных проблем и из решениями.

                      +3
                      >или сотрудника туда отпускать не будут,

                      как это физически может выглядеть? домашний арест на время отпуска? Чур, охранники противоположного пола и посимпатичней :)

                      >или он будет обязан вести подробную вики с описанием возможных проблем и из решениями.

                      а в «серьёзных компаниях» этого (необязательно вики, а различных «политик» и «регламентов») до сих пор нет?
                      +1
                      если _очень серьезная компания_ — то я например пользуюсь www.iridium.com/products/Iridium9555SatellitePhone.aspx?productCategoryID=1

                      если кто-то начнет выступать что это дорого — ерунда, аппарат стоит 1000 фунтов и минута менее доллара (дешевле роуминга GSM чаще всего)
                      +1
                      Перенесите в компьютерную безопасность, кармы у вас теперь хватает
                        +2
                        Спасибо всем за карму, перенес.
                        –2
                        Сложнова-то после логина еще выполнять команду.

                        В практике можно проще — сделать toor'ов штук 5 с разными паролями, после входа сразу passwd на случайные символы.
                          +1
                          А «после входа сразу passwd» — это не команда после логина? Да и зачем плодить сущности без необходимости?

                          Но если вам проще вместо 1 пароля (секретной фразы для генерации ответа) запомнить 5 разных паролей, то я за вас рад, без шуток. Серьезно.

                            0
                            Везде дело привычки. Если будет удобно — почему бы и нет?
                            0
                            Так кейлоггер может «прослушать» новый пароль, на который меняем ;)
                              0
                              Научитесь обманывать кейлогеры метровыми текстами)
                                –1
                                но кроме кейлоггеров, «они» могут сниффать исходящий\входящий траффик
                                  +1
                                  в ssh это бессмысленно
                            –4
                            Всегда «радовали» такие решения… юзали бы ключи с паролями к ключу и не парились бы. Ну и OpenVPN.
                            Конечно, никто даже не подумал подумать что будет если ноутбук украдут и данные скопи***дят.
                            Иногда складывается впечатление, что многие люди думают задницей…
                              +2
                              S/key не претендует на всеобщую универсальность. У разных задач — разные решения. Для ситуации, описанной в статье, на мой взгляд, s/key — наиболее подходящее решение, но это не значит, что других решений, которые будут удобны другим людям, не существует.
                                +1
                                1) я так понимаю что подразумевается что с собой ноута нет и поэтому заход с «левого» интернет кафе. нужный пароль можно получить либо по телефону, либо сгенерировать локально, например устанивив апп на телефон. для этого ноут не нужен

                                2) по пободу кражи ноута — не релевантно. если 'мастер' пароль не хранит, а вводить для генерации одноразового.

                                3) информационная проблема с кражей ноута решается просто. у меня вся «интересная» инфа включая ~/.ssh/ и все исходники находится на зашифрованном диске который маунтится при логине.
                                  0
                                  Поставил truecrypt, создал зашифрованный раздел, закинул на него основное из home-диры и по поводу несанкционированного доступа не парюсь :)
                                  Действительно достаточно удобно.
                                0
                                Спасибо! Взял на заметку.
                                  0
                                  спасибо за статью. Учту.В будущем надеюсь поможет)
                                    –1
                                    Список одноразовых паролей — ну просто «Алекс — Юстасу» :)
                                      0
                                      Отсечение по подсети, таймаут при неверном вводе пароля ( секунд эдак 20… ), нестандартный порт… а еще лучше авторизация по ключам. Тоже вполне секурно :)
                                        0
                                        Прочитайте еще исходные данные к статье, все о чем Вы говорите не может быть использовано при этих условиях.
                                          0
                                          Да, я прочитал, понимаю. Просто предложил один из самых распростр. и безопасных вариантов :)
                                        +1
                                        Вот такое бы решение для gmail.
                                          –2
                                          «Лист с паролями можно спрятать поглубже в чемодан или скопировать на телефон в виде простого текстового файла. „
                                          — отличная рекомендация. Не забудьте еще указать IP сервера и логин, на этом же листе.
                                            –3
                                            0) ходить по ssh в интернет кафе вообще как бы не разумно.
                                            1) вряд ли в интернет-кафе есть ssh-клиент и ни один вменяемый кафешный админ вам его не поставит, — сломает кто-то из кафе чей-то серв — проблем не оберешься.
                                            2) «набирать пароль root'а от главного сервера компании» — ИМХО это вообще жесть. намного секьюрнее ходить по ключам с доверенного компьютера.
                                            3) если уж так нужно что-то сделать под рутом, можно зайти с телефона на свой (и/или доверенный) ПК, сменить пароль на временный, зайти уже из кафе на свой ПК с временным паролем, по ключу скриптом залогиниться на главный сервер, сделать работу и опять же, с телефона сменить пароль обратно.

                                            для кейлоггера это бы выглядело бы так:

                                            ssh user@1.2.3.4
                                            passweird
                                            MAIN
                                            [other commands]

                                            *MAIN — небольшой скрипт, залогинивающий пользователя на главный сервер. не светится ни IP главного сервера ни тем более пароль рута.

                                            все просто и без изобретения велосипедов.
                                              0
                                              Внимательно перечитайте всю статью.
                                                0
                                                сорри, не дочитал до конца, т.к. думал там все только об установке S/key.

                                                можно прекрасно соблюдать осторожность без установки дополнительных костылей.
                                                > ssh-клиент в виде java апплета
                                                putty в телефон и все дела, зачем тогда вообще кочепыжиться с одноразовыми паролями?
                                                о том, как не набирать пароль рута вообще — я упомянул выше.
                                                  0
                                                  Putty хорош, никто не спорит, но мобильная клавиатура совсем не всем удобна, да и gprs в роуминге может обойтись дороже часа в интернет-кафе.

                                                  В случае, когда необходима правка конфигов или иное использование текстового редактора, дисплей телефона из-за размера тоже может показаться непрактичным.
                                                    0
                                                    согласен, именно поэтому я и описал порядок действий:
                                                    сменить пароль на удаленной машине (М) -> залогиниться на М -> зайти скриптом на главный сервер (С) -> выполнить необходимые действия на С -> выйти с С -> через телефон сменить обратно пароль на М.

                                                    преимущество очевидно: не раскрывается IP-адрес С, не вводится никаких паролей на С, пароль на М сменить с телефона не сложно.
                                                    авторизация с М на С осуществляется посредством ssh-agent с ключами.
                                                      0
                                                      чтобы совсем уж сделать все супер-секьюрным, можно ssh вешать на нестандартные порты, один порт для постоянного пользования, другой — для срочных дел, когда нужно подключиться с чужого/[не безопасного] ПК. второй порт менять после «засвечивания».
                                                        0
                                                        можно немного автоматизировать процесс, запустить скрипт-демон, который после залогинивания сменит ему пароль с временного на обычный, тогда даже если перехваченный временный пароль тут же попытаются использовать — ничего не получится.

                                                        echo knownpass | pw usermod username -h0
                                                          0
                                                          На мой взгляд, у схемы со сменой паролей с основного на временный и обратно есть недостаток: после использования пароля он (пароль) работоспособен некоторое, возможно малое, время, за которое злоумышленник (если он существует, конечно), может воспользоваться этим паролем. Race condition — опасная штука.

                                                          S/key же лишен этого недостатка.

                                                          Но сколько людей, столько и мнений. У каждого решения есть свои плюсы и минусы.
                                                            0
                                                            в данном случае Race condition отсутствует, ибо пароль сменится сразу же.
                                                          0
                                                          … после залогинивания [пользователя] сменит…
                                                          хабр не любит угловые скобки((

                                              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                              Самое читаемое