Есть ли уникальный идентификатор компьютера, который можно надежно использовать даже на виртуальной машине?

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

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

Я рассматривал различные уникальные идентификаторы, такие как идентификатор процессора, идентификатор продукта Windows, идентификатор компьютера и другие пользовательские интерфейсы. Поскольку сервер терминалов является виртуальной машиной, я не могу найти ничего, что полностью уникально для этой машины.

Любые идеи о том, что я должен изучить, чтобы сделать это в основном безопасным. У меня нет времени или необходимости сделать его максимально безопасным, потому что он победит цель самого приложения.

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

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

Альтернативно вместо того, чтобы пытаться идентифицировать машину, мне может быть лучше, идентифицируя пользователя и создавая разрешение на основе группы, обрабатываемое через AD для доступа к этому программному обеспечению.

Ответ 1

По дизайну уникальная идентификация виртуальной машины сложна; все, что позволяло вам однозначно идентифицировать его, означало бы, что оно не было полностью виртуальным (поскольку клонирование виртуальной машины должно производить идентичную машину).

  • Создайте приложение сердцебиения на главной машине, которая связывается с виртуальной машиной через сетевой адаптер loopback.
  • Попросите приложение heartbeat отказаться, если оно не может однозначно идентифицировать хост-машину.
  • Отказ основного приложения не запускаться, если приложение heartbeat не работает.

Вам нужно будет найти способ убедиться, что приложение heartbeat не может быть легко обмануто.

Невозможно защитить программу терминала на 100%. Этот вопрос эквивалентен попытке предотвратить пиратство программного обеспечения.

Ответ 2

Лучшее, что я нашел, это UUID BIOS, но это далеко не идеально подходит для вашего использования.

SMUIOS UUID, доступный внутри виртуальной машины, также используется гипервизором VMware и инструментами управления как VirtualMachine.config.uuid(см. свойство uuid на этой странице). Это означает, что он гарантированно будет уникальным на конкретном хосте или в конкретном vCenter. Однако его можно дублировать на отдельных хостах или отдельных установках vCenter.

Кроме того, UUID BIOS на виртуальной машине изменен. Он может быть изменен через API (хотя и не легко через клиента).

Это, вероятно, подходит к вашей отметке 95%, так как это потребует особых усилий и настройки для точного дублирования виртуальной машины.

Однако, с точки зрения обеспечения виртуализации (включая такие вещи, как восстановление после сбоя виртуальной машины и будущие обновления программного обеспечения для виртуализации): использование идентификатора оборудования, такого как UUID или MAC-адрес, вызывает всевозможные проблемы. Когда они хотят обновить версию ОС под вашим программным обеспечением, как правило, создавая новую виртуальную машину, им необходимо вручную отредактировать конфигурацию виртуальной машины для обоих серверов, чтобы изменить соответствие UUID. Используя MAC, если они меняют сетевую архитектуру, ваше программное обеспечение требует, чтобы виртуальная машина была специальным случаем. Эти вещи просто вызывают головные боли для виртуального администратора (но они могут быть точной головной болью, которую вы пытаетесь вызвать, - только вы точно знаете).

Я бы рекомендовал использовать упомянутый вами подход на основе разрешений или даже сервер параллельного лицензирования, если это необходимо. Но я исхожу из тяжело-виртуального фона, где уже привязаны к аппаратным лицензиям.

Ответ 3

Самое простое решение - использовать адрес mac, но обратите внимание, что его легко изменить в Windows с помощью редактирования реестра. Я бы сказал, что менее 5% людей знают, как это сделать.

Здесь, как получить адрес mac в С#:

System.Net.NetworkInformation.NetworkInterface.GetPhysicalAddress();

Ответ 4

Вы можете привязать лицензию к MAC-адресу сетевой карты (или карт, если их несколько).

Конечно, изменение сетевой карты остановит работу вашего программного обеспечения.

Если/Когда TPM становится стандартным для серверов, вы должны иметь возможность использовать его для аутентификации сервера.

Ответ 5

Вы можете получить MAC-адрес ПК, как показано ниже: http://www.java2s.com/Code/CSharp/Network/GetMacAddress.htm

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

Ответ 6

расширяется по подходу macaddress. вы можете использовать macaddress с функцией md5 вокруг него с SALT, который был известен только системе владельцы. таким образом, macaddress бесполезен, не зная SALT.

просто моя таппенс стоит..:)

[edit] - см. также пример С# для хеширования/соления и т.д.:

MD5 хэш с солью для хранения пароля в БД на С#

http://www.obviex.com/samples/hash.aspx

Ответ 7

Если вы хотите 95%, я бы пошел с Mac ID - он может быть подделан, но по умолчанию уникален для машины.