Considerazioni sulla sicurezza in gRPC per ASP.NET Core

Di James Newton-King

Questo articolo fornisce informazioni sulla protezione di gRPC con .NET Core.

Sicurezza dei trasporti

I messaggi gRPC vengono inviati e ricevuti tramite HTTP/2. Consigliamo:

  • Transport Layer Security (TLS) viene usato per proteggere i messaggi nelle app gRPC di produzione.
  • I servizi gRPC devono solo restare in ascolto e rispondere su porte protette.

TLS è configurato in Kestrel. Per altre informazioni sulla configurazione degli Kestrel endpoint, vedere Kestrel Configurazione dell'endpoint.

TLS è configurato in Kestrel. Per altre informazioni sulla configurazione degli Kestrel endpoint, vedere Kestrel Configurazione dell'endpoint.

Un proxy di terminazione TLS può essere combinato con TLS. I vantaggi dell'uso della terminazione TLS devono essere considerati in base ai rischi di sicurezza dell'invio di richieste HTTP non protette tra app nella rete privata.

Eccezioni

I messaggi di eccezione sono in genere considerati dati sensibili che non devono essere rivelati a un client. Per impostazione predefinita, gRPC non invia i dettagli di un'eccezione generata da un servizio gRPC al client. Il client riceve invece un messaggio generico che indica che si è verificato un errore. Il recapito dei messaggi di eccezione al client può essere sottoposto a override (ad esempio, in fase di sviluppo o test) con EnableDetailedErrors. I messaggi di eccezione non devono essere esposti al client nelle app di produzione.

Limiti delle dimensioni dei messaggi

I messaggi in arrivo a client e servizi gRPC vengono caricati in memoria. I limiti delle dimensioni dei messaggi sono un meccanismo che consente di impedire a gRPC di consumare risorse eccessive.

gRPC usa limiti di dimensione per messaggio per gestire i messaggi in ingresso e in uscita. Per impostazione predefinita, gRPC limita i messaggi in ingresso a 4 MB. Non esiste alcun limite per i messaggi in uscita.

Nel server i limiti dei messaggi gRPC possono essere configurati per tutti i servizi in un'app con AddGrpc:

public void ConfigureServices(IServiceCollection services)
{
    services.AddGrpc(options =>
    {
        options.MaxReceiveMessageSize = 1 * 1024 * 1024; // 1 MB
        options.MaxSendMessageSize = 1 * 1024 * 1024; // 1 MB
    });
}

I limiti possono essere configurati anche per un singolo servizio tramite AddServiceOptions<TService>. Per altre informazioni sulla configurazione dei limiti delle dimensioni dei messaggi, vedere configurazione di gRPC.

Convalida del certificato client

I certificati client vengono inizialmente convalidati quando viene stabilita la connessione. Per impostazione predefinita, Kestrel non esegue una convalida aggiuntiva del certificato client di una connessione.

È consigliabile che i servizi gRPC protetti dai certificati client usino il pacchetto Microsoft.AspNetCore.Authentication.Certificate . ASP.NET'autenticazione di certificazione Core eseguirà una convalida aggiuntiva su un certificato client, tra cui:

  • Il certificato ha un uso valido della chiave estesa (EKU)
  • Rientra nel periodo di validità
  • Controllare la revoca dei certificati