Поделиться через


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

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

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

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

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

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

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

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

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

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

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

Однако по умолчанию процесс Windows разрешает только COM-клиенты, работающие под тем же сеансом входа (SELF SID) или запущенные под учетной записью локальной системы. Это потенциальная проблема, так как эти значения по умолчанию недостаточно для инфраструктуры VSS. Например, записи могут выполняться как учетная запись пользователя "Оператор резервного копирования", которая не находится ни в том же сеансе входа, что и процесс запроса, ни учетная запись локальной системы.

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

Запрашивающие могут явно выполнять следующие действия:

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

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

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

    Обратите внимание, что внутренние обратные вызовы COM, реализованные VSS, по умолчанию защищены.

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

    В следующем примере кода показано, как запрашивающий объект должен вызывать CoInitializeSecurity в Windows 8 и Windows Server 2012 и более поздних версиях, чтобы быть совместимым с VSS для удаленных файловых ресурсов (RVSS):

    // 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_IMPERSONATE,   //  DWORD                        dwImpLevel,
            NULL,                          //  void                        *pAuthList,
            EOAC_STATIC,                   //  DWORD                        dwCapabilities,
            NULL                           //  void                        *pReserved3
            );
    

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

    • Задайте для уровня проверки подлинности по крайней мере RPC_C_AUTHN_LEVEL_PKT_INTEGRITY. Для повышения безопасности рекомендуется использовать RPC_C_AUTHN_LEVEL_PKT_PRIVACY.
    • Задайте для уровня олицетворения значение RPC_C_IMP_LEVEL_IMPERSONATE.
    • Задайте для EOAC_STATIC возможности безопасности маскировки. Дополнительные сведения о маскировке безопасности см. в разделе "Закрывание".

    В следующем примере кода показано, как запрашивающий объект должен вызывать CoInitializeSecurity в Windows 7 и Windows Server 2008 R2 и более ранних версий (или в Windows 8 и Windows Server 2012 и более поздних версиях, если совместимость RVSS не требуется):

    // 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-клиенты, работающие под допустимыми пользователями, могут вызываться в процесс. Запрашивающий элемент, указывающий дескриптор безопасности в первом параметре, должен разрешить следующим пользователям выполнять входящие вызовы в процесс запрашивающего средства:

    • Локальная система

    • Локальная служба

      Windows XP: это значение не поддерживается до Windows Server 2003.

    • Сетевая служба

      Windows XP: это значение не поддерживается до Windows Server 2003.

    • Члены локальной группы администраторов

    • Члены локальной группы операторов резервного копирования

    • Специальные пользователи, указанные в расположении реестра ниже, с "1" в качестве значения REG_DWORD

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

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

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

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

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

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

 

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

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

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

Этот механизм также можно использовать для явного ограничения возможности пользователя в противном случае выполнять запрос VSS. В следующем примере доступ будет ограничен учетной записью "TheDomain\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.

Выполнение резервной копии файлов состояния системы

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

  • Windows\system32\WDI\perftrack\
  • Windows\WINSXS\

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

Windows XP и Windows Server 2003: функции FindFirstFileNameW и FindNextFileNameW не поддерживаются до Windows Vista и Windows Server 2008.