Генерация ключа / 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 $ sudosed-i"s/^\#RSAAuthentication.*$/RSAAuthentication yes/g"/etc/ssh/sshd_config $ sudosed-i"s/^\#PubkeyAuthentication.*$/PubkeyAuthentication yes/g"/etc/ssh/sshd_config $ sudo/etc/init.d/sshd restart
- -b - устанавливает количество бит в ключе/длина ключа 2048, 4096
- -t - Тип сгенерированного ключа (доступно: rsa, dsa etc)
- -c - Комментарий к кдючу
Генерация ключа локально
Ключи находятся в каталоге ~/.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 ];thenecho"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! *"exitfi if[-z$1];thenecho"Please specify user@host.tld as the first switch to this script"exitfi 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 ключи
Отладка подключения
ssh -vvv -o PreferredAuthentications=publickey name@host -p port
- -o PreferredAuthentications=publickey - опции аунтефикации
Удаления ключа из known_hosts
ssh-keygen -R my-host.com