Aracılı hizmetin güvenliğini sağlama

Aracılı hizmetler varsayılan olarak yalnızca yerel kullanıcı tarafından kullanılabilir duruma gelir ve Visual Studio oturumunda etkinleştirilen işlemler tarafından kullanılabilir. Bu varsayılanlar altında, aracılı hizmetler için güvenlikle ilgili dikkat edilmesi gerekenler, bu işlemlerde çalışan diğer kodlardan farklı değildir ve bunlar şunlardır:

  • Tehdit modeli perspektifinden bakıldığında, Visual Studio işlemi içinde çalışan uzantıların tam olarak güvenilir olduğu varsayılır. İşlem süresi tükenen uzantılar, Visual Studio hizmet çağrılarını bir güven sınırını aşıyor olarak ele almalıdır.
  • Kodunuzun, beklenen desenlerde/aralıklarda yer aldıklarını onaylamak için giriş noktalarında bağımsız değişkenleri doğrulamaları gerekir.
  • Diskten veri okurken verilerin üzerinde oynanmış olabileceğini göz önünde bulundurun.
  • Bir ağdan veya İnternet'ten veri alırken sık karşılaşılan güvenlik açıklarını önlemek için verileri ayrıştırırken veya seri durumdan çıkarırken dikkatli olun.

Hizmetiniz bayrak kümesine ProvideBrokeredServiceAttribute.AllowTransitiveGuestClients kaydedildiğinde bazı kritik ek güvenlik konuları geçerlidir. Bu makalenin geri kalanında bu konular ele alınmaktadır.

Hassas işlemler için yetkilendirme denetimleri

Yetkilendirme hizmetini alma

Aracılı hizmetinizde parametre olarak alan bir AuthorizationServiceClient oluşturucu olmalıdır. Bağımsız değişken bir alanda depolanmalı ve hizmetinizin Dispose() yönteminde atılmalıdır.

class Calculator : ICalculator, IDisposable
{
    private readonly AuthorizationServiceClient authorizationService;

    internal Calculator(AuthorizationServiceClient authorizationService)
    {
        this.authorizationService = authorizationService;
    }

    public void Dispose()
    {
        this.authorizationService.Dispose();
    }
}

Bu yeni parametreyi desteklemek için servis fabrikanız biraz değişir. yöntemine IBrokeredServiceContainer.Proffer bir BrokeredServiceFactory sağlamak yerine bir AuthorizingBrokeredServiceFactory temsilci sağlayın. Bu temsilci aracılı hizmetinize geçirmeniz gerekenleri alır AuthorizationServiceClient .

Proffer kodunuzda yapılan bu değişiklik aşağıdaki gibi görünebilir:

 container.Proffer(
     CalculatorService,
-    (moniker, options, serviceBroker, cancellationToken) => new ValueTask<object?>(new CalculatorService()));
+    (moniker, options, serviceBroker, authorizationService, cancellationToken) => new ValueTask<object?>(new CalculatorService(authorizationService)));

Yetkilendirme hizmetini kullanma

Hassas bilgileri açıklayabilen veya kullanıcının durumunu mutatlayan tüm işlemler kullanılarak AuthorizationServiceClient.AuthorizeOrThrowAsyncyetkilendirme hizmetiyle denetlenmelidir.

Çağıranın kodun sahibi olduğunu (Live Share konağı işleciyle aynı kimlik) doğrulamak için bu kod kullanılabilir:

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;
}

Sınıfında çeşitli diğer yetkilendirme düzeyleri tanımlanır WellKnownProtectedOperations .

Hizmet istemcisi aynı makinede ve kullanıcı hesabında çalışırken tüm yetkilendirme denetimleri her zaman onaylanır. Bunların tümü, konakla aynı Microsoft hesabı altında çalışan bir Live Share konuğuna da onaylanır.

İstenen işlem yetkilendirilmediğinde bir AuthorizeOrThrowAsync UnauthorizedAccessExceptionoluşturur. Canlı Paylaşım konağı başarısız girişimin sahibine bildirimde bulunabilir ve istemcide sonraki bir denemenin başarılı olması için bu konak tanınırsa ProtectedOperation işlemi tamamlamak için gereken izni verme şansı verir.

Yinelenen AuthorizationServiceClient yetkilendirme denetimlerinin hızlı olması için tüm yetkilendirme denetimlerini yerel olarak önbelleğe alır. Kullanıcının izin kümesinin değişmesi durumunda (örneğin, Canlı Paylaşım konağı konuk için izinleri değiştirir), yerel önbellek otomatik olarak boşaltılır.

Diğer aracılı hizmetleri kullanma

Aracılı bir hizmetin kendisi başka bir aracılı hizmete erişim gerektirdiğinde IServiceBroker , hizmet fabrikasına sağlanan hizmetini kullanmalıdır. Bu belirli aracılı hizmet örneğinin bağlamını ve istemcisinin diğer davranışı etkinleştirmek ve çağırmak için sahip olduğu yetkilendirmeyi farkında olmadığından genel hizmet aracısını kullanmamalıdır.

Hesap makinesi hizmetimizin davranışını uygulamak için diğer aracılı hizmetlere ihtiyacı olsaydı, oluşturucuyu bir IServiceBrokerkabul edecek şekilde değiştirirdik:

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;
    }
}

Bu ek parametre, hizmet fabrikası sağlama kodunuzu etkiler:

 container.Proffer(
     CalculatorService,
     (moniker, options, serviceBroker, authorizationService, cancellationToken)
-        => new ValueTask<object?>(new CalculatorService(authorizationService)));
+        => new ValueTask<object?>(new CalculatorService(serviceBroker, authorizationService)));

Sınırlı aracılı hizmet kullanılabilirliği

Aracılı hizmetinizin istemcisi bir Live Share konuğu olduğunda (Ana Bilgisayar sahibinden farklı bir hesap altında), bağlamsal hizmet aracınız yalnızca bayrağını güvenlik önlemi olarak ayarlayan AllowTransitiveGuestClients diğer aracılı hizmetleri etkinleştirir. Uygun olmayan aracılı bir hizmeti etkinleştirme girişimleri bir UnauthorizedAccessExceptionoluşturur.

Aracılı hizmetiniz bayrağı olmayan AllowTransitiveGuestClients başka bir aracılı hizmet gerektiriyorsa, bunu almak için genel hizmet aracısını kullanabilirsiniz, ancak bu hizmetten alınan aracılı hizmetlerin güvenilmeyen bir konuğun nihai istemci olduğuna dair hiçbir fikri olmadığını göz önünde bulundurmanız gerekir. Diğer VS hizmetlerini veya diğer API'leri çağırma hakkında bir sonraki bölümde verilen tüm önlemleri uygulamanız gerekir.

Aracılı hizmetleri kullanma hakkında daha fazla bilgi edinin.

Diğer VS hizmetlerini veya diğer API'leri kullanma

Live Share konuklarının kullanımına sunulan aracılı hizmetlerde standart Visual Studio hizmetlerini, 3. taraf kitaplıklarını veya standart .NET API'lerini çağırmaya izin verilir, ancak bu çağrılar dikkatli bir şekilde yazılmalı ve önce tüm girişler doğrulanmalıdır.

Dosya yolları veya URL'ler, geçerli olduklarından ve konuğun erişim yetkisine sahip olduğu beklenen alt yollarda yer aldıklarından emin olmak için dikkatle denetlenmelidir. Örneğin aracılı hizmetiniz bir yola dayalı olarak dosyalardan okuma veya dosyalara yazma işlemlerine izin veriyorsa, yolun açık çözümün altına girilip girilmediğini ve varsa konuğun yazma izinlerine sahip olup olmadığının denetlenmesi gerekir. Dosya yollarının doğru şekilde doğrulanması, yolun doğru ön ek ile başlayıp izin verilen çözüm dizininden kaçması gibi görünmesini sağlamak için başka yollar dikkate alınması .. zor olabilir.

Yerleşik olarak kendi izin denetimleri olmayan herhangi bir API'yi çağırmadan önce istemcinin izni olduğunu iddia etmek için yukarıdaki bölümde açıklanan öğesini uygun şekilde kullanın AuthorizationServiceClient . Yalnızca Visual Studio'da yerleşik olarak bulunan aracılı hizmetlerin kendi yetkilendirme denetimlerini içerdiği varsayılmalıdır ve bu, yukarıdaki bölümde açıklandığı gibi bağlamsal hizmet aracısını kullanarak bu aracılı hizmetleri edinmenize bağlıdır.

Aracısız Visual Studio hizmetleri veya genel hizmet aracısı ile elde edilen aracılı hizmetler de dahil olmak üzere diğer tüm API'ler, Live Share konukunuzun izin düzeyine bakılmaksızın onları yönlendirdikçe yürütülebilir ve bu da Live Share konağı güvenliğini korumak için kendi yetkilendirme denetiminizi kritik hale getirir.

Aracılı hizmetinizden, başka bir Visual Studio aracılı hizmetinin saldırı yüzeyini artırdıkça zaten kullanıma sunulan işlevselliği göstermekten kaçının.

Aracılı hizmet örnekleri arasında durum paylaşma

Aracılı hizmetiniz, hizmetin birden çok örneğinde paylaşım durumunu gerektirdiğinde, bu veriler çeşitli izin kümelerine sahip birden çok kullanıcının kullanımına sunulur. Aracılı hizmetinizin bu verileri bu kullanıcılar arasında koruması kritik hale gelir. Tehditleri tanımlamaya, sınıflandırmaya ve nihai olarak azaltmaya yardımcı olması için STRIDE modelini kullanın.

Paylaşılan durumunuzu güvenilir olarak ele alma ve bu nedenle şirket içinde ne gerekiyorsa yapma izni verme (örneğin, VS hizmetlerine erişme veya genel hizmet aracısını kullanma) karar vekleyebilirsiniz. Böyle bir durumda, yetkilendirme hizmetini kullanan kendi kullanıcı izinleri verildiğinde tüm girişlerin uygun olduğundan emin olmak için paylaşılan durumunda yapılan çağrıları korumak tek bir aracılı hizmet örneğinin sorumluluğuna dönüşür.

Microsoft Tehdit Modelleme Aracı, paylaşılan durumunuzu ve kullanıcılarınızı korumak için kullanışlı bir araç olabilir.