Удалённый доступ между компьютерами на базе ОС Windows с использованием RSA-алгоритма аутентификации

    В этом посте я решил поделиться реализацией дополнительной аутентификации пользователя, при доступе к компьютеру через удалённый рабочий стол на базе ОС Windows, с использованием RSA-алгоритма

    Задача


    Обеспечить доступ к удалённому компьютеру только определенным пользователям.

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

    И тогда предложил ему аутентификацию с помощью асимметричного алгоритма.

    Читать

    Идея


    Необходимы:
    1. Генератор открытого ключа (ОК) и секретного ключа (СК);
    2. Серверная часть, которая будет запускаться при прохождении windows-аутентификации, и ждать от пользователя СК;
    3. Пользовательская часть — отправляет к серверной части СК.

    Реализация


    Этап первый

    Организовали VPN-соединение для работы под терминалом.

    Этап второй — настройка удалённого компьютера

    1. Устанавливаем серверную часть;
    2. Генерируем ОК и СК;
    3. Запрещаем редактирование, чтение файла для всех, кроме пользователя, под которым запускается серверная часть;
    4. В настройках пользователей при работе через удалённый рабочий стол указываем, что серверную часть нужно сразу запускать при входе пользователя:


    Расскажу подробнее о серверной части, точнее что происходит после ее запуска.
    В первую очередь — блокировка движений мышки и игнорирование нажатий кнопок на клавиатуре. Пользователь на своём компьютере спокойно может работать, но в терминале удалённый компьютер игнорирует действия пользователя до тех пор, пока пользователь не отправит ему правильный СК. Тайм-аут стоит 3-5 минуты. Если за это время СК не был отправлен — сервер завершает сеанс удалённого рабочего стола.
    Если СК — правильный — пользователю предоставляется доступ.

    Этап третий — настройка пользовательского компьютера

    1. Устанавливаем клиентскую часть;
    2. Настраиваем удалённый рабочий стол;
    3. Копируем на съемный носитель СК.

    Как это всё работает


    Пользователь открывает сеанс удаленного рабочего стола и проходит windows-аутентификацию:


    После этого, сервер сразу запускает нашу серверную часть и блокирует любые действия, отправляет клиенту массив случайных байтов (открытый текст), запускается таймер 3-5 минут.

    Пользователь запускает свою часть, указывает секретный ключ с помощью которого происходит шифрование ОТ и отправка результата шифрования серверу.
    Сервер, с помощью ОК, расшифровывает шифрт-текст и сравнивает с ОТ.

    Если ключ подходит или не подходит, пользователю эта информация выдается на экран. В данном случае СК подошёл и пользователь может работать на удалённом компьютере.


    Характеристики


    • Длинна ключа: 128 байт
    • Использование для использования любого порта
    • Возможности вести логи


    Где можно применить

    Можно ограничить доступ к своему компьютеру или, как в данной ситуации, между офисами в разных местах.

    Исходники выложу вечером.

    UPD: Читая комментарии, Хабрачитателю может стало не понятно зачем всё так было сделать. Сделаю небольшое отступление:
    Верно было сказано, что можно реализовать с помощью разных технологий, но основная проблема, даже требование, которое было выдвинуто — быстрота развёртывание на новой машине и предоставление доступа определенному пользователю, а не компьютеру. Да, настроить доступ по IP — можно, но человеческий фактор будет присутствовать. В моём случае тоже — но тут сводится к потере/передаче СК третьему лицу
    Поделиться публикацией

    Комментарии 37

      +1
      А если сделать сертификат для компьютеров и делать аутентификацию компьютера по SSL/TLS? Тогда даже если и пароль пользователя в терминал будет скомпрометирован, то подключиться с компа о котором не знает сервер не получиться.
      А этот функционал уже реализован в RPD 5.2.
        0
        Реализовано было 1,5 года назад + лишние затраты на покупку RDP? вы же имели в виду RDP?
        Плюс, если win «полетит» мой метод отнимет 2 минуты на настройку работы.
          +2
          очепятка RPD = RDP это то же что и mstsc.exe, конечно же.
          да, если вин полетит — конечно сложно будет.
          Ещё есть openVPN там тоже происходит авторизация по ключу, но это для установление VPN соединения. Т.е. можно сделть такую логику. Если юзер подключился через VPN с использованием ключа выданного ему, то мы предполагаем, что юзер — это юзер и разрешаем всё остальное. без доп. заморочек.
          Если у юзера стырили ключ, то мы ничего не можем с этим поделать, пока мы не знаем, что ключ скомпрометирован, единственное, если сидит где-то троян, то ключ для опенВПН найти легче, чем понять как же работает правильная авторизация в вашем случае и стырить ключ и софт.
            0
            Задача была дать доступ не компьютеру, а человеку, у которого есть ключ.
            Если ключа нет — то и доступа нет.
            VPN есть у всех, для синхронизации баз 1С.
        +2
        Зачем эти костыли? RDP в win7 и вин2008 работает с помощью TLS, это куда более надежное решение чем сравнение ваших байтиков. Опять же — есть IPSec, VPN.
          –1
          На момент реализации о win7 и 2008 мечтали.
          Уточните, как не опытный пользователь, например бухгалтеру, объяснить как использовать VPN и IPSec.
          Как обеспечить поднятие новой рабочей станции без системного администратора, который все это настраивал и уже уехал из страны, — к примеру.

          Интеграция этого метода было еще и для использования 1С на УК, т.е. она не только выполняет аутентификацию но и взаимодействует с 1С, но об этом детальнее рассказать, к сожалению не могу.
            +2
            Пользователь вообще не в курсе будет, что для хождения RDP ходит внутри IPSec. Нет центра сертификации — используйте preshared key, решение будет практически такое же. Есть домен — IPSec настраивается политиками централизованно, от подсетей до отдельных протоколов и хостов.
              0
              Спасибо, согласен, решение красивое. Только каким образом можно разрешить доступ например Васе и Маше, а остальным запретить? Например, кто-то сядет за компьютер Маши и начнет им пользоваться — он же сможет зайти на УК?
                +2
                Логины и пароли открыты археологами уже достаточно давно. Прозреваю, что гугл тоже о них имеет информацию.
                Плюс ко всему — есть возможность использовать сертификаты, выдаваемые КАЖДОМУ пользователю. Думаю, совместно с ними можно использовать алладиновские етокены, кои стоят очень бюджетно. Если уж речь идет о ЗАЩИТЕ.
                  0
                  алладиновские сразу отпали — руководству денег было жалко.
            0
            Аргументируйте, чем это решение не надёжное?
            Был проведен криптоанализ, анализ построенной системы по стандарту ISO/IEC 27001/2005.
            И ни кто не мешает увеличить размер ключа.
            0
            Кстати, единственный минус этой системы — распределение ключей.
              0
              а чем плохо просто ограничение доступа на порт по IP?
                0
                Прочитайте, пожалуйста внимательно топик и комментарии, — нужно разрешить доступ человеку, а не компьютеру.
                  +1
                  за ПК работает 100500 человек — и все хакеры, кроме тех, кому разрешен доступ?
                  или это публичный ПК, стоящий в библиотеке?
                    0
                    Вы заставляете меня открывать тайны :)
                    Более 10 филиалов, от 10 до 50 компьютеров в филиале.
                    Доступ к управлению к «серверу» имеет 2-5 человек всего. Остальные только автоматом синхронизируют базы 1С, для этого они используют VPN, точнее все работает в автоматическом режиме.
                0
                Подскажите пожалуйста. Есть сервер терминалов на 2003 win. При подключении пользователей автоматически запускается 1С. Нужно как-то разграничить, чтобы доступ к терминалам у пользователей 1С был только из локальной сети (с инета чтоб они не смогли подключится), а у админа и с инета. Сейчас доступ есть у всех и с инета в том числе.
                  0
                  Разрешить группе пользователей только доступ по IP под их учётной записью. Тут я не помню, можно ли это сделать средствами самого 2003, а админу ограничение снять по IP.
                    0
                    «Разрешить группе пользователей только доступ по IP под их учётной записью» вот я и не могу разобраться как это сделать…
                      0
                      У вас поднят Прокси-сервер на сервере или фаервол?
                        0
                        прокси нет. фаервол виндовский.
                        0
                        Как вариант, использовать не стандартный порты для УРС:
                        Для сервера
                        Для пользователя
                        Из дома пользователи будут по-дефолтовому порту подключаться, а сервер будет ожидать на другом — подключиться не смогут.

                        Если есть фаервол — настроить правила на фаерволе.
                          0
                          то есть, я могу в брэндмауэре указать диапазон для 3389 только локальная сеть, а порт для админа использовать не стандартный? сервер терминалов будет два порта слушать? хотя все равно хотелось как-то по сложнее чтоб было…
                            0
                            В фаерволе можно указать, что доступ к серверу на порт, например 3389 разрешен с 12.12.12.12 и 11.11.11.*.
                            Я таким не занимался, что бы вам сказать что-то конкретное. Но что-то мне подсказывает, что сервер терминала будет слушать только один порт, хотя я и могу ошибаться.
                            Но я бы просто на фаерволе, не виндосовском, установил правила. Раньше у меня стоял Kerio WinRoute firewall на сервере и там я настроил под себя правила для доступа через терминал. но это уже было более 2х лет назад. Если же ничего нет на сервере из фаерволов, то вижу смену порта. Может есть и другие решения…
                            Терминальные службы Windows 2003может это вам еще пригодиться, там описан процесс использования терминалов с использованием лицензий
                              0
                              Два порта действительно слушать не будет. Вы правы. Проблема в том, что у админа айпи динамический, так что тут фаерволами не настроишь…
                                0
                                Тогда использование другого порта, или админу поставить RDP
                                  0
                                  С портом ясно. А что значить поставить RDP? Админ на данный момент может подключаться к серверу через инет посредством УРС. Но и все остальные пользователи УРС. А нужно чтобы пользователь могли только в локальной сети, а админ и через инет.
                                    0
                                    Немного не правильно сказал.
                                    Смотрите, например, пользователям вы оставляете УРС на другом порте, и они через него работают, а для администратора использовать аналоги Remote Desktop.
                                      +1
                                      понял. да была такая мысль, если ничего не придумаю, то наверно так и сделаю. на самом деле хочется как можно лучше обезопасить сервер.
                    +2
                    это что-то типа stunnel+rdp?
                      0
                      это просто дополнительная аутентификация
                        0
                        а, понял, здесь всё намного проще, чем мне показалось из названия статьи

                        что-то мне подсказывает, что такую защиту обойти не сложно, нужен лишь более-менее толковый программист
                          0
                          Не правильно вам что-то подсказывает. Что именно сделает ваш толковый программист?
                            0
                            например: при подключении к удалённому рабочему столу можно на стороне клиента указать программу, которая будет выполнена при подключении. указать там что-нибуть вроде «taskkill /f /im try.exe»… вроде должно сработать
                              0
                              А кто будет знать как называется файл? Особенно, если он спрятан под svchost :)
                              Кстати, вы случайно не знаете, что первым выполняется: выполняется программа при подключении первая которая указана на сервере пользователю, или та, которая у пользователя стоит?
                                +1
                                >А кто будет знать как называется файл?
                                программист :)

                                >Кстати, вы случайно не знаете, что первым выполняется: выполняется программа при подключении первая которая указана на сервере пользователю, или та, которая у пользователя стоит?

                                только что провёл эксперимент — если задано со стороны сервера, клиентская настройка игнорируется.
                                  0
                                  Вот, следовательно taskkill отпадает :)

                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                    Самое читаемое