Создание и использование закрытого и открытого ключа в программе ssh

Введение

Для общего понимания ключей рекомендуется прочитать страницу посвященную ssh-ключам Все приведенные на этой странице команды будут выполняться в терминале (xterm, terminal, konsole,...), а т.к. ssh-доступ почти всегда подразумевает работу в командной строке, будем считать, что как выполнять команды Вы знаете. В примерах ниже мы будем для определенности использовать RSA-ключи, хотя Вы можете использовать и другие виды ключей:
  • DSA-ключи: файлы id_dsa*, длина в битах всегда 1024, как требуется по FIPS 186-2
  • ECDSA-ключи: в данный момент не поддерживаются на сервере BlueGene

Создание ssh-ключа

Перед созданием ключа убедитесь, что у Вас еще нет ключа:
  • ls -l ~/.ssh
  • если команда отработала без ошибок и вы получили в выводе файлы id_rsa/id_dsa то у Вас уже есть нужный ключ, создавать не требуется
    • Пример:
      -rw-rw-r-- 1 user user    89 янв.  24  2013 config
      -rw------- 1 user user  1679 янв.  27  2012 id_rsa
      -rw-r--r-- 1 user user   393 янв.  27  2012 id_rsa.pub
      -rw------- 1 user user 21618 дек.   9 18:10 known_hosts
      
    • если несмотря на наличие ключа Вы хотите создать отдельный ключ для сервера, то используйте универсальный способ
  • если в выводе вы получили файлы id_ecdsa, то ключ у Вас есть, но в данный момент на BlueGene по такому виду ключа не зайти.
    • в этом случае придется создать rsa-ключ, можно использовать простой способ
  • если ssh-ключа у Вас нет, то требуется создать (можно использовать простой способ)

Простой способ создания ssh-ключей

Для создания ключа введите команду: ssh-keygen -t rsa В результате эта команда в интерактивном режиме создаст пару ssh-ключей (открытый и закрытый) типа RSA с длиной ключа 2048 бит. Местоположение файлов:
  • закрытый ssh-ключ (identification): ~/.ssh/id_rsa
  • публичный ssh-ключ (public key): ~/.ssh/id_rsa.pub.

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

Универсальный способ создания ssh-ключей

Будем использовать ту же программу (ssh-keygen), но с дополнительными параметрами:
  • -t тип-ключа (rsa/dsa/...): какой тип ключа нужен
  • -b длина ключа: какой длины (для dsa длина всегда 1024)
  • -f имя_ключа: в какой файл сохранять ключ, если мы хотим разные ключи для разных целей (подробнее о том, зачем это может быть нужно можете посмотреть в разделе "Использование нескольких ssh-ключей" на странице посвященную ssh-ключам)

Пример:
  • вводите: ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa_hpc
  • в результате:
    • в интерактивном режиме будет создана пара ssh-ключей (открытый и закрытый) типа RSA с длиной ключа 4096 бит (разумеется Вы можете зашифровать закрытую часть ключа паролем).
    • ключи:
      • закрытый ssh-ключ (identification) будет сохранен в ~/.ssh/id_rsa_hpc
      • открытый ssh-ключ (public key) будет сохранен в ~/.ssh/id_rsa_hpc.pub
      • собственно о местоположении ключей будет сообщено в процессе создания, в нашем примере это выглядело так:
        Your identification has been saved in /home/user/.ssh/id_rsa_hpc.
        Your public key has been saved in /home/user/.ssh/id_rsa_hpc.pub.
        

В дальнейшем не забудьте прописать в настройках программы ssh для данного сервера путь именно к этому закрытому ssh-ключу (в параметре IdentityFile файла ~/.ssh/config), о чем — в следующем разделе.

За более подробной информацией обращайтесь к справочным страницам (man ssh-keygen, или на сайте OpenBSD ) и F.A.Q по OpenSSH

Конфигурирование ssh-программы

Хотя в данный момент Вы можете уже пользоваться ssh-ключом для доступа на требуемый сервер, рекомендуется для удобства прописать требуемые параметры, чтобы не вводить заново. Особенно это актуально в случае, если для разных серверов требуется разный ssh-ключ.

Программа ssh читает настройки из файла ~/.ssh/config, для того, чтобы узнать о всех доступных параметрах рекомендуем ознакомиться с документацией (man ssh_config или на сайте OpenBSD), а здесь мы дадим пример, который каждый может переделать под свои нужды.

Допустим вы хотите входить на вычислительный сервер regatta1.cs.msu.ru под пользователем edu-vmk-stud-500-001 и использовать ключ ~/.ssh/id_rsa В командной строке Вам придется ввести: ssh regatta1.cs.msu.ru -l edu-vmk-stud-500-001 -i ~/.ssh/id_rsa, где:
  • -l: какой логин использовать
  • -i: какой ключ использовать (указывается закрытый ssh-ключ (Identity))
  • regatta1.cs.msu.ru: на какой сервер заходить.

Довольно длинная команда, но ее можно сильно сократить, для этого нам и нужен ~/.ssh/config

Пример конфигурационного файла ~/.ssh/config:
# настройки для сервера регатта
Host regatta
    Hostname regatta1.cs.msu.su
    User edu-vmk-stud-500-001
    IdentityFile ~/.ssh/id_rsa

Если при наличии этой информации в ~/.ssh/config мы введем ssh regatta, то мы получим тот же результат, что и в предыдущем случае.

Кратко по параметрам:
  • # как и в большинстве конфигурационных файлах unix этот символ используется для комментариев
  • Host: имя (множество имен), обозначающие секцию. Если вместо regatta будет, скажем, regatta *, то можно будет вводить не только regatta, но и regatta.cs.msu.su, результат будет одинаковым
  • Hostname: какое на самом деле имя сервера использовать
  • User: под каким пользователем заходить
  • IdentityFile: какой ключ авторизует пользователя, указывается его закрытая часть (т.е. закрытый ssh-ключ)

Зачем полезно указывать ключ — смотрите на странице по ssh ключам раздел по использованию различных ключей

Получение отпечатка ssh-ключа (fingerprint)

Отпечаток ключа это не публичная и не приватная часть ключа. Её не получится использовать для доступа, но при помощи неё можно проверить, что публичный ключ подлиный(а не повредился при передаче или не был подменён злоумышленником) Для этого понадобится уже знакомая Вам программа ssh-keygen:
  • ssh-keygen -l -f путь_до_публичного_ssh-ключа, т.е:
    • если использовался простой метод создания, то: ssh-keygen -l -f ~/.ssh/id_rsa.pub, в результате будет что-то вида 2048 4c:d1:96:6f:dd:e5:67:ce:55:8b:fb:38:b2:a2:63:c5  user@host (RSA)
    • для универсального метода Вы должны указать путь до своего ключа, в нашем примере это будет: ssh-keygen -l -f ~/.ssh/id_rsa_hpc.pub, в результате в нашем примере будет 4096 82:80:b0:ab:1c:71:c0:ab:77:bd:8f:62:83:39:15:3b  user@host  (RSA)
  • в наших примерах мы использовали RSA-ключ, а в этом случае можно указывать и закрытый ключ (т.е. без .pub), вывод будет тот же
Пришлите вывод тому, кто спрашивает у Вас отпечаток (если хотите, перенаправьте вывод команды ssh-keygen в файл, но можете и просто скопировать из терминала эту строку в письмо/документ/форму на сайте и т.д.).

Перейти с доступа по паролю на доступ по ключу.

Если у вас уже есть доступ на систему по паролю, но вы хотите перейти на доступ по ключу то вы можете воспользоваться командой ssh-copy-id:
  • ssh-copy-id -i ~/.ssh/id_rsa_hpc.pub edu-vmk-stud-500-001@regatta1.cs.msu.ru
    • -i: позволяет указать путь до публичного люча, например: ~/.ssh/id_rsa_hpc.pub (это указывать не обязательно)
    • далее следует логин для системы (edu-vmk-stud-500-001) и адресс самой системы(regatta1.cs.msu.ru)
  • система спросит у вас пароль и разместит ключ (с правильными правами и в нужном месте).
  • после этого можно попробовать зайти на систему. Система проведёт проверку ключа и не будет спрашивать пароль.
  • Примечание: для хостинга это не работает (нужен полный shell), возникает ошибка:
    invalid characters in scp command!
    here:
                    set -e; \
                    umask 077; \
                    keyfile=$HOME/.ssh/authorized_keys ; \
                    mkdir -p -- "$HOME/.ssh/" ; \
                    while read alg key comment ; do \
                            [ -n "$key" ] || continue; \
                            if ! grep -sqwF "$key" "$keyfile"; then \
                                    printf "$alg $key $comment\n" >> "$keyfile" ; \
                            fi ; \
                    done \
            '
    try using a wildcard to match this file/directory
Topic revision: r6 - 15 Apr 2014, RomanKondakov
This site is powered by FoswikiCopyright © by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding Foswiki? Send feedback