Хочу рассказать как безопасно хранить 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)


  1. Ryav
    15.05.2019 11:09
    +2

    Отлично, как это провернуть на системе без иксов?


    1. kvaps Автор
      15.05.2019 13:42

      Хороший вопрос.
      Если вы про удаленный сервер, то думаю можно попробовать пробросить сокет ssh-агента для добавления ssh-ключа.


    1. sim3x
      15.05.2019 21:58

      Есть keepassxc-cli

      Возможно софт можно собрать без Qt или статично, так чтоб Х не тянулся в зависимостях

      Но имо проще создать ссш ключ с запросом пароля


  1. mosidze
    15.05.2019 11:46

    круто. не проще использовать связку (ключ с паролем) + TOTP? Может не удобно, но зато надежно


    1. kvaps Автор
      15.05.2019 13:48

      Конечно можно, но тут скорее решается вопрос хранения персональных ssh-ключей.
      Большинство людей и так используют KeePass для хранения паролей, но не знают что в нем есть такая замечательная возможность как взаимодействие с ssh-агентом.


      1. mosidze
        15.05.2019 14:14

        Никогда не доверял пароли, особенно критичные стороннему софту. И keepass никогда не использовал. Так что, в данном случае, соглашусь с Вашим мнением


        1. polearnik
          15.05.2019 16:57

          а как вы храните многочисленные и разнообразные пароли?


    1. prudnitskiy
      15.05.2019 14:39
      +1

      А еще проще использовать аппаратные хранилища ключей, типа GPG Card. Но его купить надо (и желательно не потерять случайно)


      1. kvaps Автор
        15.05.2019 14:40

        не проще, т.к. не везде есть возможность его использовать, а еще бэкапить нельзя


        1. Graphite
          15.05.2019 14:47

          В целом да, но:


          • бекапить можно, по крайней мере yubikey при генерации предлагает это сделать
          • для бекапа можно сделать отдельный обычный ключ, который будет лежать в оффлайн хранилище (банковская ячейка и т.п.)
          • на основных ОС работает без проблем, не уверен только в мобильных; есть какие-то распространенные ситуации, где апаратный ключ невозможно использовать?


        1. prudnitskiy
          15.05.2019 15:56

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


  1. BuccapuoH
    15.05.2019 13:45

    Сам использую Yubikey с forcesig. Довольно удобно (кроме необходимости вводить пин для каждой операции) и надёжно. Но для более быстрого сетапа можно попробовать Krypton.


  1. worldmind
    15.05.2019 15:07

    А как быть если ключей несколько для разных хостов?


    1. kvaps Автор
      15.05.2019 15:30

      Таким образом можно добавить сколько хочешь ключей


      1. Belya-Dj
        15.05.2019 17:09

        Но при этом, к сожалению, если серверов больше 5-10, то данный способ хранения не очень будет удобным — потому как все ключи по списку будут отправляться на сервер, и после N-ного ключа (если нужный не был отправлен) сервер отключит клиента с ошибкой авторизации.


        1. kvaps Автор
          15.05.2019 18:00

          SSH умеет использовать public keys в качестве IdentityFile.
          То есть ничто вам не мешает хранить id_rsa.pub в ~/.ssh и ссылаться на него в качестве IdentityFile для конкретных хостов, при этом сам private key будет надежно сохранен в кипасе.


          1. Belya-Dj
            16.05.2019 12:53

            Не совсем вас понял — как можно логинится с помочью паблик ключа? Как такое возможно? Буду благодарен за ссыль где почитать об этом.


            1. kvaps Автор
              16.05.2019 19:27

              Паблик ключ преданный как IdentityFile будет использоваться не для идентификации, а только в качестве указателя на какой именно приватный ключ следует использовать. Сам приватный ключ должен быть заранее добавлен в ssh-agent. Посмотреть список загруженных в агента ключей можно выполнив:


              ssh-add -l

              https://superuser.com/questions/357602/use-a-specified-key-from-ssh-agent


        1. MMik
          15.05.2019 18:19

          del


        1. nad_oby
          16.05.2019 15:16

          1. Belya-Dj
            16.05.2019 15:31

            Спасибо, посмотрю-почитаю :)


  1. pal666
    16.05.2019 02:00

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


    1. felix0id
      17.05.2019 12:52

      Тут ещё и решается вопрос менеджмента ключей весьма удобной гуйкой. При этом я храню свою БД в облаке и синхронизирую между хостами. Таким образом, мои ключи ещё и удобно забекаплены :-j


    1. kvaps Автор
      18.05.2019 10:50

      Шифрование ssh-ключей было достаточно сильно раскритикованно из-за возможности быстрого перебора паролей.


      https://www.opennet.ru/opennews/art.shtml?num=49082