Consideraciones de seguridad en gRPC para ASP.NET Core

Por James Newton-King

En este artículo se proporciona información sobre cómo proteger gRPC con .NET Core.

Seguridad de transporte

Los mensajes gRPC se envían y se reciben mediante HTTP/2. Es recomendable que:

TLS se configura en Kestrel. Para obtener más información sobre cómo configurar puntos de conexión de Kestrel, vea Configuración de puntos de conexión de Kestrel.

TLS se configura en Kestrel. Para obtener más información sobre cómo configurar puntos de conexión de Kestrel, vea Configuración de puntos de conexión de Kestrel.

Un proxy de terminación TLS se puede combinar con TLS. Las ventajas de usar la terminación TLS deben tenerse en cuenta en los riesgos de seguridad de enviar solicitudes HTTP no seguras entre aplicaciones en la red privada.

Excepciones

Los mensajes de excepción generalmente se consideran datos confidenciales que no se deben revelar a un cliente. De forma predeterminada, gRPC no envía al cliente los detalles de una excepción iniciada por un servicio gRPC. En su lugar, el cliente recibe un mensaje genérico en el que se indica que se ha producido un error. La entrega de mensajes de excepción al cliente se puede invalidar (por ejemplo, en desarrollo o prueba) con EnableDetailedErrors. Los mensajes de excepción no se deben exponer al cliente en las aplicaciones de producción.

Límites de tamaño de los mensajes

Los mensajes entrantes a los clientes y servicios gRPC se cargan en la memoria. Los límites de tamaño de los mensajes son un mecanismo que ayuda a evitar que gRPC consuma demasiados recursos.

gRPC usa los límites de tamaño por mensaje para administrar los mensajes entrantes y salientes. De forma predeterminada, gRPC limita los mensajes entrantes a 4 MB. No hay ningún límite para los mensajes salientes.

En el servidor, los límites de los mensajes de gRPC se pueden configurar para todos los servicios de una aplicación con AddGrpc:

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

Los límites también se pueden configurar para un servicio individual mediante AddServiceOptions<TService>. Para obtener más información sobre cómo configurar los límites de tamaño de los mensajes, vea Configuración de gRPC.

Validación de certificados de cliente

Los certificados de cliente se validan inicialmente cuando se establece la conexión. De forma predeterminada, Kestrel no realiza ninguna validación adicional del certificado de cliente de una conexión.

Se recomienda que los servicios gRPC protegidos por certificados de cliente usen el paquete Microsoft.AspNetCore.Authentication.Certificate. La autenticación de certificación de ASP.NET Core realizará una validación adicional en un certificado de cliente, lo que incluye lo siguiente:

  • El certificado tiene un uso mejorado de clave (EKU) válido.
  • Está dentro de su período de validez.
  • Se comprueba la revocación de certificados.