Amin 's Blog

Всякие размышления о жизни, да и так - справочка для себя

SSH-сервер под виндой

У меня наконец-то появился повод разобраться, как настраивать SSH/SFTP-сервер под Windows. Дальше будет много крови и насилия траха с виндовыми серверами, но если оно вам надо - читаем. Скажу сразу - я пишу это для себя, потому что повторить подобный куннилингус наизусть уже через пол-года будет затруднительно.

Представьте картину маслом - несколько виндовых серверов, на разных виндах (включая ни разу не серверные), введенные или даже не введенные в разные домены, с которых вам надо периодически забрать бэкапы на юниксовый сервер с помощью простого bash-скрипта. У всех этих машин - внешние IP-адреса, и траффик идет прямо по инету. Причем настроить надо быстро, просто и надежно, и чтобы потом это было легко поддерживать. Я посмотрел на Unix Tools под виндовс (в исполнении микрософта оно почему-то весит под 300 Мб и не содержит SSH, зато содержит NFS), почитал маны про настройку IPSec под виндовс, потом прочитал еще более жуткие маны про доступ к виндовс-ресурсам по сертификатам (ощущение сложилось - "упадет - хуй поднимешь" bigsmile), представил себе всю глубину анальной оккупации и решил для себя, что лучше SSH пока что ничего не придумано и если уж пилить - то именно его.

Задача-максимум - получить с Linux-машины секурный доступ к виндовому серверу, при котором должна быть доступна консоль (cmd.exe как убогий суррогат нормального шелла), должно работать копирование через scp/sftp и самое главное - авторизация должна быть по ключам, никаких паролей, и к тому же все это должно относительно просто настраиваться без перезагрузки виндового сервера. Для этого нам понадобятся плетка, наручники и костюмчик из латекса дистриб OpenSSHd под Windows, монитор процессов от Руссиновича, много манов и желание заставить работать всё это хозяйство.

Итак, ставим. Ставится оно по умолчанию в C:\Program Files\OpenSSH, и этот каталог считается для данного приложения "корневым", там будут подкаталоги etc, bin, usr, var, docs и прочие знакомые из никсового мира.
Дальше строго по инструкции из docs\quickstart.txt открываем консоль cmd в каталоге bin, делаем маппинг пользователей и групп виндовс к пользователям SSH и пытаемся запустить сервер:
cd C:\Program Files\OpenSSH\bin
mkgroup -l > ..\etc\group
mkpasswd -l -u backuper > ..\etc\passwd
net start opensshd
Я смапил все локальные группы и локального пользователя backuper. Сервер у меня запустился без проблем (в оснастке "Службы" должна появится служба "OpenSSH Server"), но при попытке подключиться из никсовой машины наблюдалось вот такое:
backuper@192.168.8.2's password: 
Last login: Thu Oct  6 00:42:13 2011 from 192.168.8.1
setgid: Invalid argument
Connection to 192.168.8.2 closed.
Лечится это остановкой службы, перегенерацией списка групп и привязок пользователей, повторным запуском службы. По умолчанию включена только парольная авторизация, пустые пароли запрещены.
Поправим прикола ради файлик с приветствием в etc\banner.txt , а то там слишком многабукафф =)
Ставим пользователю backuper пароль (Панель управления - Пользователи и группы), и пытаемся логиниться с никсовой машины.
Если процесс логина виснет, а в логах тихо, то проверьте, что в C:\Program Files\OpenSSH\bin лежит cygintl-2.dll и если её там нет - положите её туда. Да, это вам не yum , тут зависимости ищутся вручную и вручную же разруливаются.

После добавления недостающей библиотеки (ручками, факинг шит !!) удается залогиниться:
ssh backuper@192.168.8.2
--------------
  PREVED !
--------------

Last login: Thu Oct  6 00:42:37 2011 from 192.168.8.1
Microsoft Windows XP [������ 5.1.2600]
(�) ��௮����� ����������, 1985-2001.

C:\Documents and Settings\backuper>ls
Application Data
Cookies
Local Settings
NTUSER.DAT
NTUSER.DAT.LOG
NetHood
PrintHood
Recent
SendTo
ntuser.ini
������� ����
���������
��� ���������
������� ����
�������
Вошло, но кодировка русского текста битая. Поскольку я использую программу Konsole из KDE, лезем в [Вид]-[Установить кодировку]-[Кириллица]-[IBM866]. Да, это не глюк, именно 866, а вовсе не cp1251 ! Потому что в cmd.exe до сих пор используется однобайтная DOS-кодировка из 80-х. Повторно вводим команду ls (можно dir), и видим вменяемое оглавление:
 Содержимое папки C:\Documents and Settings\backuper

06.10.2011  00:40    <DIR>          .
06.10.2011  00:40    <DIR>          ..
02.10.2009  05:18    <DIR>          Главное меню
02.10.2009  01:35    <DIR>          Избранное
07.03.2010  01:22    <DIR>          Мои документы
06.10.2011  00:55    <DIR>          Рабочий стол
               0 файлов              0 байт
               7 папок   750 220 288 байт свободно
Однако если мы попробуем сделать Shell-соединение из Midnight Commander, то мы увидим, что оглавление пустое, хотя все файлы на месте. С чем это связано - точно не знаю. Поэтому с виндовс-сервером нам придется работать через утилиту scp или sftp. Тут есть важная засада: дав команду вида
sftp backuper@192.168.8.2:/ntldr ./
мы попытаемся сгрузить файл ntldr из виртуального корня SSH-сервера, где его естественно нету. Для доступа ко всем дискам надо использовать так называемую cygwin-нотацию. Например, скопировать содержимое каталога C:\WINDOWS\system32\drivers\ со всеми подкаталогами можно так:
sftp -r backuper@192.168.8.2:/cygdrive/c/WINDOWS/system32/drivers/* ./
Важно помнить, что залоченные системой файлы (подкачка, SAM и т. п.) так скопировать не получится.

Следующая часть - авторизация по ключам. Тут все относительно просто - правим в etc\sshd_config следующие строчки:
StrictModes no

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile	.ssh/authorized_keys

PasswordAuthentication no
PermitEmptyPasswords no
Поскольку это виндовс, то даже тут мы споткнемся о костыль - открывающийся по умолчанию "Блокнот" убог настолько, что не понимает разные типы конца строки, и весь конфиг будет кашей. Поэтому первый раз конфиг надо открыть с помощью WordPad и пересохранить. Либо изначально пользоваться более нормальным текстовым редактором типа Notepad++. Затем кладем открытый ключ пользователя backuper в файл C:\Documents and Settings\backuper\.ssh\authorized_keys (убедитесь, что адский "Блокнот" вставит ваш ключ одной строкой, это важно!). Перезапускаем службу, все должно заработать:
# sftp -r Administrator@192.168.8.2:/cygdrive/c/ntldr ./

Permission denied (publickey,keyboard-interactive).
Couldn't read packet: Connection reset by peer
# sftp -r backuper@192.168.8.2:/cygdrive/c/ntldr ./

Connected to 192.168.8.2.
Fetching /cygdrive/c/ntldr to ./ntldr
/cygdrive/c/ntldr       100%  245KB 245.3KB/s   00:00


==================[У матрицы сбой]=====================================

Что, думали всё ? А вот хер вам. Вышеперечисленное работает на Windows XP, но совершенно не хочет работать на Windows 2003. Те же конфиги, те же действия - и нифига. OpenSSHd стартует, принимает соединения, даже опрашивает методы авторизации, но не пускает ни по паролю, ни по ключам. Временное решение - freeSSHd. У него есть GUI-морда, и после настройки важно помнить одно правило - открытые ключи кладутся в указанный в настройках каталог, каждый ключ - в отдельный файл с именем виндового пользователя (без расширения, формат ssh-rsa XXXX username). Копировать файлы например из C:\1\ можно вот так:
sftp -r 'backuper@192.168.12.77:/1/*' ./
Да, так работает. Но копирует только файлы, ключ -r не копирует файлы из подкаталогов.

========[матрицу портировали на виндовс-7]===========

Под виндовс-7 глюки совершенно не похожи на глюки в XP или 2003-сервере:
 353 [main] sshd 1804 child_copy: linked dll data write copy failed, 0x2CC000..0x2CC040, done 0, windows pid 2284708, Win32 error 487
33271716 [main] sshd 1804 child_copy: linked dll data write copy failed, 0x2CC000..0x2CC040, done 0, windows pid 2284708, Win32 error 487
2455 [main] sshd 2744 child_copy: linked dll data write copy failed, 0x2CC000..0x2CC040, done 0, windows pid 2284708, Win32 error 487
Не, не работает. Совсем. Ни OpenSSHd, ни FreeSSHd. Где, где хваленая совместимость между версиями виндовс ?? Омфг. Фак, фак, фак !!!




Несколько дополнительных советов и замечаний.
1). Копирование большого количества мелких файлов по сети создает большие накладные расходы.
2). Виндовс до сих пор не имеет унифицированной кодировки в именах файлов. Избегайте не-англоязычных имен каталогов и файлов в путях, копируемых по SCP/SFTP. Во избежание совершенно ненужных проблем в будущем.
3). Скрипт, работающий на виндовс, может не просто паковать файлы с длинными русскими именами и большой вложенностью каталогов в один сжатый архив типа C:\Backups\Current_1Ass_data.7z , но еще и подсчитать контрольную сумму с помощью какого-нить sha1sum.exe . Это позволит проверить уже на никсовом сервере, правильно ли скопировался архив.


P.S. Статью буду пополнять, чтобы все матюги были в одном куске текста. Сейчас сил матюгаться уже просто нету - простая и дубовая технология, обкатанная долгими годами и надежно работающая на линуксах, *BSD, макоси и даже на куче железок разной степени управляемости (от кривых д-линков до теплых ламповых цисок), на винде превращается просто в какой-то лес деревьев доменов, густо завешанных граблями самых причудливых форм, размеров и расцветок, прям блять галлюциногенный трип в инопланетное царство граблей.

Изящый код.Говнобуки на улице Вязов

Comments

Unregistered user Sunday, October 9, 2011 12:17:25 PM

Megadmin writes: ну и хуй с того, что кодировка в винде до сих пор досовская? да и знают об этом все. в остальном статья пиздец хорошая.

Write a comment

New comments have been disabled for this post.

May 2012
M T W T F S S
April 2012June 2012
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31