Sicherheitsüberlegungen für Writer

Die VSS-Infrastruktur erfordert Writerprozesse, um sowohl als COM-Clients als auch als Server funktionieren zu können.

Bei der Verwendung als Server machen VSS-Writer COM-Schnittstellen verfügbar (z. B. die VSS-Ereignishandler wie CVssWriter::OnIdentify) und empfangen eingehende COM-Aufrufe von VSS-Prozessen (z. B. Anforderern und dem VSS-Dienst) oder RPC-Aufrufe von Prozessen, die sich außerhalb von VSS befinden, in der Regel, wenn diese Prozesse VSS-Ereignisse generieren (z. B. wenn ein Anforderer IVssBackupComponents aufruft: GatherWriterMetadata). Daher muss ein VSS-Writer sicher verwalten, welche COM-Clients in der Lage sind, eingehende COM-Aufrufe in seinen Prozess zu tätigen.

Ebenso können VSS-Writer auch als COM-Clients fungieren und ausgehende COM-Aufrufe von Rückrufen ausführen, die von der VSS-Infrastruktur bereitgestellt werden, oder RPC-Aufrufe von Prozessen, die sich außerhalb von VSS befinden. Diese Rückrufe, die entweder von einer Sicherungsanwendung oder vom VSS-Dienst bereitgestellt werden, ermöglichen es dem Writer, Aufgaben wie das Aktualisieren des Sicherungskomponentendokuments über die IVssComponent-Schnittstelle auszuführen. Daher müssen VSS-Sicherheitseinstellungen Es Writern ermöglichen, ausgehende COM-Aufrufe an andere VSS-Prozesse zu tätigen.

Der einfachste Mechanismus zum Verwalten von Writer-Sicherheitsproblemen umfasst die richtige Auswahl des Benutzerkontos, unter dem er ausgeführt wird. Ein Writer muss in der Regel unter einem Benutzer ausgeführt werden, der Mitglied der Gruppe Administratoren oder der Gruppe Sicherungsoperatoren ist, oder er muss als lokales Systemkonto ausgeführt werden.

Wenn ein Writer als COM-Client fungiert und er nicht unter diesen Konten ausgeführt wird, wird standardmäßig jeder COM-Aufruf automatisch mit E_ACCESSDENIED abgelehnt, ohne die COM-Methodenimplementierung überhaupt zu erhalten.

Deaktivieren der COM-Ausnahmebehandlung

Legen Sie beim Entwickeln eines Writers das Flag COM COMGLB_EXCEPTION_DONOT_HANDLE globale Optionen fest, um die COM-Ausnahmebehandlung zu deaktivieren. Dies ist wichtig, da die COM-Ausnahmebehandlung schwerwiegende Fehler in einer VSS-Anwendung maskieren kann. Der maskierte Fehler kann den Prozess in einem instabilen und unvorhersehbaren Zustand hinterlassen, was zu Beschädigungen und Hängen führen kann. Weitere Informationen zu diesem Flag finden Sie unter IGlobalOptions.

Festlegen der Standardmäßigen COM-Zugriffsüberprüfungsberechtigung für Writer

Autoren müssen sich bewusst sein, dass sie eingehende Anrufe von anderen VSS-Teilnehmern zulassen müssen, wenn ihre Prozesse als Server fungieren (z. B. zur Behandlung von VSS-Ereignissen).

Standardmäßig lässt ein Prozess jedoch nur COM-Clients zu, die unter derselben Anmeldesitzung wie self SID) oder unter dem Konto "Lokales System" ausgeführt werden. Dies ist ein potenzielles Problem, da diese Standardwerte nicht ausreichen, um die VSS-Infrastruktur zu unterstützen. Beispielsweise können Anforderer als "Sicherungsoperator"-Benutzerkonto ausgeführt werden, das sich weder in derselben Anmeldesitzung wie der Writerprozess noch in einem lokalen Systemkonto befindet.

Um diese Art von Problem zu behandeln, kann jeder COM-Serverprozess weitere Kontrolle darüber ausüben, ob ein RPC- oder COM-Client eine COM-Methode ausführen darf, die der Server (in diesem Fall ein Writer) implementiert, indem CoInitializeSecurity verwendet wird, um eine prozessweite Standardberechtigung für die COM-Zugriffsüberprüfung festzulegen.

Writer können explizit die folgenden Aktionen ausführen:

  • Lassen Sie allen Prozessen den Zugriff auf den Writerprozess zu.

    Diese Option kann für viele Writer geeignet sein und von anderen COM-Servern verwendet werden. Beispielsweise verwenden alle SVCHOST-basierten Windows-Dienste diese Option bereits, ebenso wie alle COM+-Dienste standardmäßig.

    Das Zulassen, dass alle Prozesse eingehende COM-Aufrufe ausführen, ist nicht unbedingt eine Sicherheitsschwäche. Ein Writer, der wie alle anderen COM-Server als COM-Server fungiert, behält immer die Möglichkeit, seine Clients für jede com-Methode zu autorisieren, die in seinem Prozess implementiert wird.

    Um allen Prozessen COM-Zugriff auf einen Writer zu gewähren, können Sie einen NULL-Sicherheitsdeskriptor als ersten Parameter von CoInitializeSecurity übergeben. (Beachten Sie, dass CoInitializeSecurity für den gesamten Prozess höchstens einmal aufgerufen werden muss. Weitere Informationen zu CoInitializeSecurity finden Sie in der COM-Dokumentation.)

    Im Folgenden finden Sie ein Codebeispiel, das einen Aufruf von CoInitializeSecurity enthält:

    // 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
        );
    

    Wenn Sie die Sicherheit auf COM-Ebene eines Writers explizit mit CoInitializeSecurity festlegen, sollten Sie die folgenden Schritte ausführen:

    • Legen Sie die Authentifizierungsebene auf mindestens RPC_C_AUTHN_LEVEL_CONNECT fest.

      Um die Sicherheit zu verbessern, sollten Sie RPC_C_AUTHN_LEVEL_PKT_PRIVACY verwenden.

    • Legen Sie die Identitätswechselebene auf RPC_C_IMP_LEVEL_IDENTIFY fest, es sei denn, der Writerprozess muss den Identitätswechsel für bestimmte RPC- oder COM-Aufrufe zulassen, die nicht mit VSS verbunden sind.

  • Lassen Sie nur angegebenen Prozessen den Zugriff auf den Writerprozess zu.

    Ein COM-Server (z. B. ein Writer), der CoInitializeSecurity mit einem Nicht-NULL-Sicherheitsdeskriptor aufruft, kann den Deskriptor verwenden, um sich selbst so zu konfigurieren, dass eingehende Anrufe nur von Benutzern akzeptiert werden, die zu einer bestimmten Gruppe von Konten gehören.

    Ein Writer muss sicherstellen, dass COM-Clients, die unter gültigen Benutzern ausgeführt werden, berechtigt sind, den Prozess aufzurufen. Ein Writer, der einen Sicherheitsdeskriptor im ersten Parameter angibt, muss es den folgenden Benutzern ermöglichen, eingehende Aufrufe an den anfordernden Prozess auszuführen:

    • Lokales System
    • Mitglieder der lokalen Gruppe "Administratoren"
    • Mitglieder der lokalen Gruppe "Sicherungsoperatoren"
    • Das Konto, unter dem der Writer ausgeführt wird

Explizites Steuern des Benutzerkontozugriffs auf einen Writer

Es gibt Fälle, in denen die Beschränkung des Zugriffs auf einen Writer auf Prozesse, die als lokales System oder unter den lokalen Gruppen von Administratoren oder lokalen Sicherungsoperatoren ausgeführt werden, möglicherweise zu restriktiv ist.

Beispielsweise muss ein Writer-Prozess (möglicherweise ein Nicht-System-Writer eines Drittanbieters) normalerweise nicht unter einem Administrator- oder Sicherungsoperatorkonto ausgeführt werden. Aus Sicherheitsgründen empfiehlt es sich, die Berechtigungen des Prozesses zur Unterstützung von VSS nicht künstlich zu fördern.

In diesen Fällen muss der HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\VSS\VssAccessControl-Registrierungsschlüssel geändert werden, um VSS anzuweisen, dass ein angegebener Benutzer sicher ist, einen VSS-Writer auszuführen.

Unter diesem Schlüssel müssen Sie einen Unterschlüssel erstellen, der denselben Namen wie das Konto hat, dem der Zugriff gewährt oder verweigert werden soll. Dieser Unterschlüssel muss auf einen der Werte in der folgenden Tabelle festgelegt werden.

Wert Bedeutung
0 Verweigern Sie dem Benutzer den Zugriff auf Ihren Writer und Anforderer.
1 Gewähren Sie dem Benutzer Zugriff auf Ihren Writer.
2 Gewähren Sie dem Benutzer Zugriff auf Ihren Anforderer.
3 Gewähren Sie dem Benutzer Zugriff auf Ihren Writer und Anforderer.

 

Im folgenden Beispiel wird Zugriff auf das Konto "MyDomain\MyUser" gewährt:

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

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

Dieser Mechanismus kann auch verwendet werden, um explizit zu verhindern, dass ein ansonsten zulässiger Benutzer einen VSS-Writer ausführt. Im folgenden Beispiel wird der Zugriff über das Konto "ThatDomain\Administrator" eingeschränkt:

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

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

Der Benutzer ThatDomain\Administrator kann einen VSS-Writer nicht ausführen.