Web アプリケーションの HTTP レスポンスヘッダーを追加して、アプリケーションのセキュリティを向上させることができます。このトピックでは、Envoy フィルターを使用して Service Mesh(ASM)で HTTP レスポンスヘッダーを追加する方法について説明します。
前提条件
Service Mesh(ASM)インスタンスが作成されています。ACK クラスタが ASM インスタンスに追加されています。詳細については、「ASM インスタンスの作成」および「ASM インスタンスへのクラスタの追加」をご参照ください。
kubectl を使用して ASM インスタンスに接続しています。詳細については、「コントロールプレーンで kubectl を使用して Istio リソースにアクセスする」をご参照ください。
アプリケーションが ASM インスタンスにデプロイされています。詳細については、「ASM インスタンスへのアプリケーションのデプロイ」をご参照ください。
必要な Istio リソースが定義されています。詳細については、「Istio リソースを使用してトラフィックをサービスの異なるバージョンにルーティングする」をご参照ください。
背景情報
Open Web Application Security Project(OWASP)は、HTTP レスポンスヘッダーを使用してアプリケーションのセキュリティを向上させる方法について説明するためのベストプラクティスとコーディングフレームワークを提供しています。次の表は、基本的な HTTP レスポンスヘッダーについて説明しています。
HTTP レスポンスヘッダー | デフォルト値 | 説明 |
Content-Security-Policy | frame-ancestors none; | 他の Web サイトからのクリックジャッキング攻撃を防ぎます。 |
X-XSS-Protection | 1;mode=block | ブラウザのクロスサイトスクリプティング(XSS)フィルター(使用可能な場合)をアクティブ化して、XSS 攻撃が検出されたときにブラウザがレンダリングを停止できるようにします。 |
X-Content-Type-Options | Nosniff | ブラウザのコンテンツスニッフィングを無効にします。 |
Referrer-Policy | no-referrer | リクエストと共にリファラー情報を送信しないように指定します。 |
X-Download-Options | noopen | 古いバージョンの Internet Explorer でダウンロードが自動的に実行されるのを防ぎます。 |
X-DNS-Prefetch-Control | off | Web ページ上の外部ハイパーリンクの DNS プリフェッチを無効にします。 |
Server | envoy | レスポンスを生成するサーバー。この HTTP レスポンスヘッダーは、Istio ingress gateway によって自動的に設定されます。 |
X-Powered-by | N/A | ホスティング環境または他のフレームワークに関する情報が含まれています。脆弱なアプリケーションサーバーの名前とバージョン情報を非表示にする場合は、この HTTP レスポンスヘッダーを設定しないでください。 |
Feature-Policy | camera 'none'; microphone 'none'; geolocation 'none'; encrypted-media 'none'; payment 'none'; speaker 'none'; usb 'none'; | ブラウザで使用可能な機能と API 操作を指定します。 |
この例では、Bookinfo アプリケーションが使用されています。詳細については、「ASM インスタンスへのアプリケーションのデプロイ」をご参照ください。次の curl コマンドを実行して、アプリケーションの HTTP レスポンスヘッダーをクエリできます。
curl -I http://{IP address of the ingress gateway}/productpage
# Output example
HTTP/1.1 200 OK
content-type: text/html; charset=utf-8
content-length: 5183
server: istio-envoy
date: Tue, 28 Jan 2020 08:15:21 GMT
x-envoy-upstream-service-time: 28コマンド出力は、アプリケーションに上記の表で説明されている HTTP レスポンスヘッダーのいずれも含まれていないことを示しています。アプリケーションのセキュリティを向上させるために、Envoy フィルターを作成してアプリケーションの HTTP レスポンスヘッダーを追加できます。
手順
ASM インスタンスのバージョンに基づいて Envoy フィルターをデプロイします。
バージョン 1.12.4.0 以降の ASM インスタンスの場合
ASM コンソールのマーケットプレイスページで Envoy フィルターをデプロイできます。
ASM コンソール にログインします。左側のナビゲーションペインで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションペインで、 を選択します。
[マーケットプレイス] ページで、[HTTP レスポンスヘッダーの追加] をクリックします。[プラグインの詳細] ページで、[プラグインインスタンスの作成] をクリックします。
[プラグインの有効範囲] セクションで、[ゲートウェイスコープ] を選択し、[ASM ゲートウェイを有効範囲に追加] をクリックします。
[ASM ゲートウェイを有効範囲に追加] ダイアログボックスで、[ASM ゲートウェイの選択] セクションの [ingressgateway] を選択し、
アイコンをクリックして [ingressgateway] を [選択済み] セクションに追加し、[OK] をクリックします。説明[ingressgateway] は、デフォルトの ingress gateway の名前です。追加された HTTP レスポンスヘッダーを有効にする他のゲートウェイを選択することもできます。
[プラグイン設定] セクションで、YAML コードエディターからすべてのコンテンツを削除し、[プラグインスイッチ] をオンにして、プラグインが有効になるまで待ちます。
プラグインが有効になると、ASM は Envoy フィルターを自動的に作成します。
バージョン 1.12.4.0 より前の ASM インスタンスの場合
次のコマンドを実行して、Envoy フィルターをデプロイできます。
proxyVersion: Envoy フィルターが適用される Istio のバージョンを指定します。値を Istio のバージョンに設定します。Envoy フィルターの一部のフィールドは、Istio のバージョンと互換性がない場合があります。Istio のバージョンに基づいて、Envoy フィルターのフィールドを変更する必要がある場合があります。Istio のバージョンが 1.8 以前の場合は、
proxyVersionパラメーターを Istio のバージョンに設定し、envoy.filters.network.http_connection_managerをenvoy.http_connection_managerに、envoy.filters.http.routerをenvoy.routerに、type.googleapis.com/envoy.extensions.filters.http.lua.v3.Luaをtype.googleapis.com/envoy.config.filter.http.lua.v2.Luaに置き換えます。Istio のバージョンが 1.9 以降の場合は、
proxyVersionパラメーターを Istio のバージョンに設定します。
次のコマンドを実行して、HTTP レスポンスヘッダーが正常に追加されたかどうかを確認します。
{IP address of the ingress gateway}を ingress gateway の実際の IP アドレスに置き換えます。ingress gateway の IP アドレスを取得する方法の詳細については、「Istio リソースを使用してトラフィックをサービスの異なるバージョンにルーティングする」トピックの「ingress gateway の IP アドレスを取得する」セクションをご参照ください。curl -I http://{IP address of the ingress gateway}/productpage予期される出力:
HTTP/1.1 200 OK content-type: text/html; charset=utf-8 content-length: 4183 server: istio-envoy date: Tue, 28 Jan 2020 09:07:01 GMT x-envoy-upstream-service-time: 17 content-security-policy: frame-ancestors none; x-frame-options: deny x-xss-protection: 1; mode=block x-content-type-options: nosniff referrer-policy: no-referrer x-download-options: noopen x-dns-prefetch-control: off feature-policy: camera 'none';microphone 'none';geolocation 'none';encrypted-media 'none';payment 'none';speaker 'none';usb 'none';コマンド出力は、アプリケーションに上記の表で説明されている基本的な HTTP レスポンスヘッダーが含まれていることを示しています。
FAQ
特殊文字を含む URL を使用してアプリケーションにアクセスできないのはなぜですか?
特殊文字のエンコード形式が URL エンコード規則に準拠していない可能性があります。たとえば、特殊文字 Á に ASCII エンコードではなく Unicode エンコードが使用されています。詳細については、「Envoy cannot parse non-alphanumeric characters if not urlencoded」をご参照ください。