gRPC での ASP.NET Core のセキュリティに関する考慮事項

作成者: James Newton-King

この記事では、.NET Core を使用する gRPC をセキュリティで保護することについて説明します。

トランスポート セキュリティ

gRPC のメッセージは、HTTP/2 を使用して送受信されます。 以下のことが推奨されます。

  • トランスポート層セキュリティ (TLS) を使用して、運用環境にある gRPC アプリ内のメッセージをセキュリティで保護します。
  • gRPC サービスは、セキュリティで保護されたポートでのみリッスンと応答を行う必要があります。

TLS は Kestrel で構成されます。 Kestrel エンドポイントの構成について詳しくは、Kestrel のエンドポイント構成に関するページを参照してください。

TLS は Kestrel で構成されます。 Kestrel エンドポイントの構成について詳しくは、Kestrel のエンドポイント構成に関するページを参照してください。

TLS 終端プロキシは 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 では接続のクライアント証明書の追加の検証は実行されません。

クライアント証明書によって保護されている gRPC サービスでは、Microsoft.AspNetCore.Authentication.Certificate パッケージの使用が推奨されます。 ASP.NET Core の証明書認証では、クライアント証明書に対して、以下を含む追加の検証が実行されます。

  • 証明書に有効な拡張キー使用法 (EKU) がある
  • 有効期間内である
  • 証明書の失効について確認する