Безопасный сетевой протокол 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 серверу.
Синтаксис для простого подключения по протоколу 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
- Выводить отладочную информацию. Полезно для поиска ошибок в конфигурировании и отладки соединений.
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 очень обширна, экспериментируйте.
Комментарии
Отправить комментарий