Оглавление

Ключи авторизации SSH, безопасное копирование - SCP

Public key | Fingerprint | SCP | Tunneling

Public key - Публичный ключ

Для соединения с удаленным хостом без ввода пароля, можно использовать так называемый Public key (публичный ключ). Нужно добавить запись о публичном ключе в файл ~/.ssh/authorized_keys на удаленном хосте. В данном случае для подключения используются ключи сгенерированные на стороне-клиенте. В cygwin создать /home директорию и .csh в ней, можно с помощью # mkdir -p /home/USER/.ssh

# ssh-keygen -t dsa -N ''
# cat ~/.ssh/id_dsa.pub | ssh you@host-server "cat - >> ~/.ssh/authorized_keys2"

Используя Windows клиент с ssh.com

Коммерческую версию клиента, можно скачать с официального сайта: ssh.com. Ключи сгенерированные с помощью ssh.com клиента нужно переконвертировать в формат OpenSSH сервера, это делается с помощью ssh-keygen.

Использовать можно как DSA, так и RSA алгоритм. Имейте в виду, сгенерированные нами ключи не защищены паролем, а это определенная минус для безопасности.

Использование putty для Windows

Putty, отличный бесплатные клиент под Windows.

Fingerprinf - Проверка отпечатка

При первом подключении, ssh проверит, если хост с данным отпечатком неизвестен, будет запрошено подтверждение yes/no, если ответ будет yes, хост будет добавлен в файл ~/.ssh/known_hosts и при следующи подключении будет сразу запрошен пароль для подключения, если ответ будет no, соединение будет разорвано.

# ssh linda
The authenticity of host 'linda (192.168.16.54)' can't be established.
DSA key fingerprint is 14:4a:aa:d9:73:25:46:6d:0a:48:35:c7:f4:16:d4:ee.
Are you sure you want to continue connecting (yes/no)? yes

Получить отпечаток можно командой ssh-keygen -l на сервере:

# ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key.pub      # Для RSA ключа
2048 61:33:be:9b:ae:6c:36:31:fd:83:98:b7:99:2d:9f:cd /etc/ssh/ssh_host_rsa_key.pub
# ssh-keygen -l -f /etc/ssh/ssh_host_dsa_key.pub      # Для DSA ключа (по-умолчанию)
2048 14:4a:aa:d9:73:25:46:6d:0a:48:35:c7:f4:16:d4:ee /etc/ssh/ssh_host_dsa_key.pub

SCP - Безопасное копирование

Пара простых команд:
# scp file.txt remote_host:/tmp
# scp joe@remote_host:/www/*.html /www/tmp
# scp -r joe@remote_host:/www /www/tmp

Еще пара примеров использования SCP

# scp -P 2525 ./file_to_copy root@remote_host:/tmp/copied_file

В данном случае, у нас удаленный sshd, сидит на нестандартном порту, поэтому с помощью опции "-P", указываем на какой порт подключаемся. Не путайте с ключем "-p" у программы ssh, для указания порта, для scp, опция "-p", означает "Сохранить время модификации, время последнего доступа, и режимы, оригинального файла".
в случае, если у пользователя, под которым вы пытаетесь подключится для копирования, установлен пароль ( что собственно и должно быть ), SCP попросит его ввести, выглядит это примерно так.

# scp -P 2222 ./file_to_copy user@remote_host:~/copied_file
# Password:                                                     вводим пароль, жмем Ентер
# copied_file

Подключить удаленную папку можно с помощью Konqueror или Midnight Commander.. введя путь в виде user@gate. Кроме того можно воспользоваться утилитой sshfs, это клиент для файловых систем на базе SCP. See fuse sshfs.

Tunneling - Создание защищенного SSH туннеля

SSH туннелирование позволяет делать форвардинг портов (перенаправление) через SSH туннель, обеспечивая прохождение трафика через заблокированые порты (работает только на TCP).

SSH Туннель создается из слушающего сокета на определенном порту localhost. Затем все принятые на локальном хосте/порту соединения перенаправляются через SSH на удаленный хост/порт.

# ssh -L localport:desthost:destport user@gate  # Хост назначения будет представлять из себя локальный порт
# ssh -R destport:desthost:localport user@gate  # Локальный порт будет проброшен на указанный порт удаленного хоста
# ssh -X user@gate   # Принудительный форвардинг Х сеанса 

Прямой форвардинг на шлюз

Предположим, нам нужно получить доступ к CVS (порт 2401) и http (порт 80), запущенных на удаленном хочте. Ниже вы видите простой пример реализации, мы подключаем к локальному порту 2401, соответствующий порт удаленного хоста, а для доступа к удаленному порту 80 используем локальный порт 8080. Единожды открыв ssh сессию, все соответствующие сервисы удаленного хоста, будут доступны на локальных портах.
# ssh -L 2401:localhost:2401 -L 8080:localhost:80 user@gate

Форвардинг портов Netbios и удаленного рабочего стола

Имеем Windows SMB сервер за шлюзом, и отсутствие ssh. Необходимо получить доступ к расшаренным SMB папкам и удаленному рабочему столу.
# ssh -L 139:smbserver:139 -L 3388:smbserver:3389 user@gate
The smb share can now be accessed with \\127.0.0.1\, but only if the local share is disabled, because the local share is listening on port 139.
It is possible to keep the local share enabled, for this we need to create a new virtual device with a new IP address for the tunnel, the smb share will be connected over this address. Furthermore the local RDP is already listening on 3389, so we choose 3388. For this example let's use a virtual IP of 10.1.1.1.
Now create the loopback interface with IP 10.1.1.1: I HAD to reboot for this to work. Now connect to the smb share with \\10.1.1.1 and remote desktop to 10.1.1.1:3388.

Debug

If it is not working:

Подключение двух клиентов, сидящих за NAT

Есть две машины, находящиеся за NAT шлюзом, клиенту cliadmin нужно подключится к клиенту cliuser, оба имеют доступ к Linux-шлюзу по ssh. Поскольку будут использованы порты, выше 1024, root доступ не понадобится. На шлюзе мы используем порт 2022.

На клиенте cliuser:
# ssh -R 2022:localhost:22 user@gate            # Форвардинг порта клиента 22, на порт 2022, шлюза
На клиенте cliadmin:
# ssh -L 3022:localhost:2022 admin@gate         # Форвардинг порта клиента 3022, на порт 2022 шлюза
Теперь администратор может напрямую подключится к cliuser:
# ssh -p 3022 admin@localhost                   # local:3022 -> gate:2022 -> client:22

Подключение к рабочему столу, расположенному за NAT

Предположим нужно получить доступ к Windows клиенту с VNC слушающем на 5900 порту. От клмента cliwin на шлюз:
# ssh -R 15900:localhost:5900 user@gate
От клиента cliadmin:
# ssh -L 5900:localhost:15900 admin@gate
Теперь админ может напрямую подключится к клиентскому VNC:
# vncconnect -display :0 localhost

Dig a multi-hop ssh tunnel

Предположим, вы не можете получить прямой доступ к ssh, только через промежуточные хосты(например из-за проблем с маршрутизацией), но получить соединение клиент-сервер вам необходимо, к примеру что-бы скопировать файлы через SCP или пробросить порт для SMB.. Сделать это можно, организовав туннель из цепочки хостов.
Допустим нам нужно перебросить ssh порт клиента к серверу, в два скачка. Когда туннель будет создан, будет возможно прямое подключение клиент - сервер.

Создание туннеля в одной оболочке

клиент -> хост1 -> хост2 -> сервер and dig tunnel 5678
Клиент># ssh -L5678:localhost:5678 host1        # 5678 произвольный порт для туннеля
хост_1># ssh -L5678:localhost:5678 host2        # звено 5678 с хохта1 на хост2
хост_2># ssh -L5678:localhost:22 server         # и тцннель на порт 22 сервера

Использование туннеля через другой шелл

клиент -> сервер использующий туннель 5678
# ssh -p 5678 localhost                         # прямое подключение клиент - сервер
# scp -P 5678 myfile localhost:/tmp/            # Копируем файлы напрямую
# rsync -e 'ssh -p 5678' myfile localhost:/tmp/ # или так-же напрямую синхронизируем файлы

Оглавление