Wed 24 November 2010 Category: IT. Tags: linuxssh

SSH: аутентификация с использованием открытого ключа

Теоретические основы использования технологии открытого ключа можно почерпнуть в английской или русской статьях википедии. Мы же перейдем сразу к практической части.

Создание RSA ключей

Первый шаг - создание самих файлов ключей. Эта операция должна производится на клиенте:

$ mkdir ~/.ssh
$ chmod 700 ~/.ssh
$ ssh-keygen -t rsa -C "your_email@youremail.com"

Ключи бывают двух видов: rsa и dsa. Принципиальной разницы нет, можно любой использовать, но рекомендуется именно rsa. Подробнее можно почитать на stackexchange.

Можно указать, какой длины использовать ключ. По умолчанию rsa использует 2048 бит. Гитхаб, к примеру, в своей шпаркалке рекомендует использовать дину 4096 бит:

$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

Если параноя не проходит, то можно попробовать использовать нестандартную длину ключа, например 4097.

Система спросит нас, куда сохранить ключи, - оставляем по умалчанию. Затем будет вопрос про кодовую фразу (passphrase).

Вопрос с пасс-фразой должен каждый решить для себя сам: если сервер требует надежный защиты, ее необходимо использовать, если же удобство важнее безопасности, или окружение настраивается так, что подключение должно происходить полностью автоматически, без участия пользователя, можно оставить ее пустой. Для удобной работы с пасс- фразами существует утилита ssh-agent (см. далее).

Создадим ключи:

$ ssh-keygen -t rsa

Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase): *****
Enter same passphrase again: *****
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is: f4:de:3b:5a:a6:ae:32:65:3d:9a:24:b1:e0:95:15:3f swasher@ubuntu
The key's randomart image is:

+--[ RSA 2048]----+
|       o=.       |
|    o  o++E      |
|   + . Ooo.      |
|    + O B..      |
|     = *S.       |
|      o          |
|                 |
|                 |
|                 |
+-----------------+

Еще раз повторюсь - если мы используем пустую пасс-фразу, злоумышленник, завладевший ключами, сразу же получает полный доступ к системе. Используйте эту возможность с осторожностью!

Теперь у нас есть два файла - id_rsa и id_rsa.pub в ~/.ssh. Файл id_rsa.pub - это публичный файл, предназначенный для копирования на удаленную машину, id_rsa - тщательно храним у себя.

Так же иногда нужно получить пару ключей без установки в систему. Это можно сделать с помощью ключа -f. Ключи будут сгенерированны в текущей директории:

ssh-keygen -f vps

Общая схема такова - vps держим на машине, ОТКУДА будет подключаться, а vps.pub - там, КУДА будем подключаться.

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

  • У того, кто инициирует соеденение, должен быть ЗАКРЫТЫЙ ключ, а там, куда подключаются - ОТКРЫТЫЙ
  • Закрытый ключ id_rsa держим в строгом секрете (chmod 600). Открытый - можем раздавать всем подряд.

Сохранение открытого ключа на удаленном хосте

На удаленный хост требуется передать только публичный ключ. Если мы можем соеденится с удаленным хостом по SSH, используя пароль, то мы передаем RSA ключ следующей командой, выполненной на стороне клиента:

$ ssh-copy-id [-i [identity_file]] <username>@<host> [-p port]

где username - имя удаленного пользователя, в которого мы будем логинится, host - удаленный хост. Используя опцию -i мы можем указать отличный от id_rsa.pub файл, в противном случае будет использован файл из домашней директории ~/.ssh/id_rsa.pub.

На удаленном хосте этот файл будет помещен в ~/.ssh/authorized_keys файл, а наш хост и ключи станет "известнымыми" удаленной системе и помещен в ~/.ssh/known_hosts

$ ssh-copy-id swasher@nas

swasher@nas's password:

Now try logging into the machine, with "ssh 'swasher@nas'", and check in: .ssh/authorized_keys \
to make sure we haven't added extra keys that you weren't expecting.

Как и советуют, попробуем залогинится без пароля:

$ ssh swasher@nas

Linux nas 2.6.35-22-server #35-Ubuntu SMP Sat Oct 16 22:02:33 UTC 2010 x86_64 GNU/Linux Ubuntu 10.10
Welcome to the Ubuntu Server! * Documentation:  http://www.ubuntu.com/server/doc
Last login: Wed Nov 24 19:23:13 2010 from 192.168.0.21
swasher@nas:~$

Как видим, у нас все получилось!

Еще один способ скопировать ключ на удаленный сервер

Самый простой способ скопировать ключ на удаленный сервер - зайти на сервер с паролем и сделать:

# cat >> ~/.ssh/authorized_keys
<вставить открытый ключ сюда><нажать энтер>
<нажать Ctrl-D>

Чтобы под windows получить ключ из консоли ssh в буфер обмена, можно воспользоваться командой clip

> type id_rsa.pub | clip

Как добавить уже имеющийся закрытый ключ на локальную машину

К примеру, мы хотим подключится к удаленному серверу (или сервису, типа Github) с помощью пары уже имеющихся ключей - vps и vps.pub. Открытый ключ pub уже имеется на удаленной машине (или прикреплен в аккаунте Github), а закрытый - нам нужно добавить на локальную машину.

Обычно, на локальной машину уже есть "местный" закрытый ключ - ~/.ssh/id_rsa. Его и только его будет использовать команда ssh по умолчаннию.

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

Чтобы явно указать закрытый ключ, используем следующий синтаксис:

ssh -i <path_to_private_key> -p <port> <user>:<ip>

Чтобы "зашить" закрытый ключ в систему, проделываем следующее.

Для начала помещаем закрытый ключ в файл ~/.ssh/<private_key>, и назначаем ему владельцем того пользователя, от которого будем запускать ssh:

$ logname
user
$ chown user:user <private_key>
$ chmod 600 vps

Затем редактируем файл ssh_config. В него добавляем параметр IdentityFile, указывающий на наш файл закрытого ключа:

IdentityFile ~/.ssh/<private_key>

Теперь этот ключ будет использоваться наряду с ~/.ssh/id_rsa

Использование ключей с агентом

Чтобы каждый раз не вводить длинную пасс-фразу, ключ нужно добавить в ssh-agent. Для этого нужно выполнить несколько простых шагов:

  • Агент будет работать только для текущего терминала. Следующая команда создаст несколько переменных окружения, их можно посмотреть командой set | grep SSH, выполнив ее до и после.

    :: console
    # start the ssh-agent in the background
    $ eval "$(ssh-agent -s)"
    Agent pid 59566
    
  • Добавляем ключ в агента

    :: console
    $ ssh-add ~/.ssh/github
    Enter passphrase for /home/vagrant/.ssh/github:
    Identity added: /home/vagrant/.ssh/github (/home/vagrant/.ssh/github)
    
  • Посмотреть список добавленных ключей

    :: console
    $ ssh-add -l
    4096 SHA256:KFDFg8F7Ui+S5WpprXwnGaOiANO169rsskhwbhlp+k0 /home/vagrant/.ssh/github (RSA)
    
  • Завершить работу агента

    :: console
    $ ssh-agent -k
    

Некоторые настройки ssh-сервера

Эти опции нужно установить в yes, если мы хотим использовать аутентификацию по ключам

  • RSAAuthentication yes
  • PubkeyAuthentication yes

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

  • PasswordAuthentication no

Так же стандартной практикой является запрет на вход под рутом и смена порта по умолчанию:

  • Port 49564
  • PermitRootLogin no

Зачастую хорошие результаты даёт ограничение того, какие именно пользователи и откуда могут регистрироваться в системе. Задание параметра AllowUsers является хорошим способом добиться этого. К примеру, для разрешения регистрации только пользователю root с машины 192.168.1.32, в файле /etc/ssh/sshd_config нужно указать нечто вроде следующего:

AllowUsers root@192.168.1.32

Для разрешения регистрации пользователя admin из любой точки, просто укажите имя пользователя:

AllowUsers admin

Несколько пользователей должны перечислять в одной строке, как здесь:

AllowUsers root@192.168.1.32 admin

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

Windows

Если вдруг по каким-то непонятным причинам возникла необходимость сгенерировать ключи из-под Windows, поступаем следующим образом.

- все таки Linux

Если нужно подключиться от виндовс-машины к линуксу, то не обязательно генерировать ключи под Windows. Вместо этого можно в любой linux консоле, хоть из Cygwin, сгенерировать ключи:

ssh-keygen -f newkeys

Скопировать публичный ключ в authorized_hosts

ssh-copy-id -i newkeys localhost

Переместить пару ключей newkeys на виндовс-машину в надежное место, использовать но назначению.

- используя ssh-клиент VanDyke SecureCRT.

Я долгое время пользовался этим клиентов, пока не перешел на [Secure Shell] от Google, который работает прямо в браузере.

Генерируем ключи - идем в меню Tools, Create Public Key, выбираем тип ключа RSA, пассфразу заполняем или оставляем пустой по желанию, длину ключа указываем 2048, выбираем OpenSHH формат ключа, место куда его сохранить и название файла ключей (по умолчанию Identity).

Далее каким-либо образом (на флешке, через scp ftp, клипбоард или другим способом) переносим файл Identity.pub на удаленную машину. Предположим, мы хотим сделать ключ сразу для рута.

Перемещаем его в пользователя, в которого мы хотим логиниться - значит в /root/.ssh. Для каждого пользователя на удаленной машине - свои ключи. Далее выполняем:

$ root@remotehost:/root/.ssh# cat Identity.pub >> authorized_keys

Все! Можно логинится. Файл публичного ключа можно удалить, или использовать для входа на другой сервер.

- используя PuTTY key generator

Скачиваем PuTTYgen с официальной страницы. В генераторе выбираем тип ключа SSH-2 RSA, по желанию заполняем pass-phrase, и жмем Generate. Двигаем мышкой, пока не заполнится прогрессбар.

Вверху у нас заполнилось окошко, которе подписано: Public key for pasting into OpenSSH authorized_keys file - это открытый (публичный) ключ. Выглядит он примерно так:

ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAsTACVR90XNY3T1YxB5kTsiU+Gmskn7N1qTgoqiwlc0cWA
/6YignCUogxf2sNC/EM8W0lgeJm8qpJf7yHNTryCotvafENcMm9sHcYXlGdn81SRXVh09QHM9tMwliyfE
x0xWMMjQd5l2j+q3VwzsVdjaCGM4VsiDpLKWxHyLy/3OLak1quE23bF2dGTDRD/XDwhGPvQCBLfgOt8YT
CkdU5aic9xGQNVbiphgFiGSqUohf/O9+WDxFuBiajCqPM8hcVUn77ZYSnMu93Q6Hpy4+gW5d/vre5kKUK
GviZ47TZq604AMi0GoQu6/kcVRuuZ5zdP1XhWy51ZdhfPYseH9mijQ== rsa-key-20140605

Эти символы нужно скопировать на удаленную машину в файл /home/user/.ssh/authorized_keys.

А ключем ко входу на удаленный сервер (закрытый ключ) будет файл, полученный Conversion->Export OpenSSH key, назовем его id_rsa_myserver. Закрытый ключ выглядит так:

    -----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAsTACVR90XNY3T1YxB5kTsiU+Gmskn7N1qTgoqiwlc0cWA/6Y
ignCUogxf2sNC/EM8W0lgeJm8qpJf7yHNTryCotvafENcMm9sHcYXlGdn81SRXVh
09QHM9tMwliyfEx0xWMMjQd5l2j+q3VwzsVdjaCGM4VsiDpLKWxHyLy/3OLak1qu
E23bF1dGTDRD/XDwhGPvQCBLfgOt8YTCkdU5aic9xGQNVbiphgFiGSqUohf/O9+W
DxFuBiajCqPM8hcVUn77ZYSnMu93Q6Hpy4+gW5d/vre5kKUKGviZ47TZq604AMi0
GoQu6/kcVRuuZ5zdP1XhWy51ZdhfPYseH9mijQIBJQKCAQEAgUyMFJppq4eQJSM4
iQEAiOq+naghpPiUIYnYfC4NfaKThl/XGJ9Wc5PRF8qop9lqT0+lv6U2Xg2PlJB+
V0awn+k1oFX1DR2YQoBrunLopQtzYx5OTngg7n1vXWNR0FN3zk8yrBo2ImFf5Ob/
Ssdf8bpUF8I6cT9LmsSjFfGFFs3Uh65zeKSn27ExA15qDueq1y3j9KdyjYh2Baod
AMTg32RSDAv6sxHLVSRhYMqYHR4a5Focpf55uWb3LimMV25olK0Lx/f1sfkYu/cZ
aSYh35ODcjfaVc4zlDnOS9wqke6DFLWNh7vA/pIjVIG5XA3M4VHJxZCRXXDQ8UUn
+v65LQKBgQDzx4WzkUDkzY1y0qaELrjyZ1LUT0OtiiEPDlOtjrND1Gou05fjOYlg
Gurh5MJWHZPXjtvRIvV9TJ2sRzDoeyzmRuJcY9kRP8ZDHmHzWb2vKxvUQPbEyNEs
3giYc74bIbExqQ4Qj6Cn8qDGPAoxbS/QkCPXPa7PVelBqraqTpZV4QKBgQC6EeXq
fgjz0OB9WH4k/KnuEqLPmB0T74/qMMM5HoXw1WL9UhEU7ed+oRQNuT+m9FFrHsEr
4rW7sfvc7HxTjVLiGfHatsAV2ViW/b3wESJtb+Dt4TuHNcxBOOykXVdB1PeLmioj
9s9FnH0cM3wpojQ2SwRUbZOcfOw4IkZGgsnKLQKBgQC4e1BsNpH5QZt5fNEKFYUK
d7RNo8SDU8X9jk0pZRIJ0S3CkkltrwAtDXN6g5n7+rUR0+SeQ/gLy0bjPMsQy+qg
bP5TwS6lRQS9K7+/E3rJv8IIaINkfEtEjFmIIDzWQwKiHxGP/f0JeVcSjkznIjIF
nYLoEwDUQQOLo8iA4YaGLQKBgA8WNTyGwnSiO7ci2culyJbDPaIhFx1KxnrFrvbL
H53nycGDMdFDuNLqdz9iDBR0rKfSD6mcwqCEDYCdjYo75CArnfz6D5MRn2YwP9Ux
0lvmegVzIICVqMcEnZDJTEObpV5Ym6INF7mJOpOVeMUa/VCCn3x3lljL280zNiFk
jObhAoGBANoMTOOoY/1p6cB5U6J637Xxbfys851rv2eRQswMv/zBpU4OR5iaCni9
I0Z4jqI9SaIcpBBuOc8bvcek5p7infN7NOtW9OeAisUp9wMJI3lqPmtIjVk30BTW
VH+F3qK85EpFlmkZcqgNPTTzkBarlW0JIbxXFyUze91jbLABEbJ1
-----END RSA PRIVATE KEY-----

Ключи нужно называть говорящими именами, особенно когда их много в хозяйстве. Так же нужно сохранить их локально, в надежное место (флешка?), оба ключа под одним именем, открытому ключу добавить расширение .pub, а закрытый оставить без расширения.

Comments !

blogroll

social