Udostępnij za pośrednictwem


Zagadnienia dotyczące zabezpieczeń dla pisarzy

Infrastruktura usługi VSS wymaga, aby procesy zapisywania mogły działać zarówno jako klienci COM, jak i serwery.

Działając jako serwery, moduły zapisywania usługi VSS uwidaczniają interfejsy COM (na przykład programy obsługi zdarzeń usługi VSS, takie jak CVssWriter::OnIdentify) i odbierają przychodzące wywołania COM z procesów VSS (takich jak osoby żądające i usługa VSS) lub wywołania RPC z procesów zewnętrznych do usługi VSS, zwykle wtedy, gdy te procesy generują zdarzenia usługi VSS (na przykład gdy moduł żądający wywołuje IVssBackupComponents::GatherWriterMetadata). W związku z tym moduł zapisywania usługi VSS musi bezpiecznie zarządzać tym, którzy klienci COM mogą wykonywać przychodzące wywołania COM do procesu.

Podobnie autorzy usługi VSS mogą również działać jako klienci COM, wykonując wychodzące wywołania COM do wywołań zwrotnych dostarczanych przez infrastrukturę usługi VSS lub wywołania RPC do procesów zewnętrznych dla usługi VSS. Te wywołania zwrotne udostępniane przez aplikację kopii zapasowej lub usługę VSS umożliwiają składnikowi zapisywania wykonywanie zadań, takich jak aktualizowanie dokumentu składniki kopii zapasowej za pomocą interfejsu IVssComponent. W związku z tym ustawienia zabezpieczeń usługi VSS muszą zezwalać składnikom zapisywania na wykonywanie wychodzących wywołań COM do innych procesów usługi VSS.

Najprostszy mechanizm zarządzania problemami z zabezpieczeniami składnika zapisywania obejmuje właściwy wybór konta użytkownika, w ramach którego jest uruchamiany. Składnik zapisywania zazwyczaj musi działać w ramach użytkownika, który jest członkiem grupy Administratorzy lub Operatorzy kopii zapasowych, albo musi działać jako konto systemu lokalnego.

Domyślnie, gdy składnik zapisywania działa jako klient COM, jeśli nie jest uruchamiany na tych kontach, każde wywołanie COM jest automatycznie odrzucane przy użyciu E_ACCESSDENIED nawet bez uzyskiwania implementacji metody COM.

Wyłączanie obsługi wyjątków COM

Podczas tworzenia modułu zapisywania ustaw flagę com COMGLB_EXCEPTION_DONOT_HANDLE opcji globalnych, aby wyłączyć obsługę wyjątków COM. Należy to zrobić, ponieważ obsługa wyjątków COM może maskować błędy krytyczne w aplikacji usługi VSS. Błąd, który jest maskowany, może pozostawić proces w niestabilnym i nieprzewidywalnym stanie, co może prowadzić do uszkodzenia i zawieszania się. Aby uzyskać więcej informacji na temat tej flagi, zobacz IGlobalOptions.

Ustawianie domyślnego uprawnienia sprawdzania dostępu do modelu COM dla składnika zapisywania

Autorzy muszą pamiętać, że gdy ich procesy działają jako serwer (na przykład w celu obsługi zdarzeń usługi VSS), muszą zezwalać na połączenia przychodzące od innych uczestników usługi VSS, takich jak osoby żądające lub usługa VSS.

Jednak domyślnie proces będzie zezwalać tylko na klientów COM działających w ramach tej samej sesji logowania self SID) lub uruchomionych na koncie systemu lokalnego. Jest to potencjalny problem, ponieważ te wartości domyślne nie są wystarczające do obsługi infrastruktury usługi VSS. Na przykład osoby żądające mogą działać jako konto użytkownika "Operator kopii zapasowej", które nie znajduje się ani w tej samej sesji logowania, co proces zapisywania, ani konto systemu lokalnego.

Aby obsłużyć ten typ problemu, każdy proces serwera COM może wykonywać dalszą kontrolę nad tym, czy klient RPC lub COM może wykonać metodę COM serwera (moduł zapisywania w tym przypadku) implementuje przy użyciu CoInitializeSecurity, aby ustawić domyślne uprawnienie kontroli dostępu com dla całego procesu.

Autorzy mogą jawnie wykonywać następujące czynności:

  • Zezwalaj wszystkim procesom na wywoływanie procesu zapisywania.

    Ta opcja może być odpowiednia dla wielu składników zapisywania i jest używana przez inne serwery COM — na przykład wszystkie usługi systemu Windows oparte na formacie SVCHOST używają już tej opcji, ponieważ wszystkie usługi COM+ są domyślnie używane.

    Umożliwienie wszystkim procesom wykonywania przychodzących wywołań COM niekoniecznie jest słabością zabezpieczeń. Moduł zapisywania działający jako serwer COM, podobnie jak wszystkie inne serwery COM, zawsze zachowuje opcję autoryzowania swoich klientów na każdej metodzie COM zaimplementowanej w procesie.

    Aby zezwolić wszystkim procesom na dostęp com do składnika zapisywania, można przekazać deskryptor zabezpieczeń null jako pierwszy parametr CoInitializeSecurity. (Należy pamiętać, że CoInitializeSecurity musi być wywoływana co najwyżej raz dla całego procesu. Aby uzyskać więcej informacji na temat CoInitializeSecurity, zobacz dokumentację com).

    Poniżej przedstawiono przykład kodu, który zawiera wywołanie metody 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
        );
    

    W przypadku jawnego ustawiania zabezpieczeń na poziomie com modułu zapisywania za pomocą CoInitializeSecuritynależy wykonać następujące czynności:

    • Ustaw poziom uwierzytelniania na co najmniej RPC_C_AUTHN_LEVEL_CONNECT.

      Aby uzyskać lepsze zabezpieczenia, rozważ użycie RPC_C_AUTHN_LEVEL_PKT_PRIVACY.

    • Ustaw poziom personifikacji na RPC_C_IMP_LEVEL_IDENTIFY, chyba że proces zapisywania musi zezwolić na personifikację dla określonych wywołań RPC lub COM, które nie są powiązane z usługą VSS.

  • Zezwalaj tylko określonym procesom na wywoływanie procesu zapisywania.

    Serwer COM (taki jak składnik zapisywania) wywołujący CoInitializeSecurity z deskryptorem zabezpieczeń o wartości innej niżnull deskryptor zabezpieczeń może użyć deskryptora zabezpieczeń, aby skonfigurować się tak, aby akceptował połączenia przychodzące tylko od użytkowników należących do określonego zestawu kont.

    Składnik zapisywania musi upewnić się, że klienci COM działający pod prawidłowymi użytkownikami mają uprawnienia do wywoływania procesu. Moduł zapisywania określający deskryptor zabezpieczeń w pierwszym parametrze musi zezwolić następującym użytkownikom na wykonywanie przychodzących wywołań do procesu osoby żądającej:

    • System lokalny
    • Członkowie lokalnej grupy Administratorzy
    • Członkowie lokalnej grupy Operatorzy kopii zapasowych
    • Konto, na którym jest uruchomiony składnik zapisywania

Jawne kontrolowanie dostępu konta użytkownika do składnika zapisywania

Istnieją przypadki, w których ograniczenie dostępu do modułu zapisywania do procesów uruchomionych jako system lokalny lub w lokalnych grupach administratorów lub lokalnych operatorów kopii zapasowych może być zbyt restrykcyjne.

Na przykład proces zapisywania (być może składnik zapisywania innej firmy, który nie jest modułem zapisywania systemu) może nie być zwykle potrzebny do uruchomienia na koncie administratora lub operatora kopii zapasowej. Ze względów bezpieczeństwa najlepiej byłoby nie sztucznie promować uprawnień procesu do obsługi usługi VSS.

W takich przypadkach należy zmodyfikować klucz rejestru HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\VSS\VssAccessControl, aby poinstruować usługę VSS, że określony użytkownik jest bezpieczny do uruchomienia składnika zapisywania usługi VSS.

W tym kluczu należy utworzyć podklucz, który ma taką samą nazwę jak konto, któremu chcesz udzielić lub odmówić dostępu. Ten podklucz musi być ustawiony na jedną z wartości w poniższej tabeli.

Wartość Znaczenie
0 Odmów użytkownikowi dostępu do modułu zapisywania i żądania.
1 Udziel użytkownikowi dostępu do składnika zapisywania.
2 Udziel użytkownikowi dostępu do żądania.
3 Udziel użytkownikowi dostępu do modułu zapisywania i modułu żądającego.

 

Poniższy przykład udziela dostępu do konta "MyDomain\MyUser":

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

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

Tego mechanizmu można również użyć do jawnego ograniczenia w inny sposób dozwolonego użytkownika do uruchamiania składnika zapisywania usługi VSS. Poniższy przykład ograniczy dostęp z konta "ThatDomain\Administrator":

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

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

Użytkownik ThatDomain\Administrator nie może uruchomić składnika zapisywania usługi VSS.