ssh авторизация по ключам, безопасное копирование

]]>Public key]]> / ]]>Отпечаток (fingerprint)]]> / ]]>SCP]]> / ]]>Защищенные туннели]]>

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

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

  • Используя ssh-keygen, генерируем пару ключей. ~/.ssh/id_dsa-приватный ключ, ~/.ssh/id_dsa.pub-публичный ключ.
  • Копируем только публичный ключ на сервер и добавляем его в файл ~/.ssh/authorized_keys2, ~/ -домашняя директория.
# 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.

  • Создать пару ключей с помощью ssh.com клиента: Settings - User Authentication - Generate New....
  • Тип ключа DSA; Длина ключа 2048.
  • Скопировать публичный ключ на сервер в папку ~/.ssh.
  • Ключи находятся в C:\Documents and Settings\%USERNAME%\Application Data\SSH\UserKeys.
  • Используя ssh-keygen на сервере, конвертируем ключи:
    # cd ~/.ssh
    # ssh-keygen -i -f keyfilename.pub >> authorized_keys2
    

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

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

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

  • Создать пару ключей с помощью утилиты puttygen (идет в комплекте с полным дистрибутивом)
  • Сохранить публичный и приватный ключи, например в C:\Documents and Settings\%USERNAME%\.ssh.
  • Копировать публичный ключ на сервер в папку ~/.ssh:
    # scp .ssh/puttykey.pub root@192.168.51.254:.ssh/
    
  • Используя ssh-keygen на сервере, конвертировать ключи в формат OpenSSH:
    # cd ~/.ssh
    # ssh-keygen -i -f puttykey.pub >> authorized_keys2
    
  • В PuTTy: Connection - SSH - Auth, прописать путь к приватному ключу.

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

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

# ssh test_host
The authenticity of host 'test_host (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

В данном случае, у нас удаленный сервер SSH, сидит на нестандартном порту, поэтому с помощью опции -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]]>.

Создание защищенного 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

Теперь SMB шара доступна по адресу \\127.0.0.1\, но только если отключена локальные шара, поскольку локальная шара тоже использует 139 порт.
Что-бы иметь возможность оставить локальные расшаренные русурсы включенными, нужно создать новый виртуальный интерфейс с новым IP адресом для создания туннеля, SMB шара будет подключена через этот IP адрес. Кроме того, локальный RDP уже использует порт 3389, поэтому мы выбираем 3388. Для приведенного ниже примера, будем использовать виртуальный IP адрес 10.0.0.1.

  • With putty use Source port=10.1.1.1:139. It is possible to create multiple loop devices and tunnel. On Windows 2000, only putty worked for me. On Windows Vista also forward the port 445 in addition to the port 139. Also on Vista the patch KB942624 prevents the port 445 to be forwarded, so I had to uninstall this path in Vista.
  • With the ssh.com client, disable "Allow local connections only". Since ssh.com will bind to all addresses, only a single share can be connected.

Теперь создаем loopback интерфейс с IP адресом 10.1.1.1:

  • # System->Control Panel->Add Hardware # Добавляем новое устройство.
  • # Устанавливаем устройство выбрав его вручную Network adapters -> Microsoft -> Microsoft Loopback Adapter.
  • Настраиваем IP адрес созданного устройства на 10.1.1.1 маска 255.255.255.0, без шлюза.
  • advanced-> WINS, Enable LMHosts Lookup; Disable NetBIOS over TCP/IP.
  • # Enable Client for Microsoft Networks. # Отключить общие файлы и принтеры для сетей Microsoft.

Перезагружаемся. Теперь можно подключиться к расшаренным ресурсам по адресу \\10.1.1.1 и к удаленному рабочему столу по адресу 10.1.1.1:3388.

Отладка

Если что-то не работает:

  • Порты проброшены правильно, netstat -an? ищите 0.0.0.0:139 или 10.1.1.1:139
  • Попробуйте подключиться через telnet по адресу 10.1.1.1 139
  • Должна быть включена опция "Local ports accept connections from other hosts".
  • Сервис "File and Printer Sharing for Microsoft Networks" отключен на loopback интерфейсе?

Подключение двух клиентов, сидящих за 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

Отладка 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 -L5678:localhost:5678 host1        # 5678 произвольный порт для туннеля
хост_1># ssh -L5678:localhost:5678 host2        # звено 5678 с хохта1 на хост2
хост_2># ssh -L5678:localhost:22 server         # и тцннель на порт 22 сервера