Русский
Русский
English
Статистика
Реклама

Из песочницы CIFS over SSH штатными средствами Windows 10

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


Однажды в потребовалось мне организовать доступ к серверу по протоколу SMB и в поиске решения я наткнулся на следующую статью: Mounting your Nikhef home directory using SSH for Windows 8. Это было простое и удобное решение, которое использовало Putty. Чуть позже мне пришлось настраивать это решение на другом компьютере и я понял, что Putty тут лишний с тех пор как в Windows 10 появился встроенный ssh-клиент на основе OpenSSH.


Под катом идентичная схема, только с использованием OpenSSH под Windows 10.


У меня схема организована следующим образом:


  1. На сервере запущена Samba, от имени пользователя www-data расшарена корневая папка с сайтами. Доступ к серверу только через ssh с авторизацией по ключу. Сервер за NATом, порт проброшен только для ssh.
  2. В процессе входа в аккаунт на домашней машине на Windows 10 через встроенный в систему OpenSSH устанавливается соединение с сервером с авторизацией по ключу.
  3. Туннелируется порт 445 удаленной машины на локальный порт 44445 сетевого loopback-адаптера доступного по адресу 10.255.255.1
  4. На loopback-адаптере 10.255.255.1 порт 44445 проксируется на локальный 445. Таким образом при подключении к \\10.255.255.1\ открывается удаленная шара с файлами (которая, при необходимости монтируется как сетевой диск).

Всё это автоматом лень торжествует. Безопасно, быстро и нативно выглядит. Любым редактором могу открывать и править файлы на удаленном сервере как у себя на локальном без проблем с загрузкой правленых файлов и установкой им необходимых разрешений. При этом нет проблем с безопасностью Samba.


Итак сперва по шагам:


На стороне WINDOWS


Должен быть установлены OpenSSH. В Windows 10 и Windows Server 2019 появился встроенный SSH клиент на основе OpenSSH. Им мы и воспользуемся. Сначала убедимся что он установлен наберем в командной строке


ssh


Если видим исполнение команды все "Ок", клиент присутствует в системе.


Шаг 1. Настройка сетевого адаптера


Устанавливаем loopback-адаптер в системе. Мы будем обращаться по адресу к локальному адаптеру.


hdwwiz.exe


Запустится Мастер установки оборудования (Здесь я пользуюсь русской Windows 10 Pro).


Далее -> Установка оборудования, выбранного из списка вручную -> Сетевые адаптеры -> Microsoft > Адаптер замыкания на себя Microsoft KM-Test -> Далее


Уверен, что эти шаги можно сделать из командной строки, но не нашел способ установки драйвера без devcon.exe, потому и не стал заморачиваться с автоматизацией этого шага.


Далее уже в CMD (от имени Администратора).


netsh interface show interface


Видим появился второй адаптер. У меня он называется Ethernet 2.


Теперь настроим адрес для этого адаптера




Или из командной строки:


netsh interface ip set address name="Ethernet 2" source=static address=10.255.255.1 mask=255.255.255.0

В результате у нас появился адаптер локально доступный по адресу 10.255.255.1


Теперь проблема в том, что нам необходимо получить доступ к общей папке через TCP-порт 445, но при загрузке Windows этот порт захватывается системным драйвером lanmanserver для всех интерфейсов. Отложив запуск драйвера lanmanserver и установив правило portproxy, мы можем обойти это.


Далее в командной строке от имени администратора меняем режим запуска сетевых служб (пробел после start= обязателен!!!):


sc config lanmanserver start= demandsc config iphlpsvc start= auto

и настраиваем для адаптера с адресом 10.255.255.1 проксирование порта 44445 на локальный порт 445


netsh interface portproxy add v4tov4 listenaddress=10.255.255.1 listenport=445 connectaddress=10.255.255.1 connectport=44445

Теперь необходимо перезагрузиться, чтобы схема перехвата порта у службы lanmanserver сработала.


Проверяем что прослушивание порта осуществляется нашим loopback-адаптером, просмотрев открытые в системе порты


netstat -an | find ":445 "

Если мы видим


TCP    10.255.255.1:445    0.0.0.0:0       LISTENING

значит все в порядке и порт прослушивается на нужном адресе. Если же мы видим "0.0.0.0:445" значит в нашей схеме что-то не сработало правильно. Проверить правила переадресации портов можно командой


netsh interface portproxy show v4tov4

Шаг 2. Ключ и рабочий скрипт


Создаем папку для вспомогательных файлов. Встроим, так сказать в систему наш способ.


mkdir %APPDATA%\CIFSoverSSHcd %APPDATA%\CIFSoverSSH

Генерируем ключ для ssh-авторизации (назовем его, например: cifsoversshkey)


ssh-keygen -t rsa -N "" -f cifsoversshkey 

В результате будет сгенерирована пара открытого и закрытого ключа. Для того, чтобы OpenSSH не выдавал сообщение UNPROTECTED PRIVATE KEY FILE! нужно изменить права на файл ключа. Задачу мы будем запускать для одного пользователя, от имени которого мы собираемся работать в Windows. Можно через GUI, но мне мне показалось что картинок уже достаточно. В Windows это сделаем следующей командой:


icacls cifsoversshkey /RESETicacls cifsoversshkey /grant Имя_Пользователя:F /inheritance:r

В результате текущий пользователь будет назначен владельцем, отключено наследование и удалены унаследованные права. Проверить мы это сможем командой


icacls cifsoversshkey 

Должны быть права только для текущего пользователя, иначе файл ключа не будет принят программой OpenSSH и соединение не будет подниматься!


Создадим в текущей папке пакетный файл cifsoverssh.cmd следующего содержания:


call cmd /c start "" /B C:\Windows\System32\OpenSSH\ssh.exe user@111.111.111.111 -p remoteport -i %APPDATA%\CIFSoverSSH\cifsoversshkey -L 10.255.255.1:44445:localhost:445 -N -o "StrictHostKeyChecking=no"

Где:
user@111.111.111.111 пользователь на стороне linux сервера @ адрес удаленного сервера


Шаг 3. Ярлык или задача в планировщике


Создаем ярлык для следующей команды: powershell -nologo -noninteractive -windowStyle hidden -command "%APPDATA%\CIFSoverSSH\cifsoversshkey.cmd"
Это позволит запускать наш пакетный файл через powershell без открытия окна. Если запускать его через CMD будет открываться черное окно терминала и будет висеть все время, пока соединение будет установлено, а это неудобно и некрасиво.


Для автоматизации запуска при входе в систему можно создать задачу в планировщике:


schtasks /CREATE /RU %username% /TN "CIFS over SSH" /TR "powershell.exe -nologo -noninteractive -windowStyle hidden -command %APPDATA%\CIFSoverSSH\cifsoversshkey.cmd" /SC ONLOGON /DELAY 0000:10 /IT /RL highest

На стороне клиентского компьютера Windows все приготовления были закончены.


Настройка Linux сервера


Предполагается, что ssh-сервер был предварительно настроен и включена авторизация по ключу.


Подключаемся по ssh из командной строки на windows-машине


C:\Windows\System32\OpenSSH\ssh.exe user@111.111.111.111 -p remoteport

В домашней папке пользователя, от имени которого мы будем авторизовываться при создании туннеля ищем файл ~/.ssh/authorized_keys (если файл отсутствует создадим его).


mkdir ~/.ssh && touch ~/.ssh/authorized_keys

Теперь необходимо в этот файл вставить содержимое нашего файла публичного ключа, созданного на нашей windows-машине (файл %APPDATA%\CIFSoverSSH\cifsoversshkey.pub). Откроем его в любом редакторе и вставим цепочку ключа с новой строки. Если есть другие ключи, просто вставим его с новой строки.


Устанавливаем Samba (на примере Debian)


apt update && apt install samba

Переименовываем старый файл настроек и создаем новый файл


mv /etc/samba/smb.conf /etc/samba/smb.conf.oldtouch /etc/samba/smb.conf

Открываем пустой файл настроек и приводим его к следующему виду:


[global]realm = webserverserver string = Web serverworkgroup = WORKGROUP# Setup charsetsdos charset = cp1251unix charset = utf8# Disable printersload printers = Noshow add printer wizard = noprintcap name = /dev/nulldisable spoolss = yes# Setup logginglog file = /var/log/smbd.logmax log size = 50max xmit = 65536debug level = 1# Setup daemon settingsdomain master = Nopreferred master = Yessocket options = IPTOS_LOWDELAY TCP_NODELAY SO_SNDBUF=65536 SO_RCVBUF=65536 SO_KEEPALIVEos level = 65use sendfile = Yesdns proxy = Nodont descend = /proc,/dev,/etcdeadtime = 15# Enable synlinksunix extensions = Nowide links = yesfollow symlinks = yes# Securtity settingssecurity = usermap to guest = Bad Passwordguest account = nobodycreate mask = 0664directory mask = 0775hide dot files = yesclient min protocol = SMB2client max protocol = SMB3[ShareName]comment = Sites folderpath = /home/webforce user = www-dataforce group = www-dataread only = Noguest ok = Yeswritable = yescreate mask = 0664directory mask = 2775

В последней секции мы настраиваем непосредственно шару. В названии секции указываем имя шары ShareName. Path = путь к файлам, которые мы хотим расшарить. В параметрах force user и force group указываем linux-пользователя, от имени которого будут сохраняться файлы при изменении и создании в шаре. Так как у меня там лежат файлы для веб-сервера у меня пользователь www-data


Перезапускаем Samba


systemctl restart smbd

Отключаемся и выходим в командную строку Windows


exit

Всё готово. Теперь остается только запустить наш ярлык или выйти из профиля пользователя windows и снова войти (если вы создали задачу в планировщике).


После этого ваша удаленная шара будет доступна по адресу \10.255.255.1\ShareName Можно даже монтировать её как сетевой диск.

Источник: habr.com
К списку статей
Опубликовано: 17.11.2020 00:09:32
0

Сейчас читают

Комментариев (0)
Имя
Электронная почта

Системное администрирование

Cifs

Ssh

Openssh

Windows 10

Удаленный доступ к файлам

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru