Zabezpečení zprostředkované služby
Zprostředkované služby jsou ve výchozím nastavení dostupné pouze místnímu uživateli a procesům, které jsou součástí relace sady Visual Studio, které ji aktivovaly. V těchto výchozích nastaveních se aspekty zabezpečení pro zprostředkované služby neliší od jiného kódu spuštěného v těchto procesech, mezi které patří:
- Z hlediska modelu hrozeb se předpokládá, že rozšíření spuštěná v rámci procesu sady Visual Studio jsou plně důvěryhodná. Rozšíření, která čerchají proces, by měla zacházet s voláními služby sady Visual Studio jako s překročením hranice důvěryhodnosti.
- Váš kód musí ověřit argumenty v vstupních bodech, aby potvrdil, že spadají do očekávaných vzorů a rozsahů.
- Při čtení dat z disku zvažte, že se s daty můžou manipulovat.
- Při příjmu dat ze sítě nebo internetu buďte opatrní při analýze nebo deserializaci dat, abyste se vyhnuli běžným chybám zabezpečení.
Při registraci služby v ProvideBrokeredServiceAttribute.AllowTransitiveGuestClients sadě příznaků platí několik důležitých dalších aspektů zabezpečení. Zbývající část tohoto článku se zaměřuje na tyto aspekty.
Kontroly autorizace citlivých operací
Získání autorizační služby
Zprostředkovaná služba by měla mít konstruktor, který přebírá jako AuthorizationServiceClient parametr. Argument by měl být uložen v poli a uvolněn v metodě vaší služby Dispose() .
class Calculator : ICalculator, IDisposable
{
private readonly AuthorizationServiceClient authorizationService;
internal Calculator(AuthorizationServiceClient authorizationService)
{
this.authorizationService = authorizationService;
}
public void Dispose()
{
this.authorizationService.Dispose();
}
}
Objekt pro vytváření služeb, který navrhujete, se mírně změní tak, aby podporoval tento nový parametr. Místo poskytnutí BrokeredServiceFactory IBrokeredServiceContainer.Proffer metody zadejte delegáta AuthorizingBrokeredServiceFactory . Tento delegát obdrží AuthorizationServiceClient , že budete muset předat zprostředkované službě.
Tato změnakóduho kódu může vypadat takto:
container.Proffer(
CalculatorService,
- (moniker, options, serviceBroker, cancellationToken) => new ValueTask<object?>(new CalculatorService()));
+ (moniker, options, serviceBroker, authorizationService, cancellationToken) => new ValueTask<object?>(new CalculatorService(authorizationService)));
Použití autorizační služby
Jakákoli operace, která může zveřejnit citlivé informace nebo ztlumit stav uživatele, by měla být kontrolována pomocí autorizační služby .AuthorizationServiceClient.AuthorizeOrThrowAsync
Chcete-li ověřit, že volající je vlastníkem kódu (stejná identita jako operátor hostitele Live Share), může být tento kód použit:
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;
}
Různé další úrovně autorizace jsou definovány ve WellKnownProtectedOperations třídě.
Všechny kontroly autorizace se vždy schválí, když je klient služby spuštěný ve stejném počítači a uživatelském účtu. Všechny jsou také schválené pro hosta Live Share, který funguje pod stejným účtem Microsoft jako hostitel.
Pokud požadovaná operace není autorizovaná, AuthorizeOrThrowAsync vyvolá výjimku UnauthorizedAccessException. Hostitel Live Share může vlastníka neúspěšného pokusu upozornit, aby hostitel mohl udělit oprávnění vyžadované k dokončení operace, pokud ProtectedOperation je rozpoznán, aby následný pokus na klientovi mohl proběhnout úspěšně.
Všechny AuthorizationServiceClient kontroly autorizace se ukládají do mezipaměti místně, aby opakované kontroly autorizace byly rychlé. V případě, že se změní nastavení oprávnění uživatele (například hostitel Live Share změní oprávnění hosta), místní mezipaměť se automaticky vyprázdní.
Využívání dalších zprostředkovaných služeb
Když zprostředkovaná služba sama vyžaduje přístup k jiné zprostředkované službě, měla by použít IServiceBroker službu, která je poskytována jeho službě. Neměl by používat globálního zprostředkovatele služeb, protože to neví o kontextu této konkrétní zprostředkované instance služby a autorizaci, kterou musí jeho klient aktivovat a vyvolat jiné chování.
Pokud by naše služba kalkulačky potřebovala k implementaci svého chování jiné zprostředkované služby, upravili bychom konstruktor tak, aby přijímal:IServiceBroker
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;
}
}
Tento další parametr bude mít vliv na kód odčítající váš kód služby Service Factory:
container.Proffer(
CalculatorService,
(moniker, options, serviceBroker, authorizationService, cancellationToken)
- => new ValueTask<object?>(new CalculatorService(authorizationService)));
+ => new ValueTask<object?>(new CalculatorService(serviceBroker, authorizationService)));
Omezená dostupnost zprostředkovaných služeb
Pokud je klientem zprostředkované služby host Live Share (pod jiným účtem od vlastníka hostitele), váš kontextový zprostředkovatel služeb aktivuje pouze další zprostředkované služby, které také nastavily AllowTransitiveGuestClients příznak jako bezpečnostní opatření. Pokusy o aktivaci nekvalifikující zprostředkované služby vyvolá výjimku UnauthorizedAccessException.
Pokud vaše zprostředkovaná služba vyžaduje jinou zprostředkovanou službu, která nemá AllowTransitiveGuestClients příznak, můžete k jeho získání použít globálního zprostředkovatele služeb, ale musíte zvážit, že zprostředkované služby získané z ní nemají žádnou představu, že nedůvěryhodný host je konečným klientem. Měli byste dodržovat všechna stejná opatření uvedená v další části týkající se volání jiných služeb VS nebo jiných rozhraní API.
Přečtěte si další informace o využívání zprostředkovaných služeb.
Využívání jiných služeb VS nebo jiných rozhraní API
Volání standardních služeb sady Visual Studio, knihoven třetích stran nebo standardních rozhraní .NET API je povoleno ve zprostředkovaných službách, které jsou vystaveny hostům Live Share, ale taková volání by měla být pečlivě napsána a všechny vstupy ověřeny jako první.
Cesty k souborům nebo adresy URL by měly být pečlivě kontrolovány, aby byly platné a spadají do očekávaných dílčích cest, ke kterým má host autorizaci pro přístup.
Pokud vaše zprostředkovaná služba například umožňuje čtení ze souborů nebo zápis do souborů na základě cesty, měla by být cesta kontrolována tak, aby spadají pod otevřené řešení a že host má oprávnění k zápisu, pokud je to možné.
Správné ověřování cest k souborům může být obtížné zvážit ..
a jiné prostředky, aby vypadaly jako cesta začínající správnou předponou, ale pak uchytněte povolený adresář řešení.
Podle potřeby použijte AuthorizationServiceClient popis popsaný v předchozí části, abyste potvrdili, že klient má oprávnění před voláním jakéhokoli rozhraní API, které nemá integrovanou vlastní kontrolu oprávnění. Předpokládá se, že pouze zprostředkované služby integrované v sadě Visual Studio budou obsahovat vlastní kontroly autorizace. To závisí na získání těchto zprostředkovaných služeb pomocí zprostředkovaného zprostředkovatele služeb, jak je popsáno v předchozí části.
Všechna ostatní rozhraní API, včetně nezprostředkovaných služeb sady Visual Studio nebo zprostředkovaných služeb získaných pomocí globálního zprostředkovatele služeb, se můžou spouštět při jejich směrování bez ohledu na úroveň oprávnění hosta Live Share, takže pro ochranu zabezpečení hostitele Live Share je důležitá vlastní kontrola autorizace.
Vyhněte se zveřejnění funkcí ze zprostředkované služby, kterou už zprostředkovaná jiná zprostředkovaná služba sady Visual Studio zpřístupňuje, protože zvyšuje prostor pro útoky.
Sdílení stavu mezi zprostředkovanými instancemi služeb
Když zprostředkovaná služba vyžaduje sdílení stavu napříč několika instancemi služby, tato data se potenciálně zveřejňují více uživatelům s různými sadami oprávnění. Pro zprostředkovanou službu je důležité chránit tato data napříč těmito uživateli. Model STRIDE vám pomůže identifikovat, klasifikovat a nakonec zmírnit hrozby.
Můžete se rozhodnout, že váš sdílený stav považujete za důvěryhodný, a proto mu udělíte oprávnění k internímu zpracování (například přístup ke službám VS nebo použití globálního zprostředkovatele služeb). V takovém případě je odpovědností jednotlivých zprostředkovaných instancí služby chránit volání do sdíleného stavu, aby se zajistilo, že všechny vstupy budou vhodné vzhledem k oprávněním vlastního uživatele pomocí autorizační služby.
Nástroj Microsoft Threat Modeling může být užitečným nástrojem pro zabezpečení vašeho sdíleného stavu a uživatelů.