Аутентификация на SSH сервере с помощью ключей

Подключаясь к SSH серверу есть возможность использовать для авторизации использовать пару приватный/публичный ключ вместо логин пароль.

В данной статье описано, как создать приватный и публичный ключ, а также настроить OpenSSH сервер для использования ключа вместо пароля.

Создание приватного и публичного ключа

Приватный и публичный ключи, которые в дальнейшем будут использоваться для авторизации, можно создать с помощью ssh-keygen:


mydesktop$ ssh-keygen -t rsa
  Generating public/private rsa key pair.
  Enter file in which to save the key (/home/xahria/.ssh/id_rsa):
  Enter passphrase (empty for no passphrase): (enter passphrase)
  Enter same passphrase again: (enter passphrase)
  Your identification has been saved in /home/xahria/.ssh/id_rsa.
  Your public key has been saved in /home/xahria/.ssh/id_rsa.pub.
  The key fingerprint is:
  2c:3f:a4:be:46:23:47:19:f7:dc:74:9b:69:24:4a:44 xahria@mydesktop

mydesktop$ cd $HOME/.ssh
mydesktop$ ls -l
  -rw-------    1 xahria   hatchclan   883 Jan 21 11:52 id_rsa
  -rw-r--r--    1 xahria   hatchclan   223 Jan 21 11:52 id_rsa.pub

mydesktop$ cat id_rsa
  -----BEGIN RSA PRIVATE KEY-----
  MIICWgIBAAKBgQCc+1oixZ/g84gpZH0NeI+CvVoY5O0FOCSpFCbhUGJigQ6VeKI5
  gpOlDztpJ1Rc+KmfZ2qMaftwwnLmefhk1wPcvfZvvLjfdmHY5/LFgDujLuL2Pv+F
  7tBjlyX9e9JfXZau2o8uhBkMbb3ZqYlbUuuoCAnUtL5uZUiiHM0BAtnGAd6epAYE
  gBHw1xnqsy+mzbuWdLEVF7crlUSsctwGapb6/SEQgEXFm0RITQ3jCY808NjRS3hW
  Z+uCCO8GGUsn2bZpcGXa5vZzACvZL8epJoMgQ4D0T50rAkEA0AvK4PsMF02Rzi4E
  mXgzd1yCa030LYR/AkApG1KT//9gju6QCXlWL6ckZg/QoyglW5myHmfPR8tbz+54
  /lj06BtBA9iag5+x+caV7qKth1NPBbbUF8Sbs/WI5NYweNoG8dNY2e0JRzLamAUk
  jK2TIwbHtE7GoP/Za3NTZJm2Ozviz8+PHPIEyyt9/kzT0+yo3KmgsstlqwIBIwKB
  XdBh42izEWsWpXf9t4So0upV1DEcjq8CQQDEKGAzNdgzOoIozE3Z3thIjrmkimXM
  J/Y3xQJBAMEqZ6syYX/+uRt+any1LADRebCq6UA076Sv1dmQ5HMfPbPuU9d3yOqV
  j0Fn2H68bX8KkGBzGhhuLmbrgRqr3+SPM/frUj3UyYxns5rnGspRkGB3AkALCbzH
  9EAV8Uxn+Jhe5cgAC/hTPPdiwTJD7MpkNCpPuKRwrohytmNAmtIpKipAf0LS61np
  wtq59ssjBG/a4ZXNn32n78DO0i6zVV5vwf8rv2sf
  -----END RSA PRIVATE KEY-----

mydesktop$ cat id_rsa.pub
    ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAcMJy5nn4ZNcD3L32b7y433Zh2IEAnPt
    aIsWf4POIKWR9DXiPgr1aGOTtBTgkqRQm4VBiYoEOlXiiOYKTpQ87aSdUXPipn
    2dqjGn7OfyxYA7oy7i9j7/hYytkyMGx7ROxqD/2WtzU2SZtjs74s/PjxzyBMsr
    ff5M09PsqNypoLLLZas= xahria@mydesktop

Обратите внимание, что ‘ssh-rsa…xahria@mydesktop’ это одна строка, а не несколько.

ssh-keygen создал два файла: id_rsa и id_rsa.pub. В первом файле хранится приватный ключ, защищенный кодовой фразой, введенной при создании. Этот ключ никогда не должен передаваться кому-либо. Файл id_rsa.pub — публичный ключ. Публичный ключ вы передаете тому, кто должен иметь возможность проверить вашу подпись. В данном случае мы будем размещать публичный ключ на сервере, доступ к которому нам нужен.

Название файла можно изменить, используя опцию -f filename. Если Вы не определили имя файла, то ключи будут записаны в каталог $HOME/.ssh/ с именем id_rsa

Включение Pubkey аутентификации на сервере

После того, как мы создали ключи, необходимо разрешить данный тип аутентификации на сервере SSH. Сначала определим тип аутентификации — Pubkey или Identity, установив следующие настройки в sshd_config:

# Should we allow Identity (SSH version 1) authentication?
RSAAuthentication yes

# Should we allow Pubkey (SSH version 2) authentication?
PubkeyAuthentication yes

# Where do we look for authorized public keys?
# If it doesn't start with a slash, then it is
# relative to the user's home directory
AuthorizedKeysFile    .ssh/authorized_keys

Приведенные выше значения разрешают аутентификацию Identity/Pubkey для протокола SSH версии 1 и 2, и проверяют наличие публичных ключей в файле $HOME/.ssh/authorized_keys.

Проверьте наличие этих строк в файле конфигурации sshd_config (обычно он находится в каталоге /etc/ssh/), при необходимости добавьте и перезапустите сервис.

Добавление на сервер публичного ключа

Прядок действий следующий:

  • Создаем файл authorized_keys в каталоге ~/.ssh.
  • Добавляем публичный ключ RSA в конец файла authorized_keys.
  • Проверяем, устанавливаем права доступа и выходим. 

Содержимое файла authorized_keys

Файл authorized_keys просто содержит список ключей, по одному в строке. В него мы и пропишем ключ, сгенерированный на своей машине.

# Copy the RSA Pubkey to the server using scp.
# You can use any method you like, including using
# copy/paste if it's convenient.
mydesktop$ cd $HOME/.ssh
mydesktop$ scp id_rsa.pub ssh-server:id_rsa_mydesktop.pub
xahria@ssh-server's password: (enter password)

# Now let's log in and create the authorized_keys file
mydesktop$ ssh ssh-server
xahria@ssh-server's password: (enter password)

# Create the .ssh dir if it doesn't already exist
ssh-server$ mkdir .ssh
ssh-server$ chmod 700 .ssh
ssh-server$ cd .ssh

# Concatenate the RSA Pubkey we just uploaded to
# the authorized_keys file.  (This will create
# if it doesn't already exist.)
ssh-server$ cat ../id_rsa_mydesktop.pub >> authorized_keys

# Let's check out the file
ssh-server$ cat authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAcMJy5nn4ZNcD3L32b7y433Zh2IEAnPt
  aIsWf4POIKWR9DXiPgr1aGOTtBTgkqRQm4VBiYoEOlXiiOYKTpQ87aSdUXPipn
  2dqjGn7OfyxYA7oy7i9j7/hYytkyMGx7ROxqD/2WtzU2SZtjs74s/PjxzyBMsr
  ff5M09PsqNypoLLLZas= xahria@mydesktop

# Make sure permissions are paranoid
ssh-server$ chmod 600 authorized_keys

# Excellent, let's log out.
ssh-server$ exit

Можно проверить. что все работает:

mydesktop$ ssh ssh-server
Enter passphrase for key '/home/xahria/.ssh/id_rsa':

Ваш SSH клиент сначала попробует пройти аутентификацию по Pubkey/Identity, а в случае неудачи — идентификацию по паролю. Он будет искать ключ в именах файлов, заданных по умолчанию, если Вы не указали ключа явно.

Как происходит процесс подключения по шагам:

  • /usr/bin/ssh соединяется с сервером на порт SSH
  • Клиент и сервер обмениваются ключами, определяется алгорит м шифрования
  • Клиент ищет файлы, по умолчанию испрользуемые Pubkey/Identity
  • Если один из таких файлов был найден, то посылается публичный ключ на сервер и запрашивается аутентификация по этому ключу
  • Сервер проверяет файл authorized_keys пользователя на наличие публичного ключа и посылает клиенту последовательность, зашифрованную открытым ключом . Если приватный ключ защищен кодовым словом, то /usr/bin/ssh просит его ввести для дешифровки приватного ключа.
  • Клиент расшифровывает посланную последовательность для подтверждения правильности публичного и приватного ключей
  • Если расшифровка удалась, то сервер пускает клиента без запроса пароля Unix
  • Если клиент не может доказать, что это имеет ключ, то он может предложить другие ключи
  • При отсутствии корректных ключей пользователю будет предложено авторизоваться с помощью авторизации Unix

Все это проходит незаметно для пользователя. Если Вы хотите наблюдать за фазами соединения, то используйте ключ -v:

mydesktop$ ssh ssh-server
OpenSSH_3.8.1p2, SSH protocols 1.5/2.0, OpenSSL 0x009060cf
...
debug1: identity file /home/xahria/.ssh/identity type 0
debug1: identity file /home/xahria/.ssh/id_rsa type 1
debug1: Remote protocol version 1.99, remote software version OpenSSH_3.7.1p2
...
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey,password,keyboard-interactive
debug1: Next authentication method: publickey
debug1: Offering public key: /home/xahria/.ssh/id_rsa
debug1: Server accepts key: pkalg ssh-rsa blen 149 lastkey 0x601d0 hint 1
debug1: PEM_read_PrivateKey failed
debug1: read PEM private key done: type 
Enter passphrase for key '/home/xahria/.ssh/id_rsa': (Enter wrong passphrase)

debug1: PEM_read_PrivateKey failed
debug1: Next authentication method: keyboard-interactive
debug1: Authentications that can continue: publickey,password,keyboard-interactive
debug1: Next authentication method: password
xahria@ssh-server's password:  (Enter Unix password)

Для наглядности, в этом примере мы вводим неправильное кодовое слово для дешифровки приватного ключа. Также Вы можете заметить, что были найдены файлы identity и id_rsa, хотя они могут использоваться только с SSHv2.

Выбор ключей

Если Вы имеете один ключ для каждого типа, то вы можете использовать стандартные имена файлов и ssh-клиент самостоятельно найдет их и использует, но может так случиться, что Вы используете для аутентификации разные файлы:

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

Определить используемый ключ можно с помощью опции -i private_key_file:

mydesktop$ ssh -i ~/.ssh/special_ssh_key  ssh-server
Enter passphrase for key '/home/xahria/.ssh/special_ssh_key':

Следущая опция создаст в Вашем ~/.ssh/config указание на отображение еспользуемого ключа:

mydesktop$ cat ~/.ssh/config
 Host ssh-server
 IdentityFile ~/.ssh/special_ssh_key

mydesktop$ ssh ssh-server
Enter passphrase for key '/home/xahria/.ssh/special_ssh_key':

Обратите внимание, что переменная config всегда равна IdentityFile, независимо от того, используется Pubkey или Identity.

Безопасность кодовой фразы

Ваши приватные ключи могут и должны шифроваться кодовой фразой, так как это оберегает Ваш ключ от компрометации. Даже если Вы установили соответствующие права доступа, но не защитили ключь кодовой фразой, без всяких проблем полюбоваться Вашим ключом сможет пользователь root. Так что не спускайте на тормозах это дело.

authorized_keys2

Старые версии OpenSSH использовали два различных публичных ключа для доступа к серверу — authorized_keys для Identities (SSHv1) и authorized_keys2 для Pubkeys (SSHv2). Позже было решено, что это глупо и теперь используется один файл для ключей всех типов, но при отсутствии подходящего ключа будет проверен и authorized_keys2. Более поздние версии OpenSSH могут вполне прекратить поддерживать authorized_keys2 вовсе.

Чтобы не думать об этом ограничении, создадим жесткую ссылку authorized_keys2 на файл authorized_keys.

ssh-server$ cd .ssh
ssh-server$ ls -l
-rw-------    1 xahria   hatchclan   883 Jan 21 11:52 authorized_keys

# make a hard link so they are the same file, just different
# file names.
ssh-server$ ln authorized_keys authorized_keys2

ssh-server$ ls -l
-rw-------    2 xahria   hatchclan   883 Jan 21 11:52 authorized_keys
-rw-------    2 xahria   hatchclan   883 Jan 21 11:52 authorized_keys2

Так мы удовлетворим потребности любой версии OpenSSH.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *