В повседневной деятельности пользователя можно выделить два вида деятельности - запуск программ (возможно с перенаправлением ввода вывода) и операции с файлами. На настоящий момент самым популярным протоколом запуска программ является протокол ssh, а для передачи файлов используются построенные на его основе команды scp и sftp.
Протокол ssh использует шифрование трафика, что обеспечивает защиту от перехвата паролей и передаваемых данных.
В состав комплекса входят клиентские программы ssh
- аналог telnet
и rsh
, scp
- аналог rcp
и sftp
- программа внешне похожая на ftp
по защищенному каналу. Несмотря на похожесть этих программ на своих предшественников, они используют другие протоколы, разработанные заново для исправления архитектурных ошибок, выявленных в их предшественниках.
Cервер OpenSSH в большинстве дистрибутивов устанавливается по умолчанию. Необходимо только подогнать настройки под свои нужды.
Конфигурационные файлы хранятся в каталоге /etc/ssh
Пользователи могут изменить личные настройки в файле $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
в рамках которого на сервере запускается специализированная диалоговая программа для работы с файлами. Для передачи содержимого каталогов и файлов устанавливается дополнительное соединение, по которому и передаётся содержимое файла.
Для того, чтобы проверить достоверность ключа сервера пользователь может связаться с администратором сервера по доверенному каналу и запросить хэш ключа.
Команда вычисления хэша: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 позволяет прокладывать 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
находится в настройках соединения в пункте Connection -> SSH -> Tunnels. Локальный/удаленный туннель может выбираться автоматически на основе введённых данных. В нашем примере локальному туннелю соответствуют поля: Source port - 5678; Destination - remoteserv.com:80
Не забудьте после ввода данных нажать кнопку "Add".
Если вам не нужен терминал, зато нужно формировать туннель из .bat файла - воспользуйтесь программой plink
. Её параметры совпадают с параметрами ssh
.