01Что такое RSG и зачем он нужен.
Revit Server Guard — программный шлюз, который ставится на тот же хост, что и Autodesk Revit Server. Он перехватывает TCP- и HTTP-трафик к портам RS, читает его метаданные (кто пользователь, какой проект, какой раздел, какое действие) и применяет правила доступа, которых нет в самом Revit Server.
Из коробки Revit Server проверяет только аутентификацию через Active Directory. Любой залогиненный AD-пользователь видит список всех проектов на сервере и может открывать любой из них — даже те, к которым он не должен иметь отношения. Для маленькой команды на 3 человека это нормально; для бюро на 50+ архитекторов и 30+ параллельных проектов — это утечка данных и потенциальный inside-leak во время судебных и арбитражных историй.
Кому это нужно
- Проектным бюро, которые ведут несколько заказчиков параллельно и не хотят, чтобы команда заказчика А видела, что делается для заказчика Б.
- BIM-координаторам, которым нужно разделять права на уровне разделов модели — конструкторы видят и редактируют структуру, инженеры МЭП — свой раздел, и так далее.
- Подрядчикам и фрилансерам, которым отдают доступ временно, на конкретный проект и конкретный раздел, и которых нужно заблокировать одной кнопкой по окончании.
- Командам с регуляторными требованиями (госконтракты, объекты с ограниченным доступом), где обязателен журнал кто-что-когда открывал.
02Четыре компонента, один Windows-хост.
RSG — это не один монолит, а четыре отдельных бинарника, которые ставятся вместе. Это сделано осознанно: каждый компонент отвечает за свой контур и при необходимости перезапускается независимо.
Что делает каждый компонент
- RSG.Proxy — TCP/HTTP-прокси, который слушает на порту 5443 вместо штатного RS-порта. Распаковывает SOAP-конверты Revit Server, достаёт метаданные запроса, спрашивает у RSG.Server: «можно?» — и либо пропускает, либо возвращает
403клиенту. - RSG.Server — Windows-сервис на .NET 8, который держит правила доступа в локальной SQLite/SQL Server, ведёт журнал аудита, проверяет лицензию и общается с License API. Это «мозг» решения.
- RSG.AdminPanel — React SPA, доступная на
localhost:8080(или внутри корпоративной сети по HTTPS). Через неё админ создаёт пользователей, проекты, правила и смотрит аудит. - RSG.LicenseTool — отдельный CLI-инструмент для оффлайн-активации. Используется только в air-gapped сетях, в обычной онлайн-инсталляции не нужен.
03Три уровня прав: проект, раздел, действие.
RSG разрешает права не «всё или ничего», а гранулярно. Вы не выдаёте «доступ к серверу» — вы выдаёте «доступ к проекту X, разделу Архитектура, только чтение». Под капотом это происходит на уровне SOAP-запросов Revit Server, где RSG смотрит на тип операции и принимает решение.
Уровни
- Проект. Базовый юнит — целый
.rvt-проект на сервере. Пользователь либо видит проект в списке, либо нет вообще (не получает его в листинге). - Раздел модели. Архитектура, Конструкции, МЭП, Координация — каждый раздел может иметь свои права. Подрядчик-инженер открывает только свой раздел, остальное даже не подтягивается в Revit-клиент.
- Действие.
read,edit,sync,publish,create_local,borrow_workset. Просмотр без правки — отдельное право от правки без публикации.
Роли и группы
Пользователи и AD-группы привязываются к ролям. Роль — это набор разрешений для конкретного проекта и его разделов. Один пользователь может иметь разные роли в разных проектах: «координатор» в одном, «наблюдатель» в другом, «нет доступа» в третьем.
Ниже — как это выглядит в админ-панели. Матрица: проекты по строкам, роли по столбцам, в ячейках — состояние разрешения.
Матрица прав · 12 проектов
| Проект | @arch_team | @struct_eng | @mep_partner | @viewers |
|---|---|---|---|---|
Легенда: полный доступ · только чтение · по разделам · нет
Пример конфигурации правила
Каждое правило выражается JSON-документом, который можно как редактировать через UI, так и импортировать пакетно из CSV/JSON для миграции с самописных решений.
{ "id": "rule-mep-partner-nexus", "projectId": "nexus-tower-phase-2", "appliesTo": { "groups": ["DOMAIN\\mep_partner"], "users": ["[email protected]"] }, "sections": [ { "name": "Architecture", "actions": ["read"] }, { "name": "Engineering — MEP", "actions": ["read", "edit", "sync"] } ], "validFrom": "2026-04-01T00:00:00Z", "validUntil": "2026-12-31T23:59:59Z", "denyOnExpired": true }
04Веб-админка вместо CLI и реестра.
Всё управление — через React-SPA, доступную локально на хосте RSG. Никаких regedit, gpedit, ручных правок XML. Админ открывает страницу в браузере, видит дашборд, лицензию, аудит и матрицу прав. Если нужен удалённый доступ — поднимается за reverse-proxy с TLS.
Главная — dashboard. Сверху — четыре числа за сутки, ниже — лента событий и панель лицензии.
Скриншоты лучше работают здесь — внутри раздела про админ-панель.
Посетитель уже понял архитектуру RSG и теперь видит доказательство: интерфейс не абстрактный, а готовый рабочий инструмент для управления разделами, бэкапами и статистикой Revit Server.
Матрица разделов и список доступа
Бэкапы по проектам
Статистика и выгрузки
Dashboard · сегодня
Nexus Tower / ArchitectureRiverside / MEPDatacenter / ArchitectureSchool #1284 / AllNexus Towerrule-mep-partner-nexus обновлено05Каждое действие — в журнале.
Аудит — не опциональная фича, а часть основного потока. Каждый запрос, который проходит через RSG.Proxy, оставляет запись: кто, что, к какому проекту/разделу, какое действие, какой результат, с какого IP, с какой версии Revit. Логи хранятся локально, экспортируются в CSV/JSON/SIEM.
Что фиксируется
- Identity: AD-логин, IP, версия Revit-клиента, имя машины пользователя.
- Target: ID проекта, имя файла, раздел/workset, ID элемента (если применимо).
- Action: open, sync_to_central, reload_latest, create_local, publish, delete_local, borrow_workset, и т.п.
- Result: allow / deny / warn (warn — не заблокировано, но помечено для ревью).
- Context: по какому правилу принято решение, метка времени с TZ, длительность операции.
В админ-панели — таблица с фильтрами по любому полю. По клику на строку открывается полный JSON события.
Журнал аудита · 1 284 события за 24ч
| Время | Пользователь | Действие | Объект | IP | Правило |
|---|---|---|---|---|---|
| 12:42:18 | m.kovalev | open | Nexus Tower / Architecture | 10.0.42.18 | arch-team-default |
| 12:41:54 | k.ivanov | sync | Riverside / MEP | 10.0.42.31 | rule-mep-partner |
| 12:38:02 | a.smirnova | deny | Datacenter / Architecture | 10.0.42.55 | — |
| 12:35:11 | d.petrov | publish | School #1284 / All | 10.0.42.07 | arch-team-default |
| 12:32:48 | k.ivanov | warn | Nexus Tower / Engineering MEP | 10.0.42.31 | rule-mep-partner |
| 12:31:09 | m.kovalev | create_local | Nexus Tower | 10.0.42.18 | arch-team-default |
| 12:28:33 | e.morozov | deny | Mariinsky / All | 81.211.94.210 | ip-allowlist |
06Подписанная лицензия с привязкой к машине.
Лицензия RSG — это подписанный конверт (LicenseEnvelope), который содержит payload с правами и подпись. Подпись делается на нашей стороне приватным ключом ECDSA P-256, проверяется на стороне клиента публичным ключом, который вшит в бинарник RSG.
Это значит: подменить лицензию или поднять «свой License API» по тому же URL невозможно без приватного ключа. Кейген физически не существует — нужно либо взломать ECDSA P-256 (теоретически нереалистично), либо украсть приватный ключ из нашего HSM.
Machine fingerprint
Лицензия привязывается к машине через fingerprint — SHA-256 от детерминированной строки, собранной из имени машины и MAC-адресов сетевых карт.
// MachineFingerprint.cs · упрощённо var input = string.Join("|", Environment.MachineName.ToUpperInvariant(), NetworkInterface.GetAllNetworkInterfaces() .Where(n => n.OperationalStatus == OperationalStatus.Up) .Where(n => n.NetworkInterfaceType != NetworkInterfaceType.Loopback) .Select(n => n.GetPhysicalAddress().ToString()) .OrderBy(m => m)); var hash = SHA256.HashData(Encoding.UTF8.GetBytes(input)); return Convert.ToHexString(hash).ToLowerInvariant(); // → "a3b7c9d2e8f1...f102" (64 hex chars)
Сетевые карты сортируются — это важно. Если в системе несколько MAC, порядок их перечисления операционкой может меняться, сортировка убирает эту нестабильность. Имя машины приводится к верхнему регистру по той же причине.
Онлайн и офлайн активация
Когда на хосте есть исходящий HTTPS на наш домен — активация делается одним кликом из админ-панели. RSG.Server отправляет JSON с fingerprint и метаданными, License API возвращает подписанный envelope, который сразу применяется.
Когда сети нет (закрытый контур, гос-сегмент, изолированный полигон) — активация идёт через файлы:
- В админ-панели → «Сгенерировать запрос лицензии» → файл
request.rsgreqна флешку. - В личном кабинете на сайте → «Активировать офлайн» → загрузить
.rsgreq→ получитьlicense.rsglic. - Загрузить
.rsglicобратно в админ-панель. Готово.
bypass — защита снимается, Revit Server работает как до установки RSG. Это сделано осознанно: мы не хотим, чтобы клиент в 23:50 в пятницу упирался в неработающий продакшн. Когда лицензия восстановлена, RSG возвращается в full автоматически.
07За один вечер: от установщика до первой роли.
RSG ставится Windows-инсталлятором (MSI или EXE). Никаких docker, никаких kubernetes, никаких внешних зависимостей кроме .NET 8 LTS Runtime — он либо уже стоит на Windows Server 2022/2025, либо подтягивается инсталлером.
Что нужно до установки
- Windows Server 2019 / 2022 / 2025 на том же хосте, где Revit Server.
- Учётная запись с правами админа на этот хост.
- Доступ к БД Revit Server в read-only (RSG не пишет в неё, только читает метаданные проектов).
- Один свободный TCP-порт (по умолчанию 5443) — на него встанет RSG.Proxy.
- ~250 МБ места под установку, ~5 ГБ под журнал аудита на полгода.
Шаги
- Скачать
RSG-Setup-2.4.1.exeиз личного кабинета. - Запустить инсталлер от имени админа. Указать порт прокси и путь к БД RS.
- Открыть
http://localhost:8080— мастер первого запуска предложит создать суперюзера админ-панели. - Импортировать пользователей из AD (одной кнопкой) или вручную.
- Создать первое правило доступа на тестовом проекте.
- Перенаправить Revit-клиенты на новый порт прокси (через DNS или групповую политику).
Конфигурация
Основные параметры — в appsettings.json RSG.Server. Большинство админов туда никогда не заходят — всё настраивается через UI — но иногда нужно.
{ "RSG": { "ProxyPort": 5443, "AdminPanelPort": 8080, "RevitServer": { "DatabasePath": "C:\\ProgramData\\Autodesk\\Revit Server 2025\\Data", "InternalPort": 80 }, "Audit": { "RetentionMonths": 18, "SiemWebhook": "https://siem.acme.tld/rsg" }, "License": { "OnExpiredMode": "bypass", "ApiBaseUrl": "https://api.rsg.example" } } }
08Работает с тем, что у вас уже есть.
RSG проектировался под существующие инсталляции, а не под греенфилд. Нет требований к новой версии Windows, к новой версии Revit Server, к чистой инфраструктуре. Что есть — с тем и работает.
2024 · 2025 · 2027
Производительность
Прокси добавляет ~3–8 мс латентности на запрос на типичной нагрузке (измерено на Xeon E-2336, Windows Server 2022, 100 одновременных Revit-клиентов). Для пользовательского опыта это незаметно — Revit и сам по себе не славится молниеносностью при работе по сети.
- RAM: 200–400 МБ rezident при 100 активных юзерах.
- CPU: <5% одного ядра при пиковой нагрузке.
- Disk I/O: ~15 МБ/час журнала аудита при 100 юзерах.
- Network: близко к нулевому overhead — RSG не буферизует, а проксирует поток.
09Что RSG защищает — и чего не делает.
Честно: RSG не панацея. Он закрывает один конкретный класс задач — авторизацию доступа к Revit Server. Ниже — что внутри его модели угроз, и что снаружи.
В модели угроз RSG
- Insider с легитимным AD-доступом, который пытается прочитать чужие проекты. Закрыто: проверка проект+раздел+действие на каждом запросе.
- Подрядчик, чей контракт закончился, но AD-аккаунт ещё не отключили. Закрыто: правила с
validUntilиdenyOnExpired: true. - Утечка через подмену сайта или License API. Закрыто: лицензия подписана ECDSA P-256, ключ зашит в клиент. Подмена сайта без приватного ключа невозможна.
- Перенос лицензии на чужую машину. Закрыто: machine fingerprint в payload, проверка при каждом старте сервиса.
Вне модели угроз RSG
- Скомпрометированный AD-сервер. Если злоумышленник получил права DA — он получит и доступ к RSG.AdminPanel. Это задача защиты AD, не RSG.
- Физический доступ к хосту RSG. С локальным админ-доступом можно остановить сервис. Защита уровня инфраструктуры — bitlocker, физический контроль.
- Скриншоты и фотографии экрана. Если у пользователя легитимный доступ к проекту, он может его увидеть и сфотографировать. RSG не DLP-решение.
- Утечки через локальные файлы Revit. Когда Revit-клиент скачал локальную копию проекта — она физически лежит у пользователя на диске. Здесь нужны диск-шифрование и DLP.
Криптография
- Подпись лицензии:
ECDSA P-256 + SHA-256, форматIEEE P1363, длина 64 байта. - Связь с License API:
TLS 1.2+, валидация сертификата. - Внутренний трафик AdminPanel ↔ RSG.Server: HTTPS с самоподписанным сертификатом по умолчанию (можно подменить корпоративным).
- Хранение приватного ключа подписи на нашей стороне: managed key vault с rotation policy.
10Часто задаваемые — про RSG конкретно.
Что произойдёт, если RSG.Server упал ночью?
RSG.Proxy в этом случае переходит в режим fail_open или fail_closed — настраивается. По умолчанию fail_open: если мозг недоступен, прокси пропускает трафик к Revit Server без проверок (как будто RSG нет). Это даёт безопасное поведение при сбое RSG: бизнес работает. Если требования компании — наоборот, лучше всё заблокировать чем рисковать утечкой — ставится fail_closed.
А если поменялся MAC сетевой карты?
Fingerprint станет другим, и лицензия будет отвергнута. Решений два: либо при покупке указать quantity = 2 (тогда лицензия валидна для двух fingerprint, и можно использовать ещё одну активацию), либо запросить пере-выдачу через личный кабинет — она бесплатна и делается мгновенно.
Можно ли поставить RSG в HA-конфигурации (две ноды)?
Сейчас (v2.4.x) — нет, только single-instance. HA-конфигурация в roadmap на v3.0. В качестве workaround обычно держат «холодную» вторую ноду с тем же конфигом и переключают DNS при сбое.
RSG читает файлы .rvt?
Нет. RSG работает на уровне сетевого протокола Revit Server — он видит SOAP-запросы, метаданные проектов, имена разделов. Содержимое моделей он не парсит и не хранит. Для контентного контроля (DLP по содержимому моделей) нужны отдельные решения.
Сколько лицензий нужно для двух Revit Server?
Две — каждая лицензия привязана к одному fingerprint, а fingerprint-ы у двух хостов разные. Скидку для multi-server-конфигураций просчитываем индивидуально, пишите в sales@.
Можно ли мигрировать с самописного решения?
Если у вас есть какая-либо матрица «пользователь × проект × право» в Excel/CSV/SQL — её импорт в RSG поддерживается через CLI rsg-import. Если самописное решение делало что-то более сложное (например, права по геометрическим признакам внутри модели) — это RSG не покрывает, придётся часть оставить как было.