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
.
Wesha
Потому что пароль хранися в голове, а ключ — на устройстве. Незаметно получить доступ к первому несколько сложнее.
dartraiden
Ключ можно защитить паролем.
Wesha
Пароль всегда в голове, а защищённый паролем ключ — нет.
(Тонкий намёк: пароль не обязан быть коротким)
Kil1J0y
У меня ключ всегда с собой, + одно устройство с флеш памятью и можно перевести в режим ro, собственно там и хранится безопасная среда ) а второй раздел отдан под vc тоже в ro там пароли и прочее, а другое устройство это mfa так же для ssh и входа в аккаунты
Iselston
Это здорово, но к сожалению малоприменимо в госовом энтерпрайзе. Тут политика ИБ проста как две копейки: блокируем просто всё так как нет времени строить нормальные белые списки
Wesha
А у меня голова всегда с собой. А когда она сломается — тогда мне будует по....рпендикулярно и на пароли, и на ключи, и на весь этот гадский цирк с понями.
Kil1J0y
В голове сложные пароли (на каждый сервис свой сложный пароль буквы символы цифры регистр и тд)и 2fa сложно хранить, а в наше время без 2fa ни как) единственный сложный пароль у в голове это от хранилища vc но там тоже второй фактор в виде ключевого файла и пин-кода токена. И это всегда с собой. Даже если потеряешь токен это не страшно, он с скзи и поможет только полная очистка т.к. после 3х неверных пин-кодов он заблочится. Пин администратора(сложный пароль) пользователя(пин для доступа к ключам на токене) и гостя(для открытия vc) разные. У меня есть дубликаты дома в сейфе. Там точно не потеряется, и хранится в гермопакете на случай соседей выше.
Wesha
correct horse battery staple
Я говорю о своих сервисах. Нормальные люди не занимаются этими идиотскими танцами с буквами-цифрами-спецсимволами, нормальные люди делают длинные пароли.
А в чём Вы его храните на случай уснувшего курильщика ниже? А на случай рязанского сахара?
MishaRash
К сожалению, это не идеальный подход. Пароль из 4 слов через пробел можно подобрать намного быстрее, чем случайный такой же длины, с помощью словаря. Легко запоминаемые замены (в т.ч. что-то другое вместо пробелов) не особо помогают. Полезнее использовать сложные слова, чтобы они не попадали в короткие списки. См. https://www.youtube.com/watch?v=3NjQ9b3pgIg
Можно дальше заморачиваться, например, насчёт возможности разгадать ваш подбор слов (не идеально случайный) и пытаться обойти с помощью техник вроде Diceware https://www.youtube.com/watch?v=Pe_3cFuSw1E
Боюсь, что практически любая структура пароля, упрощающая запоминание, упрощает и подбор. Хотя не обязательно в той же степени, так что может быть простор для оптимизации.
Правда, насколько я понимаю, действительно быстро можно подбирать пароль практически только если утёк хэш (что, к сожалению, всё же вполне возможно). Через обычные методы авторизации (вебсайт, API) намного больше задержка для проверки и могут заблокировать аккаунт за несколько ошибок и/или перестать принимать запросы после не слишком большого их количества. Поправьте, если ошибаюсь.
Некоторые сайты, особенно банки и прочие финансовые организации, не принимают пароль без символа из каждой категории, вы такие специально стороной обходите? Хотя меня они тоже не радуют. Особенно раздражает, когда ограничивают длину пароля сверху 10-20 символами (обычно тоже банки, зачем?!), тогда действительно трудно придумать сложный и запоминающийся.
Wesha
Я в своё время занимался этим. Несложное предложение ("грустные фиолетовые котята щекотно красят прялку") ничуть не хуже, как в смысле запоминания, так и в смысле энтропии. Смысл в том, что интерфейс нужен другой: юнит здесь — не буква, а слово.
randomsimplenumber
Особенно удобно
нетнабирать такой парол на мобильном устройстве.Wesha
Ви так говорите, как будто на мобильном устройстве удобно делать ну хоть что-то, кроме как совершать телефонные звонки (для чего, собственно, оно и предназначено).
MishaRash
Как будто удобнее набирать на мобильном устройстве случайный набор букв, цифр и спецсимволов, пусть и в 2-3 раза меньшей длины. А в базу паролей можно и то, и то сохранить, почему нет?
MishaRash
Вы говорите загадками — непонятно, с чем сравниваете.
В вашем предложении, очевидно, меньше энтропии, чем в строке из 48 символов из набора "маленькие русские буквы и пробел", т.к. далеко не всякая строка является предложением (и даже не любой набор букв является словом). С тем, что предложение легче запомнить, мне поспорить сложно, конечно.
Если вы имели в виду, что раз в предложении 6 слов, то надо сравнивать с 6 символами, то, скорее всего, вариантов слов всё же больше, чем букв (особенно английских), цифр и спецсимволов вместе взятых. Но тогда не так очевидно, что предложение легче запомнить.
По-моему, логичнее сравнивать с сильным паролем по мнению адептов букв-цифр-спецсимволов — символов этак 20 из более широкого набора. Предложение запомнить, пожалуй, значительно проще, но вот по энтропии уже не так ясно.
Wesha
Следите за руками.
В русском языке:
— более 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 вариантов, при этом запомнить абсурдное предложение на порядки легче, во-первых, потому что описываемую им ситуацию легко представить (то есть можно использовать визуальную, а не символьную память), а во-вторых, потому что такое предложение легко запомнить именно в силу его абсурдности (помним про лошадь с батареей?).
Ещё возражения?
MishaRash
Я, собственно, не возражал, спасибо за недостававшие детали. Ещё бы поменьше сайтов требовали по одному символу каждого сорта, или вообще ограничивали длину сверху...
Параноик мог бы сказать, что словарный запас отдельного человека более ограничен, выбор не случаен или не равновероятен (например, котята более вероятны, чем какие-нибудь тихоходки). Хотя вряд ли это существенно портит картину с абсурдным предложением.
В KeePassXC есть оценка энтропии пароля, которая вроде учитывает слова. Вряд ли русские на кириллице (не пробовал), но на них и меньше словарей для подбора заготовлено, наверное.
Wesha
Так о том и говорю, что эта методика — для, к сожалению, своих средств контроля доступа, потому что по всему интернету засели карго-культисты, действующие по принципу "у всех так — ну и мы так же сделаем".
Ну, если проредить парольные словари от слов, не существующих в других языках — то его можно и мультилингвальным сделать: sad violet kittens paint spinning-wheel itchily тоже позволит Вам войти.
Kil1J0y
Курильщики и сахар решается третей копией которая хранится где то в другом месте, но чтоб случилось потерять свой комплект, и сгорел дома ,что должно случится то, конечно есть бекапы в облаках они шифрованные