OpenSSH для Windows
Написал microsin   
06.01.2008

Технология SSH (Secure Shell) позволяет защитить простые протоколы ftp, telnet, создавать защищенные туннели, перенаправление сетевых портов, что существенно расширяет набор инструментов системного администратора. OpenSSH (открытый безопасный shell) — набор программ, предоставляющих шифрование сеансов связи по компьютерным сетям с использованием протокола SSH. Он был создан под руководством Тэо де Раадта как открытая альтернатива проприетарного ПО от SSH Communications Security. Далее рассмотрена установка сервера и клиента OpenSSH на платформе Windows XP.

1. Скачиваем setupssh381-20040709.zip. Скачать можно http://sshwindows.sourceforge.net/.
2. Устанавливаем и подтверждаем умолчания во всех настройках. Установятся сервер и клиент SSH в нужное место (папка %ProgramFiles%\OpenSSH). После установки появится окно с предупреждением "Перед запуском службы OpenSSH вы ДОЛЖНЫ отредактировать файл %ProgramFiles%\OpenSSH\etc\passwd. Если вы не сделаете этого, то не сможете залогиниться через сервер SSH. Пожалуйста, прочитайте информацию в файлах readme.txt или quickstart.txt для правильной настройки файла passwd.".
3. Делаем все как написано в quickstart.txt. Запускаем cmd в папке %ProgramFiles%\OpenSSH, переходим в папку bin (Start -> Run... -> cmd -> cd %ProgramFiles%\OpenSSH -> cd bin).
4. Теперь нужно сделать group permissions file (файл разрешений для группы). Он может быть создан для локальных или доменных групп, для чего применяется команда mkgroup с ключом -l и -d соответственно. У меня был домашний комп, и никакого домена не было, поэтому я ввел просто:
mkgroup -l >> ..\etc\group  
   После этого в папке etc появится файл group.
5. Теперь нужно в passwd file (файл паролей) добавить пользователей - либо локальных, либо доменных, для чего применяется команда mkpasswd с ключом -l и -d соответственно. Я ввел
mkpasswd -l -u Administrator >> ..\etc\passwd
   Можно не указывать ключ -u и пользователя, тогда добавятся все пользователи, включая сервисные аккаунты и аккаунт Guest. Я ограничился пользователем Administrator. После этого в папке etc появится файл passwd.
6. Запускаем сервер OpenSSH командой net start opensshd, или с помощью консоли управления сервисами запускаем сервис по имени "OpenSSH Server". После этого приложением sshd.exe должен открыться TCP порт 22.
   На этом шаге у меня была проблема - сервис не хотел запускаться в системной ошибкой "System error 1067". Попробовал найти лог, он оказался в файле %ProgramFiles%\OpenSSH\var\log\OpenSSHd.log. Там было такое сообщение:
"5 [main] ? (1940) D:\Program Files\OpenSSH\usr\sbin\sshd.exe: *** fatal error - proc magic mismatch detected - 0xEFAED2A6/0x704D1F7E. This problem is probably due to using incompatible versions of the cygwin DLL. Search for cygwin1.dll using the Windows Start->Find/Search facility and delete all but the most recent version.  The most recent version *should* reside in x:\cygwin\bin, where 'x' is the drive on which you have installed the cygwin distribution.  Rebooting is also suggested if you are unable to find another cygwin DLL."
    По-русски эта галиматься значит, что не подходит версия файла cygwin1.dll. Попытался найти файл cygwin1.dll, он у меня оказался в нескольких местах:
c:\Program Files\hypertunnelNT\cygwin1.dll
c:\WinAVR\bin\cygwin1.dll
D:\Program Files\OpenSSH\bin\cygwin1.dll
    Самая свежая версия (1005.23.0.0) была у файла c:\WinAVR\bin\cygwin1.dll, а текущая версия файла D:\Program Files\OpenSSH\bin\cygwin1.dll была 1005.10.0.0. Попробовал для OpenSSH подменить cygwin1.dll на более новый, от WinAVR - и все заработало!
7. События успешного и неуспешного подключения клиентов пишутся в лог Application системы Windows. Записью в лог управляют ключи SyslogFacility и LogLevel в файле etc\sshd_config. Я у себя настроил эти опции так:
SyslogFacility AUTH
LogLevel VERBOSE
Поскольку хакерская активность в Интернете высока, журнал Application будет быстро заполняться, поэтому есть смысл увеличить размер лога Application (я увеличил до 5120 байт) и включить перезаписывание записей журнала по необходимости (Overwrite events as needed).

Теперь с сервером OpenSSH на Windows мы получаем следующие возможности:
- можно добраться до командной строки cmd, законнектившись под пользователем, прописанным в passwd (в моем примере Administrator). Текущий путь получаем, как прописано в переменной окружения %USERPROFILE% Windows. Под FreeBSD для этого можно воспользоваться клиентом ssh:
$ ssh Administrator@IP_или_имя_нашего_сервера_OpenSSH
- можно в Midnight Commander открыть с панели Shell Link, правда пользы от этого пока мало - у меня при подключении открылась папка bin в совсем неожиданном месте - c:\WinAVR\utils\bin\, и были доступны файлы только внутри неё.
- можно воспользоваться защищенным ftp-соединением (Secure FTP, или SFTP). Под FreeBSD для этого можно воспользоваться клиентом sftp:
$ sftp Administrator@IP_или_имя_нашего_сервера_OpenSSH 
  Как и в случае с cmd через утилиту ssh, текущий путь будет %USERPROFILE%, и будут доступны все файлы в текущей директории и в её подпапках. Можно подняться на уровень выше, в папку %SystemDrive%\Documents and Settings\.
  Если попытаться подняться еще на уровень выше, то попадем не как ожидалось на диск %SystemDrive%, а в папку %ProgramFiles%\OpenSSH. Эта папка считается корневой, и больше никуда выше попасть нельзя. Чтобы попасть обратно в папку %USERPROFILE%, нужно ввести cd /home/Administrator
- можно воспользоваться утилитой защищенного копирования scp. Например, под FreeBSD это будет выглядеть так:
$ scp backstore/080106archive.tar Administrator@IP_или_имя_нашего_сервера_OpenSSH:.
  Это означает - скопировать файл backstore/080106archive.tar в текущий каталог (.) пользователя Administrator (напомню, что это будет папка %USERPROFILE%). 
туннелирование сетевых соединений, иногда это называют "перенаправление портов через SSH-туннель".
  
Беспарольная аутентификация, основаная на public/private ключах
Как и в примерах с ssh, sftp, утилита scp запросит пароль пользователя Administrator. Чтобы не вводить пароль, например для копирования из bat-файла, нужно сгенерировать ключи и далее их использовать. Процесс по шагам (предполагается, что сервер установлен на Windows XP SP2, там есть пользователь Administrator, а клиент используется на FreeBSD, версия ядра 6.2-RELEASE-p8, там работаем под пользователем user, имя машины host.agava.net).
1. Генерируем ключи на клиенте (DSA, Digital Signature Algorithm):
$ cd ~    # переходим в домашний каталог пользователя user
$ ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_dsa): # тут просто нажимаем Enter
Enter passphrase (empty for no passphrase):     # тут просто нажимаем Enter, пароля нет
Enter same passphrase again:                           # тут просто нажимаем Enter, пароля нет
Your identification has been saved in /home/user/.ssh/id_dsa.
Your public key has been saved in /home/user/.ssh/id_dsa.pub.
The key fingerprint is:
hh:hh:hh:hh:hh:hh:hh:hh:hh:hh:hh:hh:hh:hh:hh:hh user@host.agava.net 
   Вместо hh будут HEX-цифры хеша ключа. Для генерации ключей требуется некоторое время (в зависимости от мощности машины, у меня на это ушло около 20 секунд). После этой операции в директории .ssh появятся 2 файла - id_dsa (приватный, секретный ключ, используется для расшифровки данных) и id_dsa.pub (публичный ключ, используется для шифрования данных).
2. Копируем файл id_dsa.pub с клиента на сервер, в папку пользователя Administrator, в подпапку .ssh (у меня был полный путь такой - d:\Documents and Settings\Administrator\.ssh\). Переименовываем id_dsa.pub в authorized_keys. Иногда может потребоваться использовать другое имя - authorized_keys2, за деталями обращайтесь к информации в файле %ProgramFiles%\OpenSSH\docs\key_authentication.txt.
3. Открываем в текстовом редакторе файл %ProgramFiles%\OpenSSH\sshd_config, меняем параметр StrictModes yes на StrictModes no (см. тот же файл key_authentication.txt, ключевое слово Fix StrictModes).
4. Перезапускаем сервер SSH:
net stop opensshd
net start opensshd
   Пробуем на клиенте команды scp, sftp, ssh (см. примеры выше) - под пользователем Administrator больше пароль не запрашивается!

B кaчecтвe yдoбнoгo (и бecплaтнoгo!) SSH-клиeнтa мoжнo иcпoльзoвaть putty. Eгo тoжe мoжнo иcпoльзoвaть для бeзпapoльнoй ayтeнтификaции пpи кoннeктe к SSH-cepвepy. Кaк нacтpoить, пpoцecc пo шaгaм (пpeдпoлaгaeтcя, чтo клиeнт putty paбoтaeт нa Windows XP, a cepвep SSH - нa FreeBSD, вepcия ядpa 6.2-RELEASE-p8, тaм paбoтaeм пoд пoльзoвaтeлeм user, имя мaшины host.agava.net):
1. Гeнepиpyeм ключи нa клиeнтe (DSA, Digital Signature Algorithm), для чeгo зaпycкaeм пpoгpaммy puttygen.exe. Oнa идeт в пoлнoм кoмплeктe putty, и ecли y Bac пoчeмy-тo eё нeт, тo мoжнo cкaчaть на сайте http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html, либо скомпилировать из исходников. После запуска puttygen.exe выбираем тип ключа (я выбрал SSH-2 DSA, хотя создатели putty настоятельно рекомендуют выбирать не DSA, а RSA), разрядность ключа (я оставил по умолчанию 1024), жмем кнопку Generate. Елозим мышкой по экрану - в этом процессе генерируется случайное число для ключа. Ключ сгенерируется. В поля "Key passphrase:" и "Confirm passphrase:" принципиально ничего не вводим, поскольку нам нужно от пароля избавиться. Жмем Save public key, сохраняем публичный ключ, жмем Save private key, сохраняем секретный ключ. Ключи лучше сохранить в потайное место (особенно секретный ключ), чтобы не достали враги =).
2. Теперь надо перетащить сгенерированный публичный ключ на сервер SSH. В программе puttygen.exe из окна "Public key for pasting into OpenSSH authorized  keys file:" копируем весь текст, создаем новый файл authorized_keys и этот текст вставляем туда, файл сохраняем на сервер SSH, в папку .ssh (эта папка должна находиться в корне домашнего каталога пользователя user на FreeBSD). Программу puttygen.exe закрываем, запускаем putty.exe.
3. Настраиваем сессию. Все как обычно - жмем правой кнопкой на верхней плашке окна putty, выбираем "New session...", с категории Session указываем IP или имя сервера FreeBSD, протокол SSH, в окне ввода "Saved Sessions" указываем произвольное имя сессии. Переходим в категорию Connection\Data, указываем в окне вввода "Auto-login username" имя пользователя, под которым будем логиниться. Переходим в категорию Connection\SSH\Auth, указываем секретный ключ для аутентификации - рядом с окном "Private key file for authentication:" жмем кнопу "Browse..." и выбираем файл секретного ключа, который был сгенерирован и записан на шаге 1. Снова переходим в категорию Session, жмем кнопку Save.
Готово! Теперь можно нажать кнопку Open, запустится сессия, и пароль вводить уже не надо.


Ссылки по теме:
http://microsin.ru/content/view/457/43/ - как поднять сервер SSH на FreeBSD. На этой системе сервер SSH работает намного быстрее и стабильнее.
Последнее обновление ( 07.01.2009 )