あなたの設定方法ASP.NET WebアプリとApi web上でホストされているアプリケーションにHTTPS
を要求するには、セキュリティが最初から組み込まれていることが不可欠です。
WEBアプリケーションがHTTPS経由で安全なトラフィックを提供できるようにし、このポリシーを適用することは、最初に実装する必要があることの1つで、これはApiと同じようにwebアプリケーションにとって重要です。
無料のTLS証明書を提供するLet’S Encryptのような確立されたサービスでは、WEBアプリケーションにHTTPSを使用しないという説得力のある技術的または財政的理由は
この記事では、HTTPSを必要とするようにwebアプリケーションを正しく構成する方法を示し、両方の例について説明しますASP.NET とASP.NET コアプロジェクト。
HTTPSリダイレクト
サイトが適切に保護されていることを確認するには、光沢のある新しいSSL/TLS証明書を取得してインストールした後、HTTPSが常に使用されていることを確認する必要があります。
MVCアプリケーションなどのwebアプリでは、httpからHTTPSにリダイレクトされるようにトラフィックを設定できます。
さまざまな理由から、デフォルトのHTTPポート(ポート80)を開いたままにし、ブラウザを介してアクセスされるwebアプリケーションのデフォルトのHTTPSポート(ポート443)にユーザーをリダイレクトすることをお勧めします。
これは、Let’S Encryptドキュメント内の公式のベストプラクティスのアドバイスの一部です。 セキュリティのトップ研究者であるScott Helm氏は、webアプリケーションの文脈でポート80を閉じることがセキュリティに悪い理由を説明する非常に良い記事を持っています。
以下のセクションでは、HTTPSリダイレクトを設定する方法を示しますASP.NET とASP.NET コアwebアプリケーション。
ASP.NET ウェブアプリ
ASP.NET MVCフレームワークには、便利に利用できる組み込みのRequireHttpsAttribute
クラスがあります。
この属性を適用すると、要求がHTTPSではなくHTTP経由で送信された場合、リダイレクト応答がクライアントに送り返されます。
属性は、コントローラごとまたはアクションごとに適用できます。 ただし、以下に示すように、サイト全体でHTTPSリダイレクトを強制するために、属性をグローバルに適用することを強くお勧めします。
Add(新しいRequireHttpsAttribute());
上記のコード行は、通常、以下のコードスニペットに従って、FilterConfig
クラスの静的なRegisterGlobalFilters
メソッド内に表示されます。
/// <概要>///グローバルフィルタを登録します。///</summary>///<param name="filters">登録するフィルタのコレクション</param>public static void RegisterGlobalFilters(GlobalFilterCollection filters){フィルタ。Add(new HandleErrorAttribute());フィルター。Add(new RequireHttpsAttribute());フィルター。Add(新しいAuthorizeAttribute());}
の中で、ASP.NET アプリケーションでは、RegisterGlobalFilters
メソッドは通常、グローバル内のApplication_Start
メソッドから起動時に呼び出されます。asaxファイル。
先に進む前に、グローバルフィルタはコントローラに渡されるHTTP要求にのみ適用されることに注意することが重要です。 したがって、クライアントが安全でないHTTP経由でスタイルシートやスクリプトファイルなどの静的ファイルにアクセスすることは可能です。
HTMLから参照している静的リソースへの相対リンクを使用するか、HTTPSスキームで絶対Urlを使用してすべてのコンテンツが安全に提供されていることを
書き換えルール
WEBアプリケーションをさらに安全にするには、IIS設定の一部としてリバースプロキシレベルでリダイレクトを設定できます。 これにより、すべての着信要求が適切にリダイレクトされるようになります。
IISの場合、webに以下を追加することで、書き換えルールを介してこれを実装することができます。設定ファイル。
<書き換え><ルール><ルール名="HTTPからHTTPSへのリダイレクト"stopProcessing="true"><マッチurl="(.*)" /> <条件><add input="{HTTPS}"pattern="off"ignoreCase="true"/></条件><アクションタイプ="リダイレクト"url="https://{HTTP_HOST}/{R:1}"redirectType="永続"/></ルール></ルール></ルール></ルール></ルール></ルール></ルール></ルール></ルール></ルール></ルール></rewrite>
iisは、受信トラフィックを処理するときに上記の書き換えルールを尊重し、アプリケーションコードに到達する前に安全でないトラフィックをhttpsにリダイレ
セキュリティの多くの側面と同様に、複数のセキュリティ層を配置することが最善であると私は信じています。 あるレベルで何かが失敗したり、誤って設定されたりした場合、フォールバックを持つことは常に良いことです。
.NET Core
.NET CoreにはRequireHttpsAttribute
クラスが組み込まれており、コントローラ/アクションごとに適用することも、グローバルに登録することもできます。
グローバル登録は、以下に示すように、Startup
クラスのConfigureServices
メソッド内で設定できます。
/// <summary>///このメソッドはランタイムによって呼び出されます。// コンテナにサービスを追加するには、このメソッドを使用します。///</summary>///<param name="services">コンテナサービスのコレクション</param>public void ConfigureServices(IServiceCollection services){サービス。AddControllersWithViews(options=>オプション。フィルター。Add(新しいRequireHttpsAttribute()));}
上記のコードは、従来のコードと基本的に同じことを行いますASP.NET プロジェクト。
しかし、.NET Coreでは、これよりも優れたことができます。
.NET CoreにはHTTPSリダイレクトミドルウェアも組み込まれており、以下に示すように1行のコードで構成できます。
UseHttpsRedirection();
上記のコード行は、Startup
クラスのConfigure
メソッドに追加する必要があります。 標準のほとんどASP.NET MVCなどのコアwebアプリケーションテンプレートでは、HTTPSリダイレクトミドルウェアを自動的に設定します。
以下は、参考のためのConfigure
メソッドの典型的な内容の例です。
/// <summary>///このメソッドはランタイムによって呼び出されます。///このメソッドを使用して、HTTP要求パイプラインを構成します。///</summary>///<param name="app">要求パイプラインの構成に使用されるアプリケーションビルダーオブジェクト</param>///<param name="env">アプリケーションが</param>public void Configure(IApplicationBuilder app,iwebhostenvironment env){if(env.IsDevelopment()){アプリ。を使用しています。この場合は、"UseExceptionHandler("/Home/Error");アプリ。UseHsts();}アプリ。UseHttpsRedirection();アプリ。UseStaticFiles();アプリ。ユーザー名();アプリ。アプリを使用しています。UseEndpoints(endpoints=>{エンドポイント。MapControllerRoute(name:"default",pattern:"{controller=Home}/{action=Index}/{id?}"); });}
では、HTTPSリダイレクトミドルウェアがRequireHttpsAttribute
フィルタよりも優れているのはなぜですか?
まあ、その方法のおかげでASP.NET コアwebアプリはホストされており、ミドルウェアのHTTPSリダイレクトはより高いレベルで適用されるため、スタイルシートやスクリプトなどの静的ファイルの要求は、コントローラーバインドの要求に加えてリダイレクトされます。
HSTS
ASPの別の有用な部分。NET CoreミドルウェアはHSTSミドルウェアであり、上記の例では次のコード行を介して構成されています。
UseHsts();
組み込みのミドルウェアコンポーネントの多くと同様に、より多くの高度な側面があることに注意してくださいASP.NET コアミドルウェアは、StartupクラスのConfigureServices
メソッド内で構成できます。
HSTSとは何ですか、なぜそれを使用する必要がありますか?
HTTPSリダイレクト自体の問題は、クライアントからアプリケーションに入ってくる最初の安全でない要求にあります。
最初の着信HTTP要求が”中間の男”によって傍受された場合、要求の整合性は失われます。 たとえば、クライアントは、偽のログインページなどに気付かずに別の場所にリダイレクトされる可能性があります。
HSTSはHTTP Strict Transport Securityの略で、WEBアプリケーションにHTTPS経由でのみアクセスすることをブラウザに通知することで、上記の問題を解決するのに役立ちます。
これは、後続の要求がそれ以上のリダイレクトなしでHTTPSを使用するように、応答にStrict-Transport-Securityヘッダーを返すことによってこれを行います。 ブラウザはこの指示をキャッシュして、サイトへのさらなる訪問がこれ以上のリダイレクトなしでHTTPS経由になるようにします。
最初のリクエスト
はい、それはすべて素晴らしい音ですが、その最初のリクエストはどうですか?
私たちはほとんどの問題を解決しましたが、私たちはまだ私たちのサイトを訪れたことのないクライアントから受け取った最初の要求に対処して
超安全でループを閉じるために、私たちはサイトを”プリロード”するように登録することができます。 ブラウザは”プリロード”リストにあるサイトのリストを保持し、あなたのサイトがこのリストにある場合、ブラウザはプリロードステータスを尊重するので、ク
HSTS Preload webサイトにアクセスし、プリロードを要求することで、プリロードするサイトを登録できます。
以下は、preloadディレクティブを指定したHSTSヘッダーの例です。
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
本番環境でHSTSを有効にする前にサイトを徹底的にテストして、HTTPS経由で正常に動作していることを確認することが非常に重要であることに注 これは簡単に元に戻すことができず、サイトをプリロードリストから削除するのに数ヶ月かかる可能性があるため、サイトをプリロードすることを選択
webアプリケーション用にHSTSを設定することを強くお勧めします。 また、サイトをプリロードするかどうかは、特定のセキュリティ要件によって異なります。
送信ルール
この記事の前の”書き換えルール”セクションに従って、リバースプロキシレベルでHSTSを有効にすることもできます。
以下は、Web内でこれを設定する方法の例です。IISでアプリケーションをホストしている場合の設定ファイル。
<書き換え><outboundRules><ルール名="HTTPSのときにStrict-Transport-Securityを追加"enabled="true"><マッチserverVariable="Response_Strict_Transport_Security"パターン="。*"/><条件><入力を追加="{HTTPS}"パターン="on"ignoreCase="true"/></条件><アクションタイプ="書き換え"値="max-age=31536000" /> </rule></outboundRules></rewrite>
これで、HSTSヘッダーがサイト上のすべてのHTTPSトラフィックに設定されます。
上記のアプローチは、伝統的な両方のために働くことに注意してくださいASP.NET とASP.NET コアアプリケーション。 ウェブを追加するだけです。設定ファイルをプロジェクトにコピーし、’出力ディレクトリにコピー’プロパティが’新しい場合はコピー’に設定されていることを確認してくださ
Api
Apiは、設計、意図されたユースケース、セキュリティ上の考慮事項の両方で、人間がアクセスする通常のwebアプリケーションとはかなり異なります。
以下のセクションでは、APIにHTTPSを要求するためのベストプラクティスについて説明します。
ASP.NET Web APIプロジェクトには、HTTPSを要求するための組み込み属性にアクセスできません。
しかし、これは私たちが私たち自身を作成するのを止めるものではありません。
以下は、これを行う方法の例です。
/// <summary>/// Called when a process requests authorization./// </summary>/// <param name="actionContext">The action context</param>public override void OnAuthorization(HttpActionContext actionContext){ HttpRequestMessage request = actionContext.Request; if (request.RequestUri.Scheme != Uri.UriSchemeHttps) { if (request.Method.Equals(HttpMethod.Get)) { actionContext.Response = request.CreateResponse(HttpStatusCode.Found, "SSL is required"); // Provide the correct URL to the user via the Location header. var uriBuilder=新しいUriBuilder(request.リクエスト){スキーム=Uri.UriSchemeHttps,Port=443};actionContext.応答。ヘッダー。場所=uriBuilder.Uri;}else actionContext.応答=要求。CreateResponse(HttpStatusCode.NotFound、"SSLが必要です"); }}
上記の例では、AuthorizationFilterAttribute
クラスから派生したRequireHttpsAttribute
というクラスを作成し、仮想OnAuthorization
メソッドをオーバーライドしています。
GET要求の場合、上記のメソッドは、LOCATIONヘッダーでこれを返すことにより、HTTPSスキームを使用して正しいURLをクライアントに通知します。 他のすべての要求では、”SSLが必要です”というメッセージが返されます。
これはブラウザからAPIを呼び出すときに理にかなっていますが、上記のコードの問題の一つは、ほとんどのAPIクライアントが理解できないリダイレクトステータスコードを返していることです。あなたの視点に応じて、上記のコードを修正して、クライアントをリダイレクトしようとするのではなく、HTTPステータスコードをBad Requestなどの他のものに設定す
同様のものを実装することができます。NET Coreは、組み込みのRequireHttpsAttribute
クラスから派生したApiRequireHttpsAttribute
などの独自のクラスを作成します。 次に、以下のサンプルコードに従って、仮想HandleNonHttpsRequest
メソッドをオーバーライドし、それに応じて応答コードを設定できます。
/// <概要>///要求がHTTPS経由で受信されない場合に呼び出されます。///</summary>///<param name="filterContext">フィルタコンテキスト</param>protected override void HandleNonHttpsRequest(A U T Horizationfiltercontext filterContext){filterContext.結果=新しいStatusCodeResult(400);}
上記のコードは、Bad Request(400)への応答のHTTPステータスコードを設定します。 これは、応答または他のカスタムロジックが必要とされるものにメッセージを含めるように修正することができます。
聞いてない?
さて、APIクライアントがHTTPを使用しようとするたびにHTTPSを使用するように強制する方法を見てきました。
しかし、これは最良の選択肢ですか?
ベストプラクティスでは、複数のセキュリティ層を持つ必要がありますが、可能な限り早期にセキュリティを実装する必要があります。
実際には、Apiのコンテキストでできる最も安全なことは、そもそも安全でないポートでリッスンしないようにすることです。 このアドバイスは、Microsoft Docsで以下のために反映されていますASP.NET コア。
もちろん、APIクライアントが安全でない方法でAPIに到達しようとするのを防ぐことはできません。 しかし、この場合、それはAPIインテグレータの障害であり、防止するために意味のあることを行うことができるものではありません。
概要
この記事では、WEBアプリとApiにHTTPSを適用する方法を説明し、両方のシナリオに対して最も適切で安全なソリューションについて説明しました。
取り除くべき重要なことは、アプリケーションに複数のセキュリティ層を実装し、可能な限り早期にセキュリティを強制することです。
HSTSを利用し、リバースプロキシ設定のパワーを活用して、安全な方法で要求を処理します。
Leave a Reply