Вопросы безопасности применительно к gRPC для ASP.NET Core

Автор: Джеймс Ньютон-Кинг (James Newton-King)

В этой статье представлены сведения о защите gRPC в .NET Core.

Транспортная безопасность

Сообщения gRPC отправляются и принимаются по протоколу HTTP/2. Примите во внимание следующие рекомендации.

  • Для защиты сообщений в рабочих приложениях gRPC следует использовать протокол TLS.
  • Службы gRPC должны ожидать передачи данных и отвечать только через защищенные порты.

TLS настраивается в Kestrel. Дополнительные сведения о настройке конечных точек Kestrel см. в статье Конфигурация конечной точки Kestrel.

TLS настраивается в Kestrel. Дополнительные сведения о настройке конечных точек Kestrel см. в статье Конфигурация конечной точки Kestrel.

Прокси-сервер завершения сеанса TLS можно сочетать с TLS. Преимущества использования завершения сеанса TLS следует рассматривать в сравнении с рисками безопасности при отправке незащищенных HTTP-запросов между приложениями в частной сети.

Исключения

Сообщения об исключениях, как правило, считаются конфиденциальными данными, которые не следует раскрывать клиенту. По умолчанию gRPC не отправляет сведения об исключении, возникшем в службе gRPC, клиенту. Вместо этого клиент получает общее сообщение с указанием произошедшей ошибки. Доставку сообщений об исключениях клиенту можно переопределить (например, при разработке или тестировании) с помощью EnableDetailedErrors. В рабочих приложениях сообщения об исключениях не должны предоставляться клиенту.

Ограничения на размер сообщений

Входящие сообщения для клиентов и служб gRPC загружаются в память. Ограничения на размер сообщений позволяют предотвратить чрезмерное потребление ресурсов системой gRPC.

В gRPC используются ограничения на размер отдельных входящих и исходящих сообщений. По умолчанию максимальный размер входящего сообщения в gRPC составляет 4 МБ. На размер исходящих сообщений ограничений нет.

На сервере можно настроить ограничения на размер сообщений для всех служб приложения gRPC с помощью AddGrpc:

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

С помощью AddServiceOptions<TService> можно также настроить ограничения для отдельной службы. Дополнительные сведения о настройке ограничений на размер сообщений см. в статье Настройка gRPC.

Проверка сертификата клиента

Сертификаты клиента изначально проверяются при установке соединения. По умолчанию Kestrel не выполняет дополнительную проверку сертификата клиента для подключения.

Рекомендуется, чтобы службы gRPC, защищенные с помощью сертификатов клиента, использовали пакет Microsoft.AspNetCore.Authentication.Certificate. При проверке подлинности на основе сертификата в ASP.NET Core выполняются дополнительные проверки сертификата клиента, включая следующие:

  • сертификат имеет допустимое значение расширенного использования ключа (EKU);
  • период действия сертификата не истек;
  • проверка отзыва сертификата.