Хочу рассказать как безопасно хранить SSH-ключи на локальной машине, не боясь того, что какое-то приложение может украсть или расшифровать их.
Статья будет полезна тем, кто так и не нашел элегантного решения после паранои в 2018 и продолжает хранить ключи в $HOME/.ssh
.
Для решения данной проблемы предлагаю использовать KeePassXC, который является одним из лучших менеджеров паролей, он использует сильные алгоритмы шифрования, а также имеет встроенный SSH-агент.
Это дает возможность безопасно хранить все ключи прямо в базе паролей и автоматически добавлять их в систему при её открытии. Как только база будет закрыта, использование SSH-ключей также станет невозможным.
Первым делом добавим автозапуск SSH-агента при входе в систему, для этого откройте ~/.bashrc
в вашем любимом редакторе и добавьте в самый конец:
SSH_ENV="$HOME/.ssh/environment"
function start_agent {
echo "Initialising new SSH agent..."
/usr/bin/ssh-agent | sed 's/^echo/#echo/' > "${SSH_ENV}"
echo succeeded
chmod 600 "${SSH_ENV}"
. "${SSH_ENV}" > /dev/null
}
# Source SSH settings, if applicable
if [ -f "${SSH_ENV}" ]; then
. "${SSH_ENV}" > /dev/null
#ps ${SSH_AGENT_PID} doesn't work under cywgin
ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
start_agent;
}
else
start_agent;
fi
После чего нам нужно включить поддержку в KeePassXC:
Инструменты --> Параметры --> SSH-агент --> Включить SSH-агент
На этом настройка завершена, теперь попробуем добавить новый SSH-ключ в KeePassXC:
Нажимаем на иконку с ключом, затем заполняем данные:
Если ключ защищен паролем, укажите так-же пароль к нему
На вкладке Дополнительные загружаем вложение с нашим id_rsa:
На вкладке SSH-агент, отметим:
- Добавить ключ в агент при открытии/разблокировке базы данных
- Убрать ключ из агента при закрытии/блокировке базы данных
Далее выберем наш ключ (id_rsa) во вложении
И нажмем кнопку Добавить в агент:
Теперь при запуске KeePassXC ключ будет автоматически добавляться в SSH-агент, таким образом его можно больше не хранить на диске!
Комментарии (24)
mosidze
15.05.2019 11:46круто. не проще использовать связку (ключ с паролем) + TOTP? Может не удобно, но зато надежно
kvaps Автор
15.05.2019 13:48Конечно можно, но тут скорее решается вопрос хранения персональных ssh-ключей.
Большинство людей и так используют KeePass для хранения паролей, но не знают что в нем есть такая замечательная возможность как взаимодействие с ssh-агентом.
prudnitskiy
15.05.2019 14:39+1А еще проще использовать аппаратные хранилища ключей, типа GPG Card. Но его купить надо (и желательно не потерять случайно)
kvaps Автор
15.05.2019 14:40не проще, т.к. не везде есть возможность его использовать, а еще бэкапить нельзя
Graphite
15.05.2019 14:47В целом да, но:
- бекапить можно, по крайней мере yubikey при генерации предлагает это сделать
- для бекапа можно сделать отдельный обычный ключ, который будет лежать в оффлайн хранилище (банковская ячейка и т.п.)
- на основных ОС работает без проблем, не уверен только в мобильных; есть какие-то распространенные ситуации, где апаратный ключ невозможно использовать?
prudnitskiy
15.05.2019 15:56Вот только бэкап — это небезопасно само по себе, вот в чем проблема. Это конфликт надежности и безопасности, ибо бэкап могут украсть и незащищенный ключ попадет в руки злоумышленника.
BuccapuoH
15.05.2019 13:45Сам использую Yubikey с forcesig. Довольно удобно (кроме необходимости вводить пин для каждой операции) и надёжно. Но для более быстрого сетапа можно попробовать Krypton.
worldmind
15.05.2019 15:07А как быть если ключей несколько для разных хостов?
kvaps Автор
15.05.2019 15:30Таким образом можно добавить сколько хочешь ключей
Belya-Dj
15.05.2019 17:09Но при этом, к сожалению, если серверов больше 5-10, то данный способ хранения не очень будет удобным — потому как все ключи по списку будут отправляться на сервер, и после N-ного ключа (если нужный не был отправлен) сервер отключит клиента с ошибкой авторизации.
kvaps Автор
15.05.2019 18:00SSH умеет использовать public keys в качестве IdentityFile.
То есть ничто вам не мешает хранитьid_rsa.pub
в~/.ssh
и ссылаться на него в качестве IdentityFile для конкретных хостов, при этом сам private key будет надежно сохранен в кипасе.Belya-Dj
16.05.2019 12:53Не совсем вас понял — как можно логинится с помочью паблик ключа? Как такое возможно? Буду благодарен за ссыль где почитать об этом.
kvaps Автор
16.05.2019 19:27Паблик ключ преданный как IdentityFile будет использоваться не для идентификации, а только в качестве указателя на какой именно приватный ключ следует использовать. Сам приватный ключ должен быть заранее добавлен в ssh-agent. Посмотреть список загруженных в агента ключей можно выполнив:
ssh-add -l
https://superuser.com/questions/357602/use-a-specified-key-from-ssh-agent
pal666
16.05.2019 02:00ключи по умолчанию хранятся безопасно — они зашифрованы пассфразой, причем каждый своей, а тут один пароль на все. не делайте пустую пассфразу и все.
felix0id
17.05.2019 12:52Тут ещё и решается вопрос менеджмента ключей весьма удобной гуйкой. При этом я храню свою БД в облаке и синхронизирую между хостами. Таким образом, мои ключи ещё и удобно забекаплены :-j
kvaps Автор
18.05.2019 10:50Шифрование ssh-ключей было достаточно сильно раскритикованно из-за возможности быстрого перебора паролей.
Ryav
Отлично, как это провернуть на системе без иксов?
kvaps Автор
Хороший вопрос.
Если вы про удаленный сервер, то думаю можно попробовать пробросить сокет ssh-агента для добавления ssh-ключа.
sim3x
Есть keepassxc-cli
Возможно софт можно собрать без Qt или статично, так чтоб Х не тянулся в зависимостях
Но имо проще создать ссш ключ с запросом пароля