ASP.NET Core 的 gRPC 安全性考量

作者:James Newton-King

本文提供使用 .NET Core 保護 gRPC 的相關資訊。

傳輸安全性

gRPC 訊息是使用 HTTP/2 來傳送和接收。 我們建議:

  • 傳輸層安全性 (TLS) 用於保護實際執行環境 gRPC 應用程式中的訊息。
  • gRPC 服務應該只透過受保護的連接埠進行待命和回應。

TLS 已在 Kestrel 中完成設定。 如需設定 Kestrel 端點的詳細資訊,請參閱Kestrel 端點組態

TLS 已在 Kestrel 中完成設定。 如需設定 Kestrel 端點的詳細資訊,請參閱Kestrel 端點組態

TLS 終止 Proxy 可以與 TLS 結合。 使用 TLS 終止雖有好處,但仍應考慮在私有網路的應用程式之間傳送無保護 HTTP 要求時的安全風險。

例外狀況

例外狀況訊息通常被視為不應向用戶端顯示的敏感性資料。 根據預設,gRPC 不會將 gRPC 服務擲回的例外狀況詳細資料傳送給用戶端。 相反地,用戶端會收到指出發生錯誤的泛型訊息。 您可以使用 EnableDetailedErrors 覆寫向用戶端傳遞的例外狀況訊息 (例如在開發或測試中)。 例外狀況訊息不應向實際執行環境應用程式中的用戶端公開。

訊息大小限制

gRPC 用戶端和服務的傳入訊息將會載入到記憶體中。 訊息大小限制是一種防範機制,可避免 gRPC 耗用過多的資源。

gRPC 是用每則訊息的大小限制來管理傳入和傳出訊息。 根據預設,gRPC 會將傳入訊息限制為 4 MB。 傳出訊息則沒有限制。

在伺服器上,您可以使用 AddGrpc 為應用程式中的所有服務設定 gRPC 訊息限制:

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 不會對連線的用戶端憑證執行額外驗證。

建議您使用 Microsoft.AspNetCore.Authentication.Certificate 套件,以用戶端憑證來保護 gRPC 服務。 ASP.NET Core 憑證驗證會對用戶端憑證執行額外的驗證,包括:

  • 憑證具備有效的擴充金鑰用途 (EKU)
  • 在有效期間內
  • 檢查憑證撤銷