Вопросы безопасности для авторов

Для инфраструктуры VSS требуется, чтобы процессы записи могли работать как в качестве клиентов COM, так и в качестве серверов.

При выполнении действий в качестве серверов модули записи VSS предоставляют COM-интерфейсы (например, обработчики событий VSS, такие как CVssWriter::OnIdentify) и получают входящие вызовы COM от процессов VSS (таких как инициаторы запроса и служба VSS) или вызовы RPC из процессов, которые являются внешними по сравнению с VSS, как правило, когда эти процессы создают события VSS (например, когда запрашивающий вызывает IVssBackupComponents:: GatherWriterMetadata). Таким образом, модуль записи VSS должен безопасно управлять тем, какие клиенты COM могут выполнять входящие вызовы COM в своем процессе.

Аналогичным образом модули записи VSS также могут выступать в качестве com-клиентов, выполняя исходящие вызовы COM для обратных вызовов, предоставляемых инфраструктурой VSS, или вызовы RPC к процессам, которые являются внешними по сравнению с VSS. Эти обратные вызовы, предоставляемые приложением резервного копирования или службой VSS, позволяют средству записи выполнять такие задачи, как обновление документа компонентов резервного копирования с помощью интерфейса IVssComponent . Поэтому параметры безопасности VSS должны разрешать записи выполнять исходящие COM-вызовы в другие процессы VSS.

Самый простой механизм управления проблемами безопасности записи включает в себя правильный выбор учетной записи пользователя, под которой он запускается. Модуль записи обычно должен выполняться под пользователем, который является членом группы "Администраторы" или "Операторы резервного копирования", либо от имени учетной записи локальной системы.

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

Отключение обработки исключений COM

При разработке модуля записи установите флаг глобальных параметров COM COMGLB_EXCEPTION_DONOT_HANDLE, чтобы отключить обработку исключений COM. Это важно, так как обработка исключений COM может маскировать неустранимые ошибки в приложении VSS. Скрытая ошибка может привести к нестабильному и непредсказуемому состоянию процесса, что может привести к повреждениям и зависаниям. Дополнительные сведения об этом флаге см. в разделе IGlobalOptions.

Настройка разрешения на проверку доступа COM по умолчанию для записи

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

Однако по умолчанию процесс разрешает только COM-клиенты, работающие в том же сеансе входа в систему с ПОМОЩЬЮ ИД БЕЗОПАСНОСТИ SELF или работающие под учетной записью Локальной системы. Это потенциальная проблема, так как этих значений по умолчанию недостаточно для поддержки инфраструктуры VSS. Например, инициаторы запроса могут работать как учетная запись пользователя "Оператор резервного копирования", которая не находится ни в том же сеансе входа, что и процесс записи, ни как учетная запись локальной системы.

Для решения этой проблемы каждый процесс COM-сервера может дополнительно контролировать, разрешено ли клиенту RPC или COM выполнять com-метод, реализуемый сервером (в данном случае модулем записи), с помощью CoInitializeSecurity, чтобы задать доступ com по умолчанию для всего процесса проверка разрешения.

Средства записи могут явным образом выполнять следующие действия.

  • Разрешите всем процессам доступ к вызову процесса записи.

    Этот параметр может быть достаточным для многих модулей записи и используется другими COM-серверами, например, все службы Windows на основе SVCHOST уже используют этот параметр, как и все службы COM+ по умолчанию.

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

    Чтобы разрешить всем процессам com-доступ к записи, можно передать дескриптор безопасности NULL в качестве первого параметра CoInitializeSecurity. (Обратите внимание, что CoInitializeSecurity необходимо вызывать не более одного раза для всего процесса. Дополнительные сведения о CoInitializeSecurity см. в документации com.)

    Ниже приведен пример кода, который включает вызов CoInitializeSecurity:

    // Initialize COM security.
    hr = CoInitializeSecurity(
           NULL,                          // PSECURITY_DESCRIPTOR          pSecDesc,
           -1,                            // LONG                          cAuthSvc,
           NULL,                          // SOLE_AUTHENTICATION_SERVICE  *asAuthSvc,
           NULL,                          // void                         *pReserved1,
           RPC_C_AUTHN_LEVEL_PKT_PRIVACY, // DWORD                         dwAuthnLevel,
           RPC_C_IMP_LEVEL_IDENTIFY,      // DWORD                         dwImpLevel,
           NULL,                          // void                         *pAuthList,
           EOAC_NONE,                     // DWORD                         dwCapabilities,
           NULL                           // void                         *pReserved3
        );
    

    При явной настройке безопасности com-уровня модуля записи с помощью CoInitializeSecurity необходимо выполнить следующие действия.

    • Задайте для уровня проверки подлинности по крайней мере RPC_C_AUTHN_LEVEL_CONNECT.

      Для повышения безопасности рассмотрите возможность использования RPC_C_AUTHN_LEVEL_PKT_PRIVACY.

    • Задайте уровень олицетворения RPC_C_IMP_LEVEL_IDENTIFY , если процесс записи не должен разрешать олицетворение для определенных вызовов RPC или COM, не связанных с VSS.

  • Разрешить только указанным процессам доступ к вызову процесса записи.

    COM-сервер (например, модуль записи), вызывающий CoInitializeSecurity с дескриптором безопасности, отличным от NULL , может использовать дескриптор для настройки приема входящих вызовов только от пользователей, принадлежащих к определенному набору учетных записей.

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

    • Локальная система
    • Участники локальной группы администраторов
    • Члены локальной группы операторов резервного копирования
    • Учетная запись, под которой выполняется модуль записи

Явное управление доступом учетной записи пользователя к записи

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

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

В таких случаях необходимо изменить раздел реестраVSS VssAccessControl\Services\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ Services, чтобы указать VSS, что указанный пользователь может безопасно запускать модуль записи VSS.

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

Значение Значение
0 Запретите пользователю доступ к записи и инициатору запроса.
1 Предоставьте пользователю доступ к записи.
2 Предоставьте пользователю доступ к инициатору запроса.
3 Предоставьте пользователю доступ к записи и инициатору запроса.

 

В следующем примере предоставляется доступ к учетной записи MyDomain\MyUser:

HKEY_LOCAL_MACHINE
   SYSTEM
      CurrentControlSet
         Services
            VSS
               VssAccessControl
                  MyDomain\MyUser = 1<dl>
<dt>

                  Data type
</dt>
<dd>                  REG_DWORD</dd>
</dl>

Этот механизм также можно использовать для явного ограничения пользователей, которым разрешено в противном случае, запускать модуль записи VSS. В следующем примере будет ограничен доступ из учетной записи ThatDomain\Administrator:

HKEY_LOCAL_MACHINE
   SYSTEM
      CurrentControlSet
         Services
            VSS
               VssAccessControl
                  ThatDomain\Administrator = 0<dl>
<dt>

                  Data type
</dt>
<dd>                  REG_DWORD</dd>
</dl>

Пользователь ThatDomain\Administrator не сможет запустить модуль записи VSS.