{{tag>ssh shell generate authorized_keys authorized_keys id_rsa id_dsa unix linux}}

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

<code bash>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 
</code> 

  * **-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 =====

<code bash>$ ssh-copy-id -i ~/.ssh/id_rsa.pub root@remote-host</code>

  * remote-host - IP или DNS
  * -i указываем тип передаваемого ключа на удаленный хост (~/.ssh/id_rsa.pub или ~/.ssh/id_dsa.pub)
===== Альтернатива – скрипт ssh-copy-id =====

<code bash>  
#!/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!"
</code>

====== FAQ ======

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

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

<note tip>В свете недавно выявленных угроз, новая версия openssh-7.0p1 прекращает использование ключей ssh-dss , также известных как DSA. Детали см. в новостях проекта [[http://lists.mindrot.org/pipermail/openssh-unix-announce/2015-August/000122.html|openssh]].</note>
==== Отладка подключения ====

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

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

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

  ssh-keygen -R my-host.com
  