SSH

В повседневной деятельности пользователя можно выделить два вида деятельности - запуск программ (возможно с перенаправлением ввода вывода) и операции с файлами. На настоящий момент самым популярным протоколом запуска программ является протокол ssh, а для передачи файлов используются построенные на его основе команды scp и sftp.

Протокол ssh использует шифрование трафика, что обеспечивает защиту от перехвата паролей и передаваемых данных.

В состав комплекса входят клиентские программы ssh - аналог telnet и rsh, scp - аналог rcp и sftp - программа внешне похожая на ftp по защищенному каналу. Несмотря на похожесть этих программ на своих предшественников, они используют другие протоколы, разработанные заново для исправления архитектурных ошибок, выявленных в их предшественниках.

Cервер OpenSSH в большинстве дистрибутивов устанавливается по умолчанию. Необходимо только подогнать настройки под свои нужды.

Конфигурационные файлы хранятся в каталоге /etc/ssh

  • /etc/ssh/sshd_config конфигурация сервера
  • /etc/ssh/ssh_config конфигурация клиента по умолчанию.

Пользователи могут изменить личные настройки в файле $HOME/.ssh/config или задать их в командной строке.

В сети постоянно работают хакерские программы пытающиеся подобрать пароли к ssh грубой силой. В первую очередь проверяется пользователь root. По этому, первый шаг в укреплении безопасности – запрет root'у подключаться по ssh. Все администраторские действия лучше всего проводить с использованием программы Sudo. Кроме того, проверяются стандартные имена служб и типичные имена пользователей, например andrew, alex, mary и т.п. Лучший способ избавиться от проблем с подбором пароля – перейти на аутенификацию с публичным ключом. После генерации пары секретный ключ, публичный ключ, публичный ключ добавляется в список доверенных в файле пользователя ~/.ssh/authorized_keys. Права на файл authorized_keys желательно выставить в rw-------.

Серверные настройки – sshd_config

#Запрет на вход с именем root
PermitRootLogin no

#Разрешение на вход только по ключам
RSAAuthentication yes
PubkeyAuthentication yes
PasswordAuthentication no

Для безопасного удаленного доступа к локальным сетевым службам и запуска программ с графическим интерфейсом добавляем

AllowTcpForwarding yes
X11Forwarding yes

Внимание: для работы X11Forwarding в CentOS необходимо установить пакет xorg-x11-xauth

Telnet, FTP

"telnet" - протокол удалённого терминала предназначенный для удалённого подключения к ОС имеющих текстовый интерфейс.

"ftp" - по сути дела сеанс telnet в рамках которого на сервере запускается специализированная диалоговая программа для работы с файлами. Для передачи содержимого каталогов и файлов устанавливается дополнительное соединение, по которому и передаётся содержимое файла.

Проверка цифрового отпечатка ключа

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

Команда вычисления хэша:ssh-keygen -l -f имя_файла

Можно передавать как имя файла секретного ключа, так и имя файла публичного ключа. В любом случае будет выдан хэш от публичного ключа. Например: ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key. Если в файле много ключей (например в ~/.ssh/authorized_keys), то ssh-keygen посчитает все хэши.

В зависимости от версии OpenSSH хэш может считаться по алгоритму MD5 и выдаваться в восьмеричной записи (старые версии), либо считаться по алгоритму SHA256 и выдаваться в кодировке BASE64 (новые версии). Для того, чтобы новая версия ssh-keygen выдала хэш в старом формате необходимо добавить опцию -E md5. Дополнительная опция -v генерирует представление хэша в ASCII-арт.

Примеры:

#Старая версия
ssh-keygen -l -f ~/.ssh/id_rsa
2048 19:c3:6f:d8:48:88:5d:97:44:56:3e:75:5e:e0:f5:fa /home/user/.ssh/id_rsa.pub (RSA)

#Новая версия
ssh-keygen -l -f ~/.ssh/id_rsa
3072 SHA256:6jpGLR7o7uutwXjYzIJE/6eQK9rMbwmjSU+BPEMBlnk user@example.com (RSA)

ssh-keygen -l -E md5 -v-f ~/.ssh/id_rsa
3072 MD5:00:a6:22:39:bb:20:77:de:03:2a:fd:ad:79:f0:53:7f user@example.com (RSA)
+---[RSA 3072]----+
|    o            |
| . o .           |
|= .   .          |
|.+     .         |
|+ . o   S        |
|o+ +.o  .        |
|o o .oo. .       |
| . . o+.  . E    |
|    +o..   .     |
+------[MD5]------+

Туннели в SSH

Протокол SSH позволяет прокладывать TCP туннели внутри защищенного соединения. Фактически это означает, что клиент и сервер SSH создают по дополнительному сокету. Один из них принимает входящие соединения, а второй соединяется с кем-то в своей сети или в интернете. Данные из одного сокета пробрасываются в другой. В зависимости от распределения ролей сокетов туннели делятся на локальные (local) и удалённые (remote) . Первые принимают входящие соединения на локальном порту и пробрасывают их на удаленный сервер, вторые принимают соединения на удаленном сервере и пробрасывают их в локальную сеть.

      ++++++++     ++++++++      
      |Клиент| SSH |Сервер|      Кто то в сети
Я --->|порт  |-----|      |----> сервера или в интернете 
      |5678  |     |      |      с портом 80      
      ++++++++     ++++++++

          ++++++++     ++++++++      
Мой комп  |Клиент| SSH |Сервер|     Кто то из сети
порт  <---|      |-----|порт  |<--- сервера  или из интернета
3389      |      |     |5678  |     подключается ко мне
          ++++++++     ++++++++

В Unix проброс локального порта 5678 на remoteserv.com:80 через ssh_host.com выглядит так:

ssh -L localhost:5678:remoteserv.com:80 ssh_host.com

После создания канала можно подключаться браузером на http://loclahost:5678. localhost: в опции -L можно опустить. Это значение по умолчанию. Если надо подключиться на порт 80 самого ssh_host.com то можно задать опцию так:

ssh -L 5678:localhost:80 ssh_host.com

Проброс удаленного порта сервера для доступа на свой компьютер удаленным рабочим столом:

ssh -R *:5678:localhost:3389 ssh_host.com

* означает, что на сервере будут задействованы все доступные сетевые интерфейсы. Если этот параметр не указать, то порт 5678 откроется на сервере ssh_host.com только по адресу 127.0.0.1

Проброс портов без запуска терминала

В командах выше кроме проброса портов на удалённой машине запускается shell и устанавливается терминальное соединение. Если терминал не нужен, то можно запустить ssh с опцией -N. В этом случае никакая команда на удаленном сервере не запустится, и, что интересно, команды w, last и т.п. не будут показывать ваш вход на сервер. Впрочем, информация об авторизации в системе останется в логах категории authpriv.

Особые случаи

Опция -A находит на локальной машине порт ssh-agent пробрасывает его на удаленную машину на случайный порт или Unix-сокет и устанавливает в сеансе ssh переменную SSH_AUTH_SOCK для дальнейшей авторизации через агента.

Опция -X находит на локальной машине порт XWindow и пробрасывает его на первый свободный порт начиная от порта 6000 (базовый порт XWindow). Переменная DISPLAY в сеансе ssh устанавливается в :<номер порта - 6000>. Так, если номер порта на сервере 6007 то DISPLAY=":7".

Опция -D addr:port превращает ваш компьютер в SOCKS прокси с выходом в интернет на стороне сервера. Как и раньше, если вы укажете только порт, то вместо адреса подставится 127.0.0.1 и ваш прокси будет доступен только на локальном компьютере. Если вместо адреса подставить *, то вашим SOCKS прокси смогут воспользоваться все компьютеры, имеющие к вам доступ по сети.

Туннели в putty

Настройка туннелей в putty находится в настройках соединения в пункте Connection -> SSH -> Tunnels. Локальный/удаленный туннель может выбираться автоматически на основе введённых данных. В нашем примере локальному туннелю соответствуют поля: Source port - 5678; Destination - remoteserv.com:80

Не забудьте после ввода данных нажать кнопку "Add".

Если вам не нужен терминал, зато нужно формировать туннель из .bat файла - воспользуйтесь программой plink. Её параметры совпадают с параметрами ssh.