Документация по ОС FreeBSD Суббота, 04.05.2024, 01:58
Приветствую Вас Гость | RSS
Меню сайта

Категории каталога
Apache [58]
DNS [25]
FTP [27]
Mail [74]
Samba [24]
Squid [46]
SSH [23]
VPN [35]
РРР [20]
Net [173]

Главная » Статьи » Сеть » SSH

Аутентификация на SSH сервере с использованием ключей
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.


 
Автор: Brian Hatch | перевод: Сгибнев Михаил
Категория: SSH | Добавил: oleg (11.11.2007)
Просмотров: 1672 | Рейтинг: 0.0/0 |
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Форма входа

Beastie

Друзья сайта

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
links

Copyright MyCorp © 2024