Sichern eines brokerierten Diensts
Brokered Services sind standardmäßig nur für den lokalen Benutzer und für die Prozesse verfügbar, die an der Visual Studio-Sitzung beteiligt sind, die sie aktiviert hat. Unter diesen Standardwerten unterscheiden sich Sicherheitsüberlegungen für brokerierte Dienste nicht von anderem Code, der in diesen Prozessen ausgeführt wird, darunter:
- Aus Sicht des Bedrohungsmodells werden Erweiterungen, die im Visual Studio-Prozess ausgeführt werden, als vollständig vertrauenswürdig angenommen. Erweiterungen, die nicht verarbeitet werden, sollten Visual Studio-Dienstaufrufe als Überschreitung einer Vertrauensgrenze behandeln.
- Ihr Code muss Argumente an Einstiegspunkten überprüfen, um sicherzustellen, dass sie in erwartete Muster/Bereiche fallen.
- Berücksichtigen Sie beim Lesen von Daten vom Datenträger, dass die Daten möglicherweise manipuliert wurden.
- Achten Sie beim Empfangen von Daten aus einem Netzwerk oder internet bei der Analyse oder Deserialisierung der Daten darauf, häufige Sicherheitsrisiken zu vermeiden.
Mehrere wichtige zusätzliche Sicherheitsüberlegungen gelten, wenn Ihr Dienst mit dem ProvideBrokeredServiceAttribute.AllowTransitiveGuestClients Kennzeichensatz registriert ist. Der Re Standard der dieses Artikels konzentriert sich auf diese Überlegungen.
Autorisierungsprüfungen für vertrauliche Vorgänge
Abrufen des Autorisierungsdiensts
Der brokerierte Dienst sollte über einen Konstruktor verfügen, der einen AuthorizationServiceClient Parameter verwendet. Das Argument sollte in einem Feld gespeichert und in der Methode Ihres Diensts Dispose() verworfen werden.
class Calculator : ICalculator, IDisposable
{
private readonly AuthorizationServiceClient authorizationService;
internal Calculator(AuthorizationServiceClient authorizationService)
{
this.authorizationService = authorizationService;
}
public void Dispose()
{
this.authorizationService.Dispose();
}
}
Die Dienstfactory, die Sie proffern, ändert sich geringfügig, um diesen neuen Parameter zu unterstützen. Statt eine BrokeredServiceFactory für die IBrokeredServiceContainer.Proffer Methode bereitzustellen, stellen Sie einen AuthorizingBrokeredServiceFactory Delegaten bereit. Diese Stellvertretung erhält die AuthorizationServiceClient , die Sie an Ihren brokerierten Dienst übergeben müssen.
Diese Änderung an Ihrem Proffer-Code sieht möglicherweise wie folgt aus:
container.Proffer(
CalculatorService,
- (moniker, options, serviceBroker, cancellationToken) => new ValueTask<object?>(new CalculatorService()));
+ (moniker, options, serviceBroker, authorizationService, cancellationToken) => new ValueTask<object?>(new CalculatorService(authorizationService)));
Verwenden des Autorisierungsdiensts
Jeder Vorgang, der vertrauliche Informationen offenlegt oder den Status des Benutzers stummschalten kann, sollte mit dem Autorisierungsdienst überprüft AuthorizationServiceClient.AuthorizeOrThrowAsyncwerden.
Um zu bestätigen, dass der Aufrufer der Besitzer des Codes ist (die gleiche Identität wie der Operator des Live Share-Hosts), kann dieser Code verwendet werden:
private static readonly ProtectedOperation ClientIsOwner = WellKnownProtectedOperations.CreateClientIsOwner();
public ValueTask ResetOperationCounterAsync(CancellationToken cancellationToken)
{
// Resetting the counter should only be allowed if the user is the owner.
await this.authorizationService.AuthorizeOrThrowAsync(ClientIsOwner, cancellationToken);
// Proceed with the operation.
this.operationCounter = 0;
}
In der WellKnownProtectedOperations Klasse sind verschiedene andere Autorisierungsstufen definiert.
Alle Autorisierungsprüfungen werden immer genehmigt, wenn der Dienstclient auf demselben Computer und Benutzerkonto ausgeführt wird. Sie werden auch für einen LiveFreigabe-Gast genehmigt, der unter demselben Microsoft-Konto wie der Host ausgeführt wird.
Wenn der angeforderte Vorgang nicht autorisiert ist, AuthorizeOrThrowAsync wird ein UnauthorizedAccessException. Der Live-Freigabehost kann den Besitzer des fehlgeschlagenen Versuchs benachrichtigen und dem Host die Möglichkeit geben, die zum Abschließen des Vorgangs erforderliche Berechtigung zu erteilen, wenn der ProtectedOperation Vorgang erkannt wird, damit ein anschließender Versuch auf dem Client erfolgreich ausgeführt werden kann.
Alle AuthorizationServiceClient Autorisierungsprüfungen werden lokal zwischengespeichert, sodass wiederholte Autorisierungsprüfungen schnell sind. Wenn sich der Berechtigungssatz eines Benutzers ändert (z. B. ändert der Live Share-Host Berechtigungen für den Gast), wird der lokale Cache automatisch geleert.
Verbrauch anderer brokerter Dienste
Wenn ein brokered-Dienst selbst Zugriff auf einen anderen brokerierten Dienst erfordert, sollte er das IServiceBroker für seine Dienstfactory bereitgestellte Verwenden. Er sollte nicht den globalen Dienstbroker verwenden, da dies den Kontext dieser bestimmten brokerierten Dienstinstanz nicht kennt und die Autorisierung, die der Client zum Aktivieren und Aufrufen anderer Verhaltensweisen hat.
Wenn unser Rechnerdienst andere brokerierte Dienste benötigt hat, um sein Verhalten zu implementieren, würden wir den Konstruktor so ändern, dass er folgendes IServiceBrokerakzeptiert:
internal class Calculator : ICalculator
{
private readonly IServiceBroker serviceBroker;
private readonly AuthorizationServiceClient authorizationService;
internal class Calculator(IServiceBroker serviceBroker, AuthorizationServiceClient authorizationService)
{
this.serviceBroker = serviceBroker;
this.authorizationService = authorizationService;
}
}
Dieser zusätzliche Parameter wirkt sich auf den Dienst factoryproffering-Code aus:
container.Proffer(
CalculatorService,
(moniker, options, serviceBroker, authorizationService, cancellationToken)
- => new ValueTask<object?>(new CalculatorService(authorizationService)));
+ => new ValueTask<object?>(new CalculatorService(serviceBroker, authorizationService)));
Eingeschränkte Verfügbarkeit von brokerierten Diensten
Wenn der Client Ihres brokerierten Diensts ein LiveFreigabe-Gast ist (unter einem anderen Konto als der Besitzer des Hosts), aktiviert Ihr Kontextdienstbroker nur andere brokerierte Dienste, die das AllowTransitiveGuestClients Kennzeichen auch als Sicherheitsvorkehrung festgelegt haben. Versuche, einen nicht qualifizierenden brokerierten Dienst zu aktivieren, löst einen UnauthorizedAccessException.
Wenn Ihr brokered-Dienst einen anderen brokerierten Dienst erfordert, der die AllowTransitiveGuestClients Kennzeichnung nicht enthält, können Sie den globalen Dienstbroker verwenden, um ihn zu erhalten, aber er muss berücksichtigen, dass diese vermittelten Dienste, die von ihm erhalten wurden, keine Vorstellung davon haben, dass ein nicht vertrauenswürdiger Gast der ultimative Client ist. Im nächsten Abschnitt sollten Sie alle gleichen Vorsichtsmaßnahmen zum Aufrufen anderer VS-Dienste oder anderer APIs befolgen.
Weitere Informationen zum Verbrauch von brokerierten Diensten.
Verwenden anderer VS-Dienste oder anderer APIs
Das Aufrufen standardmäßiger Visual Studio-Dienste, Drittanbieterbibliotheken oder Standard-.NET-APIs ist in brokerierten Diensten zulässig, die Für Live Share-Gäste verfügbar gemacht werden, diese Aufrufe sollten jedoch sorgfältig geschrieben werden und alle Eingaben zuerst überprüft werden.
Dateipfade oder URLs sollten sorgfältig überprüft werden, um sicherzustellen, dass sie gültig sind und in die erwarteten Unterpfade fallen, auf die der Gast zugriff hat.
Wenn Ihr brokered-Dienst beispielsweise das Lesen oder Schreiben in Dateien basierend auf einem Pfad zulässt, sollte der Pfad überprüft werden, um unter die geöffnete Lösung zu fallen und dass der Gast ggf. Schreibberechtigungen besitzt.
Das ordnungsgemäße Überprüfen von Dateipfaden kann schwierig ..
sein und andere Mittel, um es so aussehen zu lassen, als ob ein Pfad mit dem richtigen Präfix beginnt, aber dann dem zulässigen Lösungsverzeichnis entweicht.
Verwenden Sie den AuthorizationServiceClient oben beschriebenen Abschnitt entsprechend, um zu bestätigen, dass der Client über die Berechtigung verfügt, bevor eine API aufgerufen wird, die nicht über eigene Berechtigungsprüfungen verfügt. Es sollte davon ausgegangen werden, dass nur in Visual Studio integrierte brokerierte Dienste ihre eigenen Autorisierungsprüfungen enthalten. Dies hängt davon ab, dass Sie diese vermittelten Dienste mithilfe des Kontextdienstbrokers erwerben, wie im obigen Abschnitt beschrieben.
Alle anderen APIs, einschließlich nichtbrokerter Visual Studio-Dienste oder brokered Services, die mit dem globalen Dienstbroker abgerufen wurden, können ausgeführt werden, wenn Sie sie leiten, ohne die Berechtigungsstufe Ihres Live Share-Gasts zu berücksichtigen, wodurch Ihre eigene Autorisierungsprüfung wichtig ist, um die Sicherheit des Live Share-Hosts zu schützen.
Vermeiden Sie die Bereitstellung von Funktionen von Ihrem brokerierten Dienst, den ein anderer von Visual Studio vermittelter Dienst bereits verfügbar macht, da sie die Angriffsfläche erhöht.
Freigabestatus über brokerierte Dienstinstanzen hinweg
Wenn Ihr brokered-Dienst freigabestatus für mehrere Instanzen des Diensts erfordert, werden diese Daten potenziell mehreren Benutzern mit unterschiedlichen Berechtigungssätzen offengelegt. Es wird für Ihren brokerierten Dienst wichtig, diese Daten über diese Benutzer hinweg zu schützen. Verwenden Sie das STRIDE-Modell , um Bedrohungen zu identifizieren, zu klassifizieren und letztendlich zu mindern.
Sie können sich entscheiden, Ihren freigegebenen Zustand als vertrauenswürdig zu behandeln und ihm daher die Berechtigung zu erteilen, alles zu tun, was intern erforderlich ist (z. B. auf VS-Dienste zugreifen oder den globalen Servicebroker verwenden). In diesem Fall liegt es in der Verantwortung einer einzelnen brokerierten Dienstinstanz, Aufrufe in seinem freigegebenen Zustand zu schützen, um sicherzustellen, dass alle Eingaben entsprechend den Berechtigungen des eigenen Benutzers über den Autorisierungsdienst geeignet sind.
Das Microsoft Threat Modeling Tool kann ein nützliches Tool zum Sichern Ihres freigegebenen Zustands und Ihrer Benutzer sein.