SSH предлагает несколько форм аутентификации, в том числе пароли и открытые ключи. Последние считаются более безопасными. Однако аутентификация по паролю по-прежнему остаётся самой популярной, особенно в сетевом оборудовании.

Чтобы не вводить пароль каждый раз вручную, есть специальные инструменты для автоматизации логина, то есть для неинтерактивной SSH-аутентификации. Это классическая утилита sshpass и её «исправленный» вариант passh (подробнее о причине «исправления» см. здесь).

▍ Парольный менеджер pass


Например, в случае passh применяется следующая конструкция с обёрткой для консоли Zsh. Пароль извлекается напрямую из парольного менеджера pass, где он хранится в зашифрованном виде:

pssh() {
  passh -p <(pass show network/ssh/password | head -1) ssh "$@"
}
compdef pssh=ssh

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

Pass считается стандартным парольным менеджером, который соответствует философии Unix. Каждый пароль хранится в зашифрованном gpg-файле, имя которого — название сайта или ресурса, для которого предназначен пароль:

zx2c4@laptop ~ $ pass
Password Store
├── Business
│   ├── some-silly-business-site.com
│   └── another-business-site.net
├── Email
│   ├── donenfeld.com
│   └── zx2c4.com
└── France
    ├── bank
    ├── freebox
    └── mobilephone

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

zx2c4@laptop ~ $ pass -c Email/zx2c4.com
Copied Email/jason@zx2c4.com to clipboard. Will clear in 45 seconds.

Pass очень просто управляет этими файлами. Все они хранятся в ~/.password-store, а в парольном менеджере есть несколько удобных команд для добавления, редактирования, генерации и получения паролей:

zx2c4@laptop ~ $ pass generate Email/jasondonenfeld.com 15
The generated password to Email/jasondonenfeld.com is:
$(-QF&Q=IN2nFBx

Можно редактировать хранилище паролей, используя обычные команды юникс-консоли с командой pass. То есть не используется дополнительные форматы файлов или новые парадигмы, которые нужно изучать. Сообщество создало множество клиентов, графических интерфейсов и расширений для самого pass. Например, на КДПВ скриншоты клиента passforios под iOS. А ниже QtPass, мультиплатформенный GUI для pass:



▍ Продвинутая работа с паролями


Швейцарский разработчик Винсент Бернат (Vincent Bernat) разработал более продвинутый скрипт для неинтерактивной аутентификации по SSH: см. его репозиторий ssh.zsh. Он поясняет, что начиная с версии OpenSSH 8.4 мы можем использовать методы SSH_ASKPASS и SSH_ASKPASS_REQUIRE. Это устраняет некоторые недостатки стандартной команды passh: здесь отсутствует парсинг выдачи ssh и не вызывается парольный менеджер, когда пароль не требуется:

ssh() {
  set -o localoptions -o localtraps
  local passname=network/ssh/password
  local helper=$(mktemp)
  trap "command rm -f $helper" EXIT INT
  > $helper <<EOF
#!$SHELL
pass show $passname | head -1
EOF
  chmod u+x $helper
  SSH_ASKPASS=$helper SSH_ASKPASS_REQUIRE=force command ssh "$@"
}

Если пароль неправильный, на втором экране выводится подсказка:

ssh() {
  set -o localoptions -o localtraps
  local passname=network/ssh/password
  local helper=$(mktemp)
  trap "command rm -f $helper" EXIT INT
  > $helper <<EOF
#!$SHELL
if [ -k $helper ]; then
  {
    oldtty=\$(stty -g)
    trap 'stty \$oldtty < /dev/tty 2> /dev/null' EXIT INT TERM HUP
    stty -echo
    print "\rpassword: "
    read password
    printf "\n"
  } > /dev/tty < /dev/tty
  printf "%s" "\$password"
else
  pass show $passname | head -1
  chmod +t $helper
fi
EOF
  chmod u+x $helper
  SSH_ASKPASS=$helper SSH_ASKPASS_REQUIRE=force command ssh "$@"
}

Разные варианты ввода пароля в зависимости от удалённого узла:

ssh() {
  # Grab login information
  local -A details
  details=(${=${(M)${:-"${(@f)$(command ssh -G "$@" 2>/dev/null)}"}:#(host|hostname|user) *}})
  local remote=${details[host]:-details[hostname]}
  local login=${details[user]}@${remote}

  # Get password name
  local passname
  case "$login" in
    admin@*.example.net)  passname=company1/ssh/admin ;;
    bernat@*.example.net) passname=company1/ssh/bernat ;;
    backup@*.example.net) passname=company1/ssh/backup ;;
  esac

  # No password name? Just use regular SSH
  [[ -z $passname ]] && {
    command ssh "$@"
    return $?
  }

  # Invoke SSH with the helper for SSH_ASKPASS
  # […]
}

Скрипт целиком можно взять здесь.

Почему пароли до сих пор доминируют в качестве основной формы аутентификации? Дело в том, что отдельные сетевые устройства затрудняют привязку ключа SSH к пользователю. Многие просто не поддерживают аутентификацию на основе ключей/сертификатов. Таким образом, сертификаты не всегда можно использовать.

Способы неинтерактивной аутентификации SSH помогают автоматизировать ввод паролей, которые хранятся в стандартном парольном менеджере pass.

Комментарии (22)


  1. Wesha
    29.09.2024 17:04
    +6

    Почему пароли до сих пор доминируют в качестве основной формы аутентификации?

    Потому что пароль хранися в голове, а ключ — на устройстве. Незаметно получить доступ к первому несколько сложнее.


    1. dartraiden
      29.09.2024 17:04
      +4

      Ключ можно защитить паролем.


      1. Wesha
        29.09.2024 17:04

        Пароль всегда в голове, а защищённый паролем ключ — нет.

        (Тонкий намёк: пароль не обязан быть коротким)


        1. Kil1J0y
          29.09.2024 17:04

          У меня ключ всегда с собой, + одно устройство с флеш памятью и можно перевести в режим ro, собственно там и хранится безопасная среда ) а второй раздел отдан под vc тоже в ro там пароли и прочее, а другое устройство это mfa так же для ssh и входа в аккаунты


          1. Iselston
            29.09.2024 17:04
            +1

            Это здорово, но к сожалению малоприменимо в госовом энтерпрайзе. Тут политика ИБ проста как две копейки: блокируем просто всё так как нет времени строить нормальные белые списки


          1. Wesha
            29.09.2024 17:04

            А у меня голова всегда с собой. А когда она сломается — тогда мне будует по....рпендикулярно и на пароли, и на ключи, и на весь этот гадский цирк с понями.


            1. Kil1J0y
              29.09.2024 17:04
              +1

              В голове сложные пароли (на каждый сервис свой сложный пароль буквы символы цифры регистр и тд)и 2fa сложно хранить, а в наше время без 2fa ни как) единственный сложный пароль у в голове это от хранилища vc но там тоже второй фактор в виде ключевого файла и пин-кода токена. И это всегда с собой. Даже если потеряешь токен это не страшно, он с скзи и поможет только полная очистка т.к. после 3х неверных пин-кодов он заблочится. Пин администратора(сложный пароль) пользователя(пин для доступа к ключам на токене) и гостя(для открытия vc) разные. У меня есть дубликаты дома в сейфе. Там точно не потеряется, и хранится в гермопакете на случай соседей выше.


              1. Wesha
                29.09.2024 17:04

                В голове сложные пароли сложно хранить

                correct horse battery staple

                на каждый сервис свой сложный пароль буквы символы

                Я говорю о своих сервисах. Нормальные люди не занимаются этими идиотскими танцами с буквами-цифрами-спецсимволами, нормальные люди делают длинные пароли.

                хранится в гермопакете на случай соседей выше.

                А в чём Вы его храните на случай уснувшего курильщика ниже? А на случай рязанского сахара?


                1. MishaRash
                  29.09.2024 17:04

                  correct horse battery staple

                  К сожалению, это не идеальный подход. Пароль из 4 слов через пробел можно подобрать намного быстрее, чем случайный такой же длины, с помощью словаря. Легко запоминаемые замены (в т.ч. что-то другое вместо пробелов) не особо помогают. Полезнее использовать сложные слова, чтобы они не попадали в короткие списки. См. https://www.youtube.com/watch?v=3NjQ9b3pgIg

                  Можно дальше заморачиваться, например, насчёт возможности разгадать ваш подбор слов (не идеально случайный) и пытаться обойти с помощью техник вроде Diceware https://www.youtube.com/watch?v=Pe_3cFuSw1E

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

                  Правда, насколько я понимаю, действительно быстро можно подбирать пароль практически только если утёк хэш (что, к сожалению, всё же вполне возможно). Через обычные методы авторизации (вебсайт, API) намного больше задержка для проверки и могут заблокировать аккаунт за несколько ошибок и/или перестать принимать запросы после не слишком большого их количества. Поправьте, если ошибаюсь.

                  Я говорю о своих сервисах. Нормальные люди не занимаются этими идиотскими танцами с буквами-цифрами-спецсимволами, нормальные люди делают длинные пароли.

                  Некоторые сайты, особенно банки и прочие финансовые организации, не принимают пароль без символа из каждой категории, вы такие специально стороной обходите? Хотя меня они тоже не радуют. Особенно раздражает, когда ограничивают длину пароля сверху 10-20 символами (обычно тоже банки, зачем?!), тогда действительно трудно придумать сложный и запоминающийся.


                  1. Wesha
                    29.09.2024 17:04

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

                    Я в своё время занимался этим. Несложное предложение ("грустные фиолетовые котята щекотно красят прялку") ничуть не хуже, как в смысле запоминания, так и в смысле энтропии. Смысл в том, что интерфейс нужен другой: юнит здесь — не буква, а слово.


                    1. randomsimplenumber
                      29.09.2024 17:04
                      +1

                      Особенно удобно нет набирать такой парол на мобильном устройстве.


                      1. Wesha
                        29.09.2024 17:04

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


                      1. MishaRash
                        29.09.2024 17:04
                        +1

                        Как будто удобнее набирать на мобильном устройстве случайный набор букв, цифр и спецсимволов, пусть и в 2-3 раза меньшей длины. А в базу паролей можно и то, и то сохранить, почему нет?


                    1. MishaRash
                      29.09.2024 17:04

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

                      Вы говорите загадками — непонятно, с чем сравниваете.

                      В вашем предложении, очевидно, меньше энтропии, чем в строке из 48 символов из набора "маленькие русские буквы и пробел", т.к. далеко не всякая строка является предложением (и даже не любой набор букв является словом). С тем, что предложение легче запомнить, мне поспорить сложно, конечно.

                      Если вы имели в виду, что раз в предложении 6 слов, то надо сравнивать с 6 символами, то, скорее всего, вариантов слов всё же больше, чем букв (особенно английских), цифр и спецсимволов вместе взятых. Но тогда не так очевидно, что предложение легче запомнить.

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


                      1. Wesha
                        29.09.2024 17:04
                        +1

                        Следите за руками.

                        В русском языке:

                        — более 12 000 прилагательных (13+ бит)
                        — более 16 000 существительных (14 бит)
                        — более 8 000 наречий (13 бит)
                        — более 30 000 глаголов (~~15 бит)

                        При построении предложения по схеме прил+прил+сущ+нар+гл+прил+сущ получается 13+13+14+13+15+13+14 = 95 бит информации, то есть 3.9*10^28 вариантов. Для сравнения, в пароле "{строчные,заглавные,цифры,спецсимволы}*15 — 7*10^27 вариантов, при этом запомнить абсурдное предложение на порядки легче, во-первых, потому что описываемую им ситуацию легко представить (то есть можно использовать визуальную, а не символьную память), а во-вторых, потому что такое предложение легко запомнить именно в силу его абсурдности (помним про лошадь с батареей?).

                        Ещё возражения?


                      1. MishaRash
                        29.09.2024 17:04

                        Я, собственно, не возражал, спасибо за недостававшие детали. Ещё бы поменьше сайтов требовали по одному символу каждого сорта, или вообще ограничивали длину сверху...

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

                        В KeePassXC есть оценка энтропии пароля, которая вроде учитывает слова. Вряд ли русские на кириллице (не пробовал), но на них и меньше словарей для подбора заготовлено, наверное.


                      1. Wesha
                        29.09.2024 17:04

                        Ещё бы поменьше сайтов требовали по одному символу каждого сорта, или вообще ограничивали длину сверху...

                        Так о том и говорю, что эта методика — для, к сожалению, своих средств контроля доступа, потому что по всему интернету засели карго-культисты, действующие по принципу "у всех так — ну и мы так же сделаем".

                        вряд ли русские на кириллице

                        Ну, если проредить парольные словари от слов, не существующих в других языках — то его можно и мультилингвальным сделать: sad violet kittens paint spinning-wheel itchily тоже позволит Вам войти.


                1. Kil1J0y
                  29.09.2024 17:04

                  Курильщики и сахар решается третей копией которая хранится где то в другом месте, но чтоб случилось потерять свой комплект, и сгорел дома ,что должно случится то, конечно есть бекапы в облаках они шифрованные