Безопасный сетевой протокол SSH, SSH клиент

Как было рассказано в статьях "Безопасный сетевой протокол SSH, особенности, основные функциональные возможности" и "Настройка сервера SSH во FreeBSD, файл sshd_config", SSH, представляет из себя не только защищенный сетевой протокол, но и набор программных средств для работы с ним. Так-же были рассмотрены основные принципы обеспечения безопасности при работе по протоколу SSH, возможные способы аутентификации, а так-же, вопросы настройки и запуска SSH сервера в операционной системе FreeBSD. Напомню, что программой сервером, в программном пакете OpenSSH, является демон SSHD.
Настало время поговорить о второй, так сказать, половинке модели клиент-сервер, то есть об SSH клиенте. Программой клиентом протокола SSH, является одноименная утилита, /usr/bin/ssh.

Настройка SSH клиента в операционной системе FreeBSD

Итак, SSH использует механизм публичных ключей для идентификации сервера, при подключении клиента. Ключ сервера передается клиенту при первом подключении и при последующих сверяется. В операционной системе FreeBSD, публичные ключи серверов хранятся в файле ~/.ssh/known_hosts.

SSH клиент может получать конфигурационные данные из нескольких источников и в следующем порядке:

  • Опции командной строки;
  • Пользовательский файл конфигурации, расположенный в домашнем каталоге пользователя, ~/.ssh/config
  • Общесистемный файл конфигурации /etc/ssh/ssh_config

Конфигурация по-умолчанию выглядит следующим образом:

# Host *
# ForwardAgent no
# ForwardX11 no
# RhostsRSAAuthentication no
# RSAAuthentication yes
# PasswordAuthentication yes
# HostbasedAuthentication no
# GSSAPIAuthentication no
# GSSAPIDelegateCredentials no
# BatchMode no
# CheckHostIP no
# AddressFamily any
# ConnectTimeout 0
# StrictHostKeyChecking ask
# IdentityFile ~/.ssh/identity
# IdentityFile ~/.ssh/id_rsa
# IdentityFile ~/.ssh/id_dsa
# Port 22
# Protocol 2,1
# Cipher 3des
# Ciphers aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,arcfour,aes192-cbc,aes256-cbc
# MACs hmac-md5,hmac-sha1,umac-64@openssh.com,hmac-ripemd160
# EscapeChar ~
# Tunnel no
# TunnelDevice any:any
# PermitLocalCommand no
# VersionAddendum FreeBSD-20080901

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

Конфигурационный файл клиента делится на блоки, директивой Host. В самой директиве Host, в качестве значения может стоять как один хост, так и целый список хостов, разделенных пробелами, к которым относится нижеидущий блок директив. Если в качестве имени хоста стоит подстановка "*", блок директив задает глобальные значения для всех хостов. Поскольку ssh использует первое полученное значение директивы, то глобальные параметры должны идти в конце файла, а параметры для конкретных хостов в начале. Возможно немного путано получилось. ), попробую на примере, выглядеть это будет как-то так:

Host 192.168.10.10 *.vds-admin.ru
.........
блок директив с необходимыми значениями для хостов совпадающих с шаблоном
.........
Данный блок действует на хост 192.168.10.10 и на все субдомены vds-admin.ru.
Далее идут глобальные значения
Host *
.........
блок глобальных директив с соответствующими значениями. Если какие-то директивы этих 2 блоков,
совпадают, то совпавшие директивы для хостов 192.168.10.10 и vds-admin.ru,
будут взяты из первого блока а те, которые не были описаны в первом блоке, будут взяты из глобальных значений.
.........

Перейдем к директивам:

Host
Данную директиву мы уже обсудили, она может принимать шаблон из одного хоста, списка хостов или подстановку "*". В качестве подстановок, в шаблоне, допустимо использовать "*" - любое количество, любых символов и "?" - один любой символ. Например шаблон может выглядеть так: *.vds-admin.ru или 192.168.1.?, что будет соответствовать, первый шаблон, любой поддомен, домена vds-admin.ru ( test.vds-admin.ru или boo.vds-admin.ru ), второй шаблон, диапазон адресов от 192.168.1.0 до 192.168.1.9.
ForwardAgent
Форвардинг вызовов к ssh-agent на удаленную машину. рекомендуется использовать только при необходимости и на доверенных системах.
По-умолчанию: "no".
ForwardX11
Данная директива определяет, будет ли ssh использовать передачу данных от удаленного сервера X11, через свой шифрованный канал связи, для защиты, небезопасных протоколов ( X11, pop, smtp, ftp ).
По-умолчанию "yes".
RhostsRSAAuthentication
Определяет, нужно-ли использовать rhosts аутентификацию совместно с RSAhost- аутентификацией.
Используется только для протокола SSH версии 1.
По-умолчанию; "no"
RSAAuthentication
Нужно-ли использовать RSA-аутентификацию. Используется для увеличения безопасности сессий. RSA использует пару из публичного и приватного ключей, генерируемых утилитой ssh-keygen.
Только для протокола версии 1.
По-умолчанию: "yes".
HostbasedAuthentication
Определяет, нужно-ли использовать rhosts аутентификацию совместно с аутентификацией по публичному ключу. Данная директива используется только для протокола SSH версии 2, аналог директивы RhostsRSAAuthentication
По-умолчанию: "no".
GSSAPIAuthentication
Директива включает GSSAPI аутентификацию. Только для протокола SSH версии 2.
По-умолчанию: "no".
GSSAPIDelegateCredentials
Форвардинг ( делегирование ) мандатов на сервер. Только для протокола SSH версии 2.
По-умолчанию: "no".
BatchMode
Пакетный режим, если включена, запрос пароля будет отключен. Полезна для использования в различных скриптах, использующих соединение по протоколу SSH.
По-умолчанию: "no".
CheckHostIP
Данная директива включает проверку IP адреса по файлу known_hosts. Позволяет SSH отловить изменение ключа при подделке DNS.
По-умолчанию: "no".
AddressFamily
Какое семейство адресов использовать для соединений.
Возможные значения: "any", "inet" ( для IPv4 ), "inet6" ( для IPv6 )
ConnectTimeout
Интервал времени отведенный на установление соединения SSH сервером, вместо использования стандартного таймаута TCP. Таймаут срабатывает только в случае недоступности удаленного сервера, но не в случае его отказа в соединении.
StrictHostKeyChecking
Определяет, добавлять-ли автоматически новые ключи компьютеров в файл ~/.ssh/known_host и отказывать-ли в соединении хостам, чей ключ был изменен. Данная директива обеспечивает максимальную защиту от троянов. Если данная опция установлена в "yes", пользователю придется вручную добавлять новые хосты. При значении "ask", сервер SSH, будет добавлять хосты в known_host, только после подтверждения пользователем, что он точно хочет это сделать и откажет в доступе, если ключ хоста будет изменен. Ключи хостов будут проверяться в любом случае.
Возможные значения: "yes", "no", "ask".
По-умолчанию: "ask".
IdentityFile
Определяет файлы для RSA и DSA аутентификации. В путях к файлам может использоваться "~",
для указания на домашнюю директорию а так-же следующие управляющие символы:
  • %d - локальная домашняя директория пользователя;
  • %u - имя локального пользователя;
  • %l - имя локального хоста;
  • %h - имя удаленного хоста;
  • %r - имя удаленного пользователя;

Значения по-умолчанию:

  • ~/.ssh/identity - для протокола SSH, версии 1.
  • ~/.ssh/id_rsa - RSA, для протокола SSH, версии 2
  • ~/.ssh/id_dsa - DSA, для протокола SSH, версии 2
Port
Порт удаленного сервера SSH, для подключения.
По-умолчанию: 22.
Protocol
Версия протокол для подключения. По-умолчанию стоит "2,1", что означает: если нет возможности использовать протокол SSH версии 2, подключиться по протоколу версии 1.
Cipher
В данной директиве перечислены алгоритмы шифрования для протокола SSH версии 1. Возможные значения: "blowfish", "3des" и "des". Имейте в виду, что использование протокола версии 1, не рекомендуется врачами и данная директива используется в основном ля совместимости со старыми системами, не поддерживающими протокол версии 2. Если вдруг у вас возникли трудности и система не поддерживает 3des, установите просто des.
По-умолчанию стоит алгоритм 3des.
Ciphers
Алгоритмы шифрования для протокола SSH версии 2, перечисленные в порядке предпочтения.
По-умолчанию:
aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,arcfour128,
arcfour256,arcfour,aes192-cbc,aes256-cbc,aes128-ctr,
aes192-ctr,aes256-ctr
MACs
В этой директиве перечислены алгоритмы MAC (message authentication code), используемые для защиты целостности данных в протоколе SSH, версии 2. Перечисленные алгоритмы используются в порядке следования.
По-умолчанию:
hmac-md5,hmac-sha1,umac-64@openssh.com,
hmac-ripemd160,hmac-sha1-96,hmac-md5-96
EscapeChar
Escape-символ, говорит, что следующие за ним символы, нужно воспринимать особым образом. При передаче двоичных данных, данный символ нужно устанавливать в значение "none".
По-умолчанию: "~".
Tunnel
Использовать-ли форвардинг для устройств tun. Возможные значения: "yes", "point-to-point" (уровень 3), "ethernet" (уровень 2), или "no". При значении "yes", запрашивается режим туннелирования по-умолчанию, то есть "point-to-point".
По-умолчанию "no".
TunnelDevice
Определяет устройства tun, на локальной машине и на удаленном сервере. Значения указываются в формате: local_tun[:remote_tun]. Устройство может быть назначено по цифровому ID или ключевым словом "any", если удаленное устройство не указано, оно по-умолчанию "any".
По-умолчанию: any:any.
PermitLocalCommand
Разрешить или нет локальное выполнение команд с помощью опции LocalCommand или Escape-последовательности !сommand, в ssh.
По-умолчанию: "no".
VersionAddendum
Строка добавляемая для идентификации операционной системы.
PreferredAuthentications
Возможные методы аутентификации по протоколу SSH 2, перечислены в порядке использования, самым первым идет самый предпочтительный.
По-умолчанию: hostbased,publickey,keyboard-interactive
PasswordAuthentication
Использовать проверку по паролю

По-умолчанию "yes"

BindAddress
В качестве значения, устанавливается адрес, который SSH, будет использовать как адрес источника при соединении, полезна, если машина имеет более одного IP адреса. Не работает при включенной директиве UsePrivilegedPort
ChallengeResponseAuthentication
Разрешить использовать аутентификацию "вызов-ответ".
По-умолчанию: "no".

На самом деле многие директивы конфигурации клиента SSH, схожи с аналогичными директивами конфигурации SSH сервера, программы SSHD. Это далеко не полный список директив конфигурационного файла, программы ssh, остальные можно посмотреть с помощью man ssh_config.

Использование SSH клиента для подключения к удаленному SSH серверу.

Синтаксис для простого подключения по протоколу SSH, используя стандартную программу-клиент ssh, в операционной системе FreeBSD, следующий:

vds-admin /# ssh 192.168.50.50

В таком варианте, ssh, просто подключается к удаленному хосту с текущим именем пользователя. Кроме того, можно явно указать имя пользователя, с правами которого нужно войти в удаленную систему:

vds-admin /# ssh user@192.168.50.50 
Password:

Если на учетной записи, с которой вы подключаетесь, установлен пароль, будет выведен соответствующий запрос.
Имя пользователя, да и не только, может быть настроено в файле конфигурации ssh. Например, у нас есть удаленный хост с адресом 192.168.50.50, есть пользователь "user", удаленный SSH сервер, принимает соединения на нестандартном порту 2222, для указания удаленного порта подключения из командной строки, используется опция "-p номер порта". Команда для подключения будет следующей:

vds-admin /# ssh user@192.168.50.50 -p 2222 
Password:
или можно так, ключ "-l имя", так-же позволяет указать имя пользователя явно:
vds-admin /# ssh -l user 192.168.50.50 -p 2222
Password:

Теперь подправим файл конфигурации, добавив секцию Host для нашего удаленного сервера, в начало файла , со следующими директивами:

---------------------------- блок директив для хосте 192.168.50.50 --------------------------------
Host 192.168.50.50
User user
Port 2222
Protocol 2
--------------------------- блок директив для хосте 192.168.50.50 --------------------------------
------------------ глобальный блок директив для всех остальных хостов ----------------------
Host *
...........
блок глобальных директив
..........
------------------ глобальный блок директив для всех остальных хостов ----------------------

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

vds-admin /# ssh 192.168.50.50 

Мы сразу получим приглашение ввести пароль пользователя user и регистрируемся на удаленном сервере.

SSH клиент, опции командной строки, форвардинг портов.

Программа SSH клиент, имеет довольно немаленький список опций, которые можно использовать в командной строке, посмотреть этот список, можно как обычно man ssh. Здесь мы рассмотрим лишь некоторые, использующиеся наиболее часто, в том числе и уже упомянутые ранее.

-l имя_пользователя
Задает имя пользователя для подключения к серверу SSH. Есть еще один формат записи, чуть выше я упоминал его, user@remote_host. Они эквивалентны.
-p номер порта
Данная опция задает номер порта удаленного сервера, на который нужно подключиться. Может быть определена в конфигурационном файле клиента SSH.
-f
После успешной регистрации, переходить в фоновый режим работы.
-g
Разрешить удаленным хостам, подключаться к портам используемым для форвардинга.
-L local_port:host:remote_port
Выполняет форвардинг локального порта local_port на порт remote_port, удаленного хоста.
-R local_port:localhost:remote_port
Выполняет форвардинг удаленного порта remote_port на локальный порт local_port.
-N
Не выполнять никаких команд на удаленном хосте. Опция часто используется для простого форвардинга портов.
-w local_tun:remote_tun
Организация туннеля между устройствами tun, локальной и удаленной машины через SSH. Устройство может быть назначено по ID, или ключевым словом "any". Если удаленное устройство не назначено явно, параметр автоматически принимает значение "any", и подключается к первому свободному устройству на удаленном хосте.
-v
Выводить отладочную информацию. Полезно для поиска ошибок в конфигурировании и отладки соединений.

Полный список опций командной строки, программы SSH, можно получить все там-же man ssh

Приведу несколько простых примеров форвардинга портов.
Итак, у нас есть host1, IP адрес 192.168.50.20 и host2, IP адрес 192.168.50.50. На машине host1, на 81 порту, крутится веб сервер apache.

host1 /# netstat -Lan 
Current listen queue sizes (qlen/incqlen/maxqlen)
Proto Listen Local Address
tcp4 0/0/10 127.0.0.1.25
tcp4 0/0/128 192.168.50.20.2222
tcp4 0/0/128 192.168.50.20.81 Наш веб сервер 
tcp4 0/0/128 127.0.0.1.8080

Вывод утилиты netstat, второго хоста выглядит сейчас так:

host2 /# netstat -Lan
Current listen queue sizes (qlen/incqlen/maxqlen)
Proto Listen Local Address
tcp4 0/0/128 192.168.50.50.2222
tcp4 0/0/10 127.0.0.1.25
tcp4 0/0/128 127.0.0.1.80
tcp4 0/0/50 *.3306

Проверим, что на машине host2, на порту 81 именно Веб сервер, и на сайте лежит некий HTML документ index.html, для простоты восприятия, содержащий одну строку. Используя nc ( netcat ), запросим методом GET индексный файл ( так-же можно воспользоваться программой telnet, на что должно быть выведено содержимое файла index.html.

host1 /# nc 192.168.50.20 81
GET /index.html
IP 192.168.50.20 -- Port 81

Теперь сделаем форвардинг локального порта 81 на порт 8008, удаленной машины.

host1 /# ssh -N -f -R 8008:192.168.50.20:81 192.168.50.50 -p 2222 

Смотрим командой netstat, состояние портов на удаленной машине host2

host2 /# netstat -Lan
Current listen queue sizes (qlen/incqlen/maxqlen)
Proto Listen Local Address
tcp4 0/0/128 127.0.0.1.8008 Появился дополнительный сокет 8008
tcp6 0/0/128 ::1.8008
tcp4 0/0/128 192.168.50.50.2222
tcp4 0/0/10 127.0.0.1.25
tcp4 0/0/128 127.0.0.1.80
tcp4 0/0/50 *.3306

Ну и теперь пробуем подключится к нему программой nc, и отправить GET запрос к файлу index.html

host2 /# nc 127.0.0.1 8008
GET /index.html
IP 192.168.50.20 -- Port 81

Как видите мы получили все тот-же документ, лежащий на сайте, сервера host1, с которого мы делали форвардинг. По сути теперь, на машине host2, на 8008 порту, находится веб сервер, расположенный на машине host1

С ключом -L, получается немного другой вариант, мы создаем локальный сокет, и цепляем его на локальный порт удаленной машины. Вводные практически те-же, 2 хоста с теми-же адресами, добавим только, что на машине host2, тоже крутится веб-сервер, и на его сайте лежит простенький index.html. Проверяем netstat, host1 и host2:

host1 /# netstat -Lan 
Current listen queue sizes (qlen/incqlen/maxqlen)
Proto Listen Local Address
tcp4 0/0/10 127.0.0.1.25
tcp4 0/0/128 192.168.50.20.2222
tcp4 0/0/128 192.168.50.20.81 
tcp4 0/0/128 127.0.0.1.8080
----------------------------------------------------------
host2 /# netstat -Lan
Current listen queue sizes (qlen/incqlen/maxqlen)
Proto Listen Local Address
tcp4 0/0/128 192.168.50.50.80 веб сервер с сайтом на машине host2
tcp4 0/0/128 192.168.50.50.2222
tcp4 0/0/10 127.0.0.1.25
tcp4 0/0/128 127.0.0.1.80
tcp4 0/0/50 *.3306

Теперь все на том-же host1, делаем перенаправление портов:

host1 /# ssh -N -f -L 8008:192.168.50.50:80 192.168.50.50 -p 2222 

и проверяем доступность веб страницы с файлом index.html

host1 /# nc 127.0.0.1 8008
GET /
host 192.168.50.50 port 80

Вот так в общем-то это и работает. Некоторую информацию по настройке туннелей через устройства tun, можно почитать в Unix ToolBox- VPN через SSH.

В дополнение, позволю себе привести пример с почтовым сервером, описанный в HendBook'e.

host /# ssh -2 -N -f -L 5025:localhost:25 ]]>user@mailserver.example.com]]>
user@mailserver.example.com's password: *****
host /# telnet localhost 5025
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 mailserver.example.com ESMTP

Здесь делается форвардинг удаленного порта 25 ( SMTP ), на локальный порт 5025, к которому затем, можно подключится локально, с помощью telnet.

Ну и еще один пример, подключение в серверу POP3, через промежуточный SSH сервер. Подключаться будем с машины host1, через машину host2.

host1 /# ssh -N -f -L 44444:some.mailserver.ru:110 192.168.50.50 -p 2222

host1 /# netstat -Lan 
Current listen queue sizes (qlen/incqlen/maxqlen)
Proto Listen Local Address
tcp4 0/0/128 127.0.0.1.44444
tcp6 0/0/128 ::1.44444
tcp4 0/0/10 127.0.0.1.25
tcp4 0/0/128 192.168.50.20.2222
tcp4 0/0/128 192.168.50.20.81 
tcp4 0/0/128 127.0.0.1.8080

Подключаемся к локальному порту 44444, который на самом деле ведет через host2, на почтовый сервер some.mailserver.ru, порт 110.
vds-admin /root# nc 127.0.0.1 44444
+OK Dovecot ready.
user admin
+OK
pass blablabla
-ERR Authentication failed.

Тема SSH очень обширна, экспериментируйте.

Комментарии

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
Регистр имеет значение
   .oooooo.                             oooooooooo.          .o     .o88o. 
d8P' `Y8b `888' `Y8b .d88 888 `"
888 oooo ooo .ooooo. 888 888 .d'888 o888oo
888 `88. .8' d88' `88b 888 888 .d' 888 888
888 ooooo `88..8' 888ooo888 888 888 88ooo888oo 888
`88. .88' `888' 888 .o 888 d88' 888 888
`Y8bood8P' `8' `Y8bod8P' o888bood8P' o888o o888o


Введите код, изображенный в стиле ASCII-арт.