воскресенье, 30 сентября 2012
29.07.2012 в 00:38
Пишет
sghpunk:
Удалённый доступ по RDP для "обычных" пользователей.Или OpenSSH для Windows, авторизация по ключам и "проброс" (туннелирование) портов.Задача: предоставить удалённый доступ через интернет к машине пользователя по RDP для этого самого пользователя.
Если для коллег IT-шников я практически без опасений могу предоставить полноценный VPN с доступом ко всей локалке (OpenVPN, Checkpoint Firewall VPN), то для остальных пользователей делать открытой всю сеть мне кажется очень небезопасным. Мало ли какие бывают вирусы и как они умеют сканировать сеть на уязвимости. (Конфикер в своё время "попил кровушки".) Поэтому, немного поразмыслив я остановился на довольно простом варианте — возможности "проброса" (туннелирования) портов с помощью OpenSSH. Но вот все сервера у меня под Windows, и вот тут началось "самое интересное".
читать дальшеСразу скажу, что есть такая штука, как FreeSSHd для Windows (статья по его настройке), вроде бы настраивается гораздо проще. Но я не ищу лёгких путей, т.к. у меня уже несколько лет прекрасно работает OpenSSH на Windows XP SP3 в качестве sftp сервера (и для "проброса" портов тоже), поэтому я решил не испытывать судьбу и использовать проверенный вариант.
Имеется контроллер домена под управлением Windows 2003 SP2 R2, на котором и необходимо настроить OpenSSH с возможностью авторизации по ключам (для пущей безопасности) и "проброса" портов. Мне очень помогла эта статья, но пришлось внести некоторые поправки. Для достижения искомого результата нужно:
- Скачать сборку OpenSSH для Windows, релиз староват, но зато проверен. Да и лень новую версию самому собирать.
- Устанавить её в C:\Program Files\OpenSSH
- В файле OpenSSH\etc\sshd_config, установить параметр:
UsePrivilegeSeparation yes
- Создать пустую папку: C:\Program Files\OpenSSH\var\empty
- Создать учётную запись пользователя для запуска sshd сервера:
net user sshd password /add /fullname:"sshd daemon" /homedir:"C:\Program Files\OpenSSH\var\empty"
В оснастке управления пользователями установить бесконечный срок действия пароля, а так же добавить этого пользователя в группу Доменных администраторов. Я сделал группу "Domain Admins" первичной и единственной.
- С помощью утилиты ntrights из Windows Resource Kit назначить специальные права для пользователя sshd:
ntrights +r SeAssignPrimaryTokenPrivilege -u sshd
ntrights +r SeCreateTokenPrivilege -u sshd
ntrights +r SeDenyInteractiveLogonRight -u sshd
ntrights +r SeDenyNetworkLogonRight -u sshd
ntrights +r SeDenyRemoteInteractiveLogonRight -u sshd
ntrights +r SeIncreaseQuotaPrivilege -u sshd
ntrights +r SeServiceLogonRight -u sshd
- Сделать пользователя sshd владельцем папки C:\Program Files\OpenSSH, а так же дать ему права на Чтение, Выполнение и Просмотр содержимого папки C:\Program Files\OpenSSH и всех находящихся в ней файлов и подкаталогов.
- Дать пользователю sshd права полного доступа на OpenSSH/var и все находящиеся в ней файлы и подкаталоги.
- Создать файлы group и passwd:
cd C:\Program Files\OpenSSH\bin
mkgroup -d > ..\etc\group
mkpasswd -d > ..\etc\passwd
подробности читать в файле readme или quickstart в каталоге docs.
- В оснастке управления службами (services.msc) установить запуск службы OpenSSH от имени созданного пользователя (sshd). И запустить/перезапустить службу. Если служба не запускается, режим отладки.
Для настройки авторизации по ключам:
- В файле: OpenSSH\etc\sshd_config установить значения:
RSAAuthentication yes
PubkeyAuthentication yes
PasswordAuthentication no
- Отключить проверку прав на файлы ключей. Штука полезная, но нужной комбинации прав я так и не смог подобрать. В файле: OpenSSH\etc\sshd_config устанавливаем значение:
StrictModes no
- В домашнем каталоге пользователя создать папку .ssh, а в ней файл authorized_keys2, содержащий публичный ключ пользователя и параметры для ограничения прав пользователя. Начало строки с ключом должно выглядеть примерно так:
no-agent-forwarding,permitopen="xxx.xxx.xxx.xxx:3389" ssh-rsa ...
Параметр permitopen ограничивает возможность туннелирования только на определённые порты и адреса.
- На папку .ssh, что в домашнем каталоге пользователя (и все файлы в ней), дать права: Пользователь=Чтение, Выполнение и просмотр содержимого, Система=полный доступ, Администраторы=полный доступ, Пользователь sshd=Чтение, Выполнение и просмотр содержимого (у меня пользователь sshd входит в группу Доменных администраторов, потому отдельные права для него давать не пришлось). И сменить владельца на Администраторы, чтобы пользователь не смог менять права и соответственно не повредил файл с ключами.
- Проследить, чтобы домашний каталог пользователя с папкой .ssh был доступен для пользователя sshd с контроллера домена, у меня домашние каталоги пользователей размещены на общем ресурсе.
- Убедиться, что пользователь имеет права Чтение/выполнение на папку OpenSSH\bin (можно дать эти права группе "Прошедшие проверку").
- Убедиться, что пользователь и его домашний каталог правильно прописан в OpenSSH\etc\passwd, а его группа в OpenSSH\etc\group.
- Для запрета пользователю запуска оболочки, в файле OpenSSH\etc\passwd пользователю вместо /bin/switch надо прописать оболочкой /bin/false. Но у меня для запуска этого /bin/false не хватает какой-то библиотеки, поэтому я прописал /bin/false.cmd, предварительно созданный с таким содержимым:
@echo off
pause
exit
Пользователь из под Windwows подключается с помощью скрипта, который заносит в реестр отпечаток ключа сервера и запускает plink.exe с параметрами:
@echo off
cd /d %~dp0
regedit -s hostkey.reg
plink.exe -ssh -P xxxxx -L 999:xxx.xxx.xxx.xxx:3389 -C -i priv_key.ppk user@host
После чего может подключаться по протоколу RDP к 127.0.0.1:999
Литература:
How to create a restricted SSH user for port forwarding?
man authorized_keys
SSH authorized_keys features
OpenSSH for Windows 2003 Server
ssh: Disable PasswordAuthentication per user (К сожалению, конструкция Match появилась уже в более новых версиях ) URL записи
@темы:
Технологии,
Полезное,
Статьи
fire-dragon, глубоких смыслов нет. Практически это заметка самому себе на память. Всё равно решил всё записать, чтобы не искать второй раз. А так подумал, вдруг кому ещё пригодится, чтобы не пылилось зря.
А спорить я не хочу. )
Рассмешил