Генерация ключа / ssh-gen

ssh-keygen -t rsa -C "admin@d7.debian.loc" ssh-keygen -t dsa -C "admin@d7.debian.loc" $ cat ~/.ssh/id_rsa.pub | ssh user@hostname "cat >> ~/.ssh/authorized_keys" $ ssh user@hostname $ sudo sed -i "s/^\#RSAAuthentication.*$/RSAAuthentication yes/g" /etc/ssh/sshd_config $ sudo sed -i "s/^\#PubkeyAuthentication.*$/PubkeyAuthentication yes/g" /etc/ssh/sshd_config $ sudo /etc/init.d/sshd restart

-b - 2048, 4096

Генерация ключа локально

Ключи находятся в каталоге ~/.ssh:

$ ls -al ~/.ssh/
drwx------ 6 ctrld staff 204 Oct 23 17:39 .
drwxr-xr-x+ 40 ctrld staff 1360 Oct 22 21:01 ..
-rw-r--r-- 1 ctrld staff 78 Sep 26 20:02 config
-rw------- 1 ctrld staff 668 Oct 23 17:39 id_dsa
-rw-r--r-- 1 ctrld staff 626 Oct 23 17:39 id_dsa.pub
-rw-r--r-- 1 ctrld staff 2410 Oct 13 11:44 known_hosts

Если каталог .ssh отсутствует, то достаточно попытаться зайти куда-нибудь по ssh. Если файлов id_dsa.* (я использую DSA, но можно и RSA) нет, то их нужно сгенерировать. Во время генерации ssh-keygen спросит passphrase (можно просто нажать Enter и она при входе не будет спрашиваться).

$ ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/Users/ctrld/.ssh/id_dsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/ctrld/.ssh/id_dsa.
Your public key has been saved in /Users/ctrld/.ssh/id_dsa.pub.
The key fingerprint is:
e3:9a:18:f0:4c:6e:3e:44:8f:d3:a3:cc:c2:db:e0:b5 ctrld@129-149-179-94.pool.ukrtel.net
The key's randomart image is:
+--[ DSA 1024]----+
| |
| |
| |
| . |
| ...+ S |
| *+ +. . |
| ..+Bo .. |
| .o*=+ o |
| ooE.o |
+-----------------+

Если вы предпочитаете RSA, то:

$ ssh-keygen -t rsa

Копируем строку с публичным ключом – он нам понадобится на удалённом компьютере (remote, а не removed :)

Для DSA:

$ cat ~/.ssh/id_dsa.pub
ssh-dss AAAAB3............Pbec= ctrld@hostname.local

Для RSA:

$ cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3............IJAw== ctrld@hostname.local

Действия на удалённом компьютере

Конечно же, на удалённом сервере должен быть запущен SSH-сервер. Обычно это OpenSSH, но встречаются и недобитые динозавры с коммерческими SSH-серверами (это вызывает моё искреннее удивление – да, есть и такое).

Заходим на удалённый сервер:

$ ssh hg.mirocow.com@remote.net

Проверяем, есть ли каталог .ssh:

$ ls -al ~/.ssh

Если его нет, то делаем простой трюк – “ssh hg.mirocow.com@localhost”, и .ssh создаётся автоматически.

Редактируем файл с публичными ключами, и добавляем соответствующий скопированный ключ.

Для DSA (authorized_keys):

$ vi ~/.ssh/authorized_keys

Вариант:

$ echo "ssh-dss AAAAB3............Pbec= ctrld@hostname.local" >> ~/.ssh/authorized_keys

Для RSA (authorized_keys):

$ vi ~/.ssh/authorized_keys

Сохраняем файл, и (!) обязательно меняем права доступа на 0600, иначе файл публичных ключей не будет восприниматься:

$ chmod 600 ~/.ssh/authorized_keys*

Выходим с удалённого компьютера и пытаемся зайти на него снова по ssh. Если всё было сделано правильно, то будет запрошен passphrase, а если он был пустой, то будет произведён вход без запроса.

Убеждаемся что права на папку .ssh даны от пользователя hg.mirocow.com

$ ls -la
drwxr-xr-x 7 hg.mirocow.com hg.mirocow.com 4096 2011-10-11 01:17 .
drwxr-xr-x 4 root root 4096 2011-10-07 22:04 ..
drwx------ 2 hg.mirocow.com root 4096 2011-10-11 01:19 .ssh

$ ls -la
drwx------ 2 hg.mirocow.com root 4096 2011-10-11 01:19 .
drwxr-xr-x 7 hg.mirocow.com hg.mirocow.com 4096 2011-10-11 01:17 ..
-rw-r--r-- 1 root root 434 2011-10-11 03:01 authorized_keys

Копирование ключа на удаленный хост ssh-copy-id

$ ssh-copy-id -i ~/.ssh/id_rsa.pub root@remote-host

remote-host - IP или DNS

-i указываем тип передаваемого ключа на удаленный хост (~/.ssh/id_rsa.pub или ~/.ssh/id_dsa.pub)

Альтернатива – скрипт ssh-copy-id

#!/bin/sh KEY="$HOME/.ssh/id_dsa.pub" if [ ! -f ~/.ssh/id_dsa.pub ];then echo "private key not found at $KEY" echo "* please create it with "ssh-keygen -t dsa" *" echo "* to login to the remote host without a password, don't give the key you create with ssh-keygen a password! *" exit fi if [ -z $1 ];then echo "Please specify user@host.tld as the first switch to this script" exit fi echo "Putting your key on $1... " KEYCODE=`cat $KEY` ssh -q $1 "mkdir ~/.ssh 2>/dev/null; chmod 700 ~/.ssh; echo "$KEYCODE" >> ~/.ssh/authorized_keys; chmod 644 ~/.ssh/authorized_keys" echo "done!"

FAQ

У меня работает авторизация по ключам, но как сделать не возможным подключение по паролям?

ChallengeResponseAuthentication no

Не принимаются dsa ключи

В свете недавно выявленных угроз, новая версия openssh-7.0p1 прекращает использование ключей ssh-dss , также известных как DSA. Детали см. в новостях проекта openssh.

Отладка подключения

ssh -vvv -o PreferredAuthentications=publickey name@host -p port

-o PreferredAuthentications=publickey - опции аунтефикации

Удаления ключа из known_hosts

ssh-keygen -R my-host.com