Протокол соединения RFC 4254 - работает поверх протокола аутентификации, позволяет использовать установленный безопасный канал для передачи нескольких потоков информации в обоих направлениях. Используется для работы в шелле, туннелирования трафика или копирования файлов.
В Debian OpenSSH представлен несколькими пакетами:
gw ~ # aptitude search openssh
...
i openssh-client - клиент протокола SSH, для защищённого удалённого доступа
i openssh-server - серверная часть протокола SSH, для защищённого удалённого доступа
основные - это openssh-server и openssh-client. При этом, последний чаще всего устанавливается вместе с системой. Итак, чтобыустановить ssh сервер в Debian Squeeze, достаточно выполнить команду:
Во время выполнения установки будут автоматически сгенерированы необходимые ключи шифрования (RSA и DSA), демон sshd будет добавлен в автозагрузку и запущен. На этом по большому счету, можно считать сервер SSH вполне работоспособным. Но настройки по умолчанию, не совсем корректны и безопасны.
OpenSSH в реализации Debian содержит следующие компоненты/команды:
ssh (/usr/bin/ssh)
Собственно, клиент ssh.
scp (/usr/bin/scp)
Клиент для удаленного копирования файлов по протоколу SSH.
sftp (/usr/bin/sftp)
FTP-подобный SSH клиент.
sshd (/usr/sbin/sshd)
Демон, собственно предоставляющий защищённый доступ к ресурсам.
sftp-server ( /usr/lib/openssh/sftp-server)
Отдельная реализация подсистемы SFTP (серверная часть). Обладает бОльшими возможностями, чем встроенная в sshd.
ssh-keygen (/usr/bin/ssh-keygen)
Генератор пар ключей.
ssh-keysign (/usr/lib/openssh/ssh-keysign)
Утилита для проверки ключей хостов. Задействуется при использовании аутентификации по хостам (аналогично rsh) вместо проводимой по умолчанию аутентификации по пользователям/паролям.
ssh-keyscan (/usr/bin/ssh-keyscan)
Вспомогательная утилита. Позволяет за считанные секунды собрать публичные ключи с других хостов.
ssh-agent (/usr/bin/ssh-agent)
Вспомогательная утилита. Поддерживает кэш закрытых ключей. Кэширование позволяет избегать частого ввода пароля для расшифровки ключей перед их использованием.
ssh-add (/usr/bin/ssh-add)
Вспомогательная утилита. Добавляет ключи в кэш ssh-agent.
Настройка клиента заключается в правке файлов (например с помощью редактора vim) /etc/ssh/ssh_config и ~/.ssh/config, при этом, последний имеет бОльший приоритет. Описание данного файла приведено в man (5) ssh_config. Чаще всего, настройки клиента нет необходимости изменять. Для того, чтобы удачно воспользоваться SSH клиентом по назначению, необходимо: иметь сервер с выполняющимся демоном sshd, иметь учетную запись на удаленной системе. В Debian наиболее часто используемый клиент, это утилита ssh (пакет openssh-client). Формат использования команды приведен в man ssh. Кратко, формат команды ssh имеет вид:
$ ssh [options] [user@]host [command]
Первая часть - это собственно команда ssh, далее возможны опции (например -p port задаст нестандартный порт), далее возможно указание имени пользователя от имени которого необходимо залогинется на удаленную систему. Если имя пользователя не указано, то соединение будет установлено от имени текущего пользователя. Далее идет обязательный параметр - DNS имя или IP удаленного хоста. Если осле имени хоста заданна какая-то команда, то эта команда будет выполнена и соединение будет разорвано, если команда не задана, то будет запущен интерпретатор.
При первоначальном подключении к серверу, ssh клиент выдает примерно следующее сообщение:
[root@proxy ~]# ssh 10.0.0.10
The authenticity of host '10.0.0.10 (10.0.0.10)' can't be established.
RSA key fingerprint is 30:77:af:cb:e9:1a:20:f4:58:0d:d7:7e:a0:07:89:53.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.0.0.10' (RSA) to the list of known hosts.
root@10.0.0.10's password:
Данное сообщение говорит нам, что мы подключаемся к неизвестному ранее хосту с RSA ключем, имеющим такой-то отпечаток и требуется подтверждение нашего подключения. При положительном ответе (yes), клиент добавляет публичный ключ сервера sshd(/etc/ssh/ssh_host_rsa_key.pub) в пользовательский файл ~/.ssh/known_hosts на локальном компьютере. Когда клиент соединяется с несколькими серверами в указанном файле может скопиться большое количество таких ключей. Для отслеживания принадлежности каждого ключа к каждому серверу, клиент добавляет к строке ключа IP сервера и тип шифрования.
Кроме указанного пользовательского файла для "известных
хостов
серверов" существует так же глобальный файл/etc/ssh/ssh_known_hosts. К глобальному файлу должны иметь доступ на чтение все пользователи и использовать информацию при подключении к какому-либо серверу, но на запись должен иметь право только пользователь root. Как разграничить права доступа к файлам. Давайте рассмотрим содержимое файла known_hosts на примере:
[root@proxy ~]# grep .10 .ssh/known_hosts
10.0.0.10 ssh-rsa AAAAB3NzkejbdPP1p3KEzrONUppLn4ICCyMAQDiK5coYST2/BH/\
+vBBXhlj1LZkZFFtdkxVvRBxPhm7pbqRAxij9u/vfEe62yaLncb567sZOm1YG/\
y4aYGB8IdjUkejbdPP1p3KEzrONUppLn4ICCyM54QUjLQ3V7l+PDK500tM4OpPg/\
qLaaAQfMkejbdPP1p3KEzrONUppLn4ICCyMGqU+5E0+aOKHg7rXC1lW7LXdI4kq\
JHgydysgaiD78cGR2KaurQr3Zz02me4CtS9uuLoBkv5b9LCbQdX6OWyGgwbyp14x\
Y9tWFny4E3VDSctaaO5ie6pUBzs3ica0wxErFc/+cyjvpXTxLU7nkNqdaWBjMkfCggz8tVJt
В примере строка намеренно разбита на несколько, но реально это одна строка. Кроме команды ssh в OpenSSH существует команда scp, которая по синтаксису очень похожа на cp, за тем исключением, что к пути копируемого объекта добавляются некоторые параметры:
$ scp [[user@]src_host:]\path\src\file [[user@]dst_host:]\path\dst\file
, где src_host - хост источник, \path\src\file - исходный копируемый объект, dst_host - хост назначения, \path\dst\file - файл назначения.
Алиасы для ssh клиента (~/.ssh/config)
С помощью конфигурационного файла пользователя можно сделать использование ssh клиента более удобным. Допустим, имеем мы некоторый глобальный файл /etc/ssh/ssh_config, задающий настройки для всех хостов (host *). При этом, имеем некоторый удаленный ssh сервер, у которого длинное имя (например 678-ssh-server.superdomen.com.ua) и нестандартный порт (например 65987), при этом, имя пользователя тоже довольно длинное (например, vasilii-ptrov). Вводить каждый раз команду подключения к серверу:
$ ssh -p 65987 vasilii-ptrov@678-ssh-server.superdomen.com.ua
жутко неудобно и долго. Давайте упростим себе жизнь. В файл ~/.ssh/config добавим следующую информацию:
Host server
User vasilii-ptrov
Port 65987
HostName 678-ssh-server.superdomen.com.ua
Все! теперь введя в консоли ssh server мы попадаем на нужный сервер, нужны порт под нужным пользователем. Или даже так ssh se<Tab>. Строка автоматически развернется в ssh server!
Другие клиенты SSH
Кроме стандартного linux-ssh-клиента существует и множество других, например для Windows есть отличная софтина PuTTy.
Сервер OpenSSH (sshd)
Настройка sshd заключается в правке файла (например с помощью редактора vim) /etc/ssh/sshd_config. Описание файла приведено вman (5) sshd_config. Ознакомившись с конфигом мы можем смело настроить сервер под свои нужны. Некоторые рекомендации и примеры приведены ниже. После правки sshd_config необходимо перезапустить сервер sshd:
root@debian:~# /etc/init.d/ssh restart
Restarting OpenBSD Secure Shell server: sshd.
В OpenSSH временно можно запретить любые подключения к серверу, кроме пользователя root. Для этого, необходимо создать файл /etc/nologin. при существовании данного файла, сервер sshd выводит его ~/.ssh/содержимое и не позволяе/strong/strongт произвести вход для любого пользователя кроме пользователя root.
Типы аутентификации OpenSSH
Аутентификация пользователя по паролю.
При данном типе аутентификации, настроек сервера sshd и клиента ssh по-умолчанию вполне достаточно. При аутентификации сначала производится обмен ключами между сервером и клиентом и хэш пароля передается серверу в зашифрованном виде. Далее производится обмен данными.
Данный тип аутентификации может избавить от ввода пароля при подключении к серверу. Аутентификация по публичному ключу основана на проверке соответствия публичного ключа клиента, который размещается на сервере и секретного ключа клиента (пользователя), который расположен у клиента (у пользователя в домашнем каталоге ~/.ssh/id_rsa ). Примерно так же, как клиент проверяет валидность сервера по публичному ключу сервера. Генерация пары ключей осуществляется утилитой ssh-keygen, после чего в каталоге пользователя образуется 2 ключа ~/.ssh/id_rsa - секретный и ~/.ssh/id_rsa.pub - публичный. Публичный ключпомещается на сервер под именем ~/.ssh/authorized_keys. После этого при подключении к серверу под пользователем, в каталогах которого лежат соответствующие ключи (на клиенте - ~/.ssh/id_rsa, на сервере - ~/.ssh/authorized_keys) - нет необходимости вводить пароль. В файле ~/.ssh/authorized_keys может последовательно содержаться несколько ключей для доступа к данному серверу под данным пользователем с нескольких серверов. Давайте рассмотрим практический пример настройки аутентификации по публичному ключу:
mc-sim@FILES:~$ ssh-keygen -t rsa -b 2048
Generating public/private rsa key pair.
(Генерация пары открытый/секретный rsa-ключей.)
Enter file in which to save the key (/home/mc-sim/.ssh/id_rsa):<Enter>
(Введите имя файла, в который будет сохранен ключ (путь по умолчанию))
Enter passphrase (empty for no passphrase):<Enter>
(Введите кодовую фразу (пусто, если фраза не используется):)
Enter same passphrase again:
(Повторите ввод фразы:)
Your identification has been saved in /home/mc-sim/.ssh/id_rsa.
(Ваша идентификационная информация сохранена в /home/mc-sim/.ssh/id_rsa.)
Your public key has been saved in /home/mc-sim/.ssh/id_rsa.pub.
(Ваш публичный ключ сохранен в файле /home/mc-sim/.ssh/id_rsa.pub.)
The key fingerprint is:
(Контрольная сумма ключа:)
fc:dd:1a:8d:2e:19:b2:36:63:fe:0a:e7:3c:85:a7:e8 mc-sim@FILES
The key's randomart image is:
(Случайное изображение ключа:)
+--[ RSA 2048]----+
| |
| |
| |
| . |
| S. |
| o.+. + |
| ...*.o+ o |
| .=O o. o |
| .E+=*..o |
+-----------------+
mc-sim@FILES:~$ # проверим созданные ключи
mc-sim@FILES:~$ ls -la .ssh/
итого 16
drwx------ 2 mc-sim mc-sim 4096 Фев 11 02:42 .
drwxr-xr-x 4 mc-sim mc-sim 4096 Фев 11 02:41 ..
-rw------- 1 mc-sim mc-sim 1675 Фев 11 02:42 id_rsa
-rw-r--r-- 1 mc-sim mc-sim 394 Фев 11 02:42 id_rsa.pub
mc-sim@FILES:~$ # скопируем наш публичный ключ на удаленный сервер
mc-sim@FILES:~$ scp .ssh/id_rsa.pub 10.0.0.6:/home/mc-sim/.ssh/authorized_keys
The authenticity of host '10.0.0.6 (10.0.0.6)' can't be established.
RSA key fingerprint is 8c:7b:98:51:2e:57:c9:53:54:aa:7d:bb:a6:92:c9:94.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.0.0.6' (RSA) to the list of known hosts.
mc-sim@10.0.0.6's password:
scp: /home/mc-sim/.ssh/authorized_keys: No such file or directory
(scp: /home/mc-sim/.ssh/authorized_keys: Нет такого файла или каталога)
mc-sim@FILES:~$ # создадим отсутствующий каталог
mc-sim@FILES:~$ ssh 10.0.0.6 mkdir /home/mc-sim/.ssh
mc-sim@10.0.0.6's password:
mc-sim@FILES:~$ # еще раз попробуем скопировать публичный ключ
mc-sim@FILES:~$ scp .ssh/id_rsa.pub 10.0.0.6:/home/mc-sim/.ssh/authorized_keys
mc-sim@10.0.0.6's password:
id_rsa.pub 100% 394 0.4KB/s 00:00
mc-sim@FILES:~$ # попробуем подключиться к удаленной системе (пароль запрошен не будет)
mc-sim@FIpLES:~$ ssh 10.0.0.6
Linux ARCHIV 3.0.0-1-486 #1 Sat Aug 27 15:56:48 UTC 2011 i686
The programs included with the Debian GNU/Linux sysptem are free software;
the exact distribution tessh-keysign (/usr/lib/openssh/ssh-keysign)rms for each program are described in theppp
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
You have new mail.
Last login: Fpri Nov 25 13:17:58 2011
mc-sim@ARCHIV:~$ logout
Connection to 10.0.0.6 closed.
Для указания типа шифрования ключа задан параметр -t, а так же параметр -b, задающий размер ключа в байтах. Эти опции использовать рекомендуется. Кроме того, при создании ключа запрашивается некая passphrase. Это пароль расшифровки секретного ключа, который (если его задать) будет запрошен при попытке подключения. Данная опция позволяет зашифровать секретный ключ на случай компроментации, что повышает безопасность, но сводит на нет все удобство входа без ввода пароля.
Так же, обязательно стоит отметить такой момент безопасности. В случае, если поломают вашу учетку (у которой имеется секретный ключ в домашнем каталоге) на текущем сервере, то злоумышленник автоматически получает доступ и к серверу, на котором лежит соответствующий публичный ключ. Так что будьте крайне бдительны!
В данном разделе используется метод шифрования RSA, но если во всех командах заменить RSA на DSA, то соответственно будет использован тип шифрования DSA.
Другие типы аутентификации (hostbsed, GSSAPI...)
Некоторые другие типы аутентификации, возможно, в скором времени будут дополнены. Но некоторые гарантированно не будут рассмотрены, т.к. - устаревшие. Например не будет рассмотрена hostbased-аутентификация, которая работает только с протоколом SSH1.
Безопасность SSH сервера
Ниже приведены некоторые советы, позволяющие по максимуму снизить возможность взлома Вашего сервера: