MS_HTTPMethodControl - NetDevInfraWGinOSSConsortium/NetDevInfraWiki GitHub Wiki

IIS、ASP.NETでのHTTPメソッドの制御

概要

  • IISASP.NETでのHTTP メソッドの制御

  • セキュリティ云々での対策の場合、

    • 各メソッドの意味を把握しておくこと。
    • IISASP.NETでは、機能がデフォルト・ロックダウンされているので、
      何か特別な設定(WebDAV 有効化等)を行わ無い限り、通常、制限を加える必要は無い。

補足(この注意書きが本ページの核心): 脆弱性診断で
「TRACE / OPTIONS / PUT / DELETE が有効」と指摘され、
反射的に禁止設定を入れようとする——という場面が典型的だが、
原文が言う通り多くは対処不要
である。

メソッド 実際のリスク 対処
TRACE Cross-Site Tracing (XST)。IIS は既定で無効 既定のままでよい
OPTIONS 情報が漏れるわけではない。CORS で必要 禁止しない(CORS が壊れる)
PUT / DELETE WebDAV が有効な場合のみ危険 WebDAV を入れない
PROPFIND / COPY / MOVE 等 WebDAV 由来 同上
HEAD GET と同等 禁止しない

**XST(TRACE を悪用した Cookie 窃取)**は、
現在のブラウザが XMLHttpRequest での TRACE を禁止しているため
実質的に成立しない

本当に効く対策は、メソッドの禁止ではなく、

  • HttpOnly 属性(スクリプトから Cookie を読ませない)
  • WebDAV を入れない(既定で入っていない)
  • 不要なハンドラー/モジュールを削除する

といった点である。
ただし、診断報告書への対応として設定を入れる必要がある場合は、
以下の方法で対応できる。

詳細

Web サイト(IIS)全体に対する設定。

  • 設定を行う場合は、requestFiltering セクションを使用する。

  • requestFiltering セクションの verbs の allowUnlisted を

    • true に設定した場合、
      black リスト化される(add で verb を指定、allowed を false にする)。

    • false に設定した場合、
      white リスト化される(add で verb を指定、allowed を true にする)。

  • OPTIONS を black リスト登録した例。

<configuration>
 <system.webServer>
  <security>
   <requestFiltering>
    <verbs allowUnlisted="true">
     <add verb="OPTIONS" allowed="false" />
    </verbs>
   </requestFiltering>
  </security>
 </system.webServer>
</configuration>

※ GUI(IIS マネージャ)からの設定も可能。

補足(ホワイトリストが推奨): 原文が挙げる 2 方式のうち、
allowUnlisted="false"(ホワイトリスト)が望ましい

<!-- 許可するメソッドだけを列挙する -->
<requestFiltering>
  <verbs allowUnlisted="false">
    <add verb="GET"     allowed="true" />
    <add verb="POST"    allowed="true" />
    <add verb="HEAD"    allowed="true" />
    <add verb="OPTIONS" allowed="true" />   <!-- CORS を使うなら必須 -->
  </verbs>
</requestFiltering>
ブラックリスト(allowUnlisted="true" ホワイトリスト(false
新種のメソッド 素通りする 自動的に拒否
保守 危険なものを列挙し続ける必要 使うものだけ書けばよい
事故 列挙漏れ 許可漏れ(すぐ気付く)

OPTIONS を禁止すると CORS のプリフライトが壊れるため、
REST API を提供している場合は必ず許可する。
同様に、REST で PUT / PATCH / DELETE を使うなら許可が要る

応答は 404.6(Verb Denied)になる。
ログで sc-status 404 / sc-substatus 6 が出ていれば
この設定によるものと判別できる。

補足(WebDAV を無効化する方が確実): PUT / DELETE 等が
問題になるのは WebDAV モジュールが入っている場合である。
フィルターで塞ぐより、モジュール自体を外す方が確実。

<system.webServer>
  <modules>
    <remove name="WebDAVModule" />
  </modules>
  <handlers>
    <remove name="WebDAV" />
  </handlers>
</system.webServer>
# サーバの役割ごと外す
Uninstall-WindowsFeature Web-DAV-Publishing

REST API で PUT / DELETE を使っていて 405 が返るという現象は、
ほぼこの WebDAV モジュールがメソッドを横取りしていることが原因である。

Web アプリケーション(ASP.NET)に対する設定。

  • *.config の handlers セクションで、HttpForbiddenHandler を設定する。

  • handlers セクションは、.NET の HTTP ハンドラに関するセクション。

  • ポイント

    • 全てを禁止する場合、path="*" が使用できる。
    • HTTP メソッドの指定は、verb で設定できる。
<add verb="*" path="*"
  type="System.Web.HttpMethodNotAllowedHandler" />

移行メモ(本文と例が食い違っている): 本文は
HttpForbiddenHandler403 Forbidden)と述べているが、
例は HttpMethodNotAllowedHandler405 Method Not Allowed)である。
両者は別のハンドラーなので、意図に応じて使い分ける。

ハンドラー 応答 用途
HttpForbiddenHandler 403 拡張子へのアクセスを禁止.cs.config 等)
HttpMethodNotAllowedHandler 405 メソッドを禁止
HttpNotFoundHandler 404 存在を隠す
<!-- ① メソッドを禁止する(405) -->
<add verb="TRACE,OPTIONS" path="*" name="BlockVerbs"
     type="System.Web.HttpMethodNotAllowedHandler" />

<!-- ② 特定の拡張子へのアクセスを禁止する(403) -->
<add verb="*" path="*.cs" name="BlockSource"
     type="System.Web.HttpForbiddenHandler" />

原文の例(verb="*" path="*")はすべてを 405 にするため、
そのまま入れるとアプリが動かなくなる。
verb を絞って書く必要がある点に注意。

なお、.cs / .config 等は既定で HttpForbiddenHandler
割り当てられている
プリコンパイル 参照)ため、
② の設定は通常不要である。

補足(ASP.NET Core での対処/最新化): 本ページの設定は
System.Webhandlers セクションに依存しており、
ASP.NET Core では使えない

対処
IIS(前段) requestFiltering は引き続き有効web.config
ASP.NET Core ミドルウェアで判定する
ルーティング 許可するメソッドだけをマップする(推奨)
// ① そもそも許可するメソッドしかマップしない(最も素直)
app.MapGet("/items", ...);
app.MapPost("/items", ...);
//   → 未定義のメソッドは自動的に 405

// ② 全体で弾く必要がある場合はミドルウェア
app.Use(async (ctx, next) =>
{
    var allowed = new[] { "GET", "POST", "HEAD", "OPTIONS" };
    if (!allowed.Contains(ctx.Request.Method))
    {
        ctx.Response.StatusCode = StatusCodes.Status405MethodNotAllowed;
        return;
    }
    await next();
});

ASP.NET Core では、ルーティングが既定で 405 を返すため、
「定義していないメソッドは通らない」状態が自然に得られる。
明示的な禁止設定が要るのは、前段の IIS / リバース プロキシか、
診断報告書への形式的な対応が必要な場合に限られる。

参考


Tags: 移行, Windows, IIS, .NET開発, ASP.NET

⚠️ **GitHub.com Fallback** ⚠️