Как было рассказано в статьях "Безопасный сетевой протокол 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 очень обширна, экспериментируйте.