HttpSys では、TLS チャネル バインド トークンの公開が既定で有効になります

ASP.NET Core 11 では、Microsoft.AspNetCore.Server.HttpSysは起動時にHttpServerChannelBindPropertyを使用して URL グループを無条件に構成します。 これにより、新しい ITlsConnectionFeature.TryGetChannelBindingBytes API を使用して RFC 5929 エンドポイント TLS チャネル バインド トークン (CBT) がアプリに公開され、認証のための拡張保護 (EPA) シナリオが有効になります。

導入されたバージョン

.NET 11

以前の動作

HttpSys ベースのサーバーでは、起動時に URL グループに HttpServerChannelBindProperty が構成されておらず、RFC 5929 TLS チャネル バインド トークンがアプリに公開されませんでした。

アプリケーションは、 Microsoft.AspNetCore.Server.HttpSys.EnableCBTHardeningAppContext スイッチを有効にすることでオプトインできます。 そのスイッチは、セキュリティ強化レベルを Mediumに設定しましたが、 HTTP_CHANNEL_BIND_SECURE_CHANNEL_TOKEN フラグを設定していないので、http.sys は要求ごとの CBT を配信しませんでした。

ITlsConnectionFeature トークンを取得する方法がありませんでした。 唯一の関連 API は、現在使用されなくなった ITlsTokenBindingFeatureであり、これは別の無関係な機能です。

新しい動作

HttpSysOptionsには、既定でMediumHttpAuthenticationHardeningLevel (LegacyMediumStrict) の新しいプロパティ HttpAuthenticationHardeningLevelがあります。

起動時に、HttpSys はHttpServerChannelBindPropertyを使用してHttpSetUrlGroupPropertyを無条件で呼び出し、構成されたセキュリティ強化レベルを適用します。 MediumStrictでは、http.sys が要求ごとのHTTP_REQUEST_CHANNEL_BIND_STATUSを配信するように、HTTP_CHANNEL_BIND_SECURE_CHANNEL_TOKEN フラグも設定します。

新しい ITlsConnectionFeature.TryGetChannelBindingBytes(ChannelBindingKind kind, out ReadOnlyMemory<byte> channelBindingToken) は、認証済みの HTTPS 要求でエンドポイント CBT (RFC 5929 tls-server-end-point) を返します。

HttpSetUrlGroupProperty呼び出しが失敗した場合 (古いカーネルやブロックされたカーネルなど)、エラーがログに記録され、起動が続行されます。 アプリは、 Legacy が構成されているかのように実行されます。

破壊的変更の種類

この変更は 動作の変更です。

変更理由

この変更により、認証ミドルウェアに RFC 5929 エンドポイント チャネル バインドが公開されるため、認証のための拡張保護 (EPA) を実装できます。 EPA は、Kerberos、NTLM、またはネゴシエート認証を基になる TLS チャネルに暗号でバインドし、認証リレー攻撃を軽減します。 以前は、ASP.NET Core サーバーは CBT をマネージド コードに公開していません。

詳細については、 dotnet/aspnetcore#67436 を参照してください。

ほとんどのユーザーに対してアクションは必要ありません。 新しい API がオプトインされます。 TryGetChannelBindingBytes呼び出さないアプリでは、要求ごとのコストが引き続き小さくなります。Medium強化 (既定) では、http.sys は、すべての HTTPS 要求のチャネル バインド トークンをキャプチャし、ユーザー モードに渡される要求情報に含めます。これによって、少量のカーネル作業が追加され、要求あたり約 40 バイトが追加されます。 一般的なワークロードではオーバーヘッドはごくわずかですが、ゼロではありません。 完全に削除する必要があるアプリは、 HttpAuthenticationHardeningLevel.Legacy を設定することでオプトアウトできます (以下のコード スニペットを参照)。

.NET 11 より前の動作を復元するには、セキュリティ強化レベルをLegacyに設定します。

builder.WebHost.UseHttpSys(options =>
{
    options.HttpAuthenticationHardeningLevel = HttpAuthenticationHardeningLevel.Legacy;
});

Legacyが構成されている場合、HttpSys は CBT フラグを設定せず、http.sys はHTTP_REQUEST_CHANNEL_BIND_STATUSを設定せず、TryGetChannelBindingBytesfalseを返します。

HttpServerChannelBindPropertyは、Windows 7 および Windows Server 2008 R2 (2009 年 10 月 22 日リリース) 以降、http.sys でサポートされています。これは、サポートされている ASP.NET Core バージョンの OS フロアの下にあります。 ASP.NET Coreサポートされている OS は影響を受けなくなります。

影響を受ける API

  • Microsoft.AspNetCore.Server.HttpSys.HttpSysOptions.HttpAuthenticationHardeningLevel (新規)
  • Microsoft.AspNetCore.Server.HttpSys.HttpAuthenticationHardeningLevel (新しい列挙型)
  • Microsoft.AspNetCore.Http.Features.ITlsConnectionFeature.TryGetChannelBindingBytes (新しい既定のインターフェイス メソッド)