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

Опубликовано – 30.11.2009

Автор: Brian Hatch
Перевод: Сгибнев Михаил

 OpenSSH кроме паролей поддерживает еще несколько методов аутентификации. Он может быть сконфигурирован на использование методов PAM (Pluggable authentication modules), протокола Challenge/Response, Kerberos, аутентификации по доверенным хостам и такая экзотика как ключи X509. Но самым популярным является метод Identity/Pubkey.

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

 Вот некоторые из положительных моментов этого типа аутентификации:

  • Никто не сможет войти на сервер с Вашей учетной записью, так как им необходимо обладать приватным ключом и кодовой фразой.
  • Администратор сервера может вообще убрать пароль учетной записи, дабы исключить его дискредитацию.
  • Вы можете использовать утилиту ssh-agent и он будет предоставлять аутентификационные данные за Вас.
  • Вы можете устанавливать определенные ограничения, например запрещая перенаправление портов, выполнение
    определенных программ и т.д.

 В этой статье мы рассмотрим методу создания ключей и конфигурирование учетной записи.

Создание Identity/Pubkey

 В оригинальной реализации SSHv1 Вы могли создать Identity, которое было парой RSA публичного и приватного ключей. В SSHv2 формат этих ключей был изменен, стали поддерживаться ключи RSA и DSA, и эта аутентификация была переименована в Pubkey. В контексте данной статьи эти обозначения будут использоваться взаимозаменяемо, так как реализуют идентичные функции.

 С помощью утилиты 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. В первом файле хранится приватный ключ, защищенный кодовой фразой, введенной Вами при создании, НИКОМУ не давайте копаться в этом файле. Второй файл — Ваш публичный ключ, он не содержит никаких тайн и может быть доступен любому встречному-поперечному. В случае утраты он может быть восстановлен из приватного ключа.

Типы ключей SSH

 При создании ключей Вы указывали опцию -t rsa. Этим параметром мы указываем тип создаваемых ключей. Также возможно создать ключи rsa1, rsa или dsa. Рассмотрим их отличия:

Тип
Аргумент
Имя по умолчанию
Протокол
Пример заголовка
RSA1
-t rsa1
identity
SSH 1 protocol only
1024 35 118118225938285…
RSA
-t rsa
id_rsa
SSH 2 protocol only
ssh-dss AAAAB3nzaC1kc3M…
DSA
-t dsa
id_dsa
SSH 2 protocol only
ssh-rsa AAAAB3NzaC1yc2E…

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

Разрешение Identity/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

 Файл 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

 Прядок действий следующий: копируем публичный ключ RSA на сервер, используя scp или любой другой способ. Создаем файл authorized_keys, если каталога .ssh не существует — создаем. Добавляем публичный ключ RSA в файл authorized_keys. Проверяем, устанавливаем права доступа и выходим.




 Пришла пора проверить. что мы наваяли:

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 не будет опубликован. Обязательные поля помечены *


*