今夜つける HTTPレスポンスヘッダー (セキュリティ編)

Webサーバーがレスポンスを発行する際に、HTTPレスポンスヘッダーに付けるとセキュリティレベルの向上につながるヘッダーフィールドを紹介します。
囲み内は推奨する設定の一例です。ブラウザによっては対応していないヘッダーフィールドやオプションなどもありますので、クライアントの環境によっては機能しないこともあります。

X-Frame-Options

ブラウザが frame または iframe で指定したフレーム内にページを表示することを制御するためのヘッダーフィールドです。主にクリックジャッキングという攻撃を防ぐために用いられます。

X-Frame-Options: SAMEORIGIN

  • DENY フレーム内にページを表示することを禁止(同じサイト内であっても禁止です)
  • SAMEORIGIN 自分自身と生成元が同じフレームの場合にページを表示することを許可(他のサイトに禁止したい場合は主にこれを使用します)
  • ALLOW-FROM origin_uri 指定された生成元のみページを表示することを許可(特定のサイトのみに許可したい場合はこれを使用します)

X-Frame-Options レスポンスヘッダ - HTTP | MDN

X-Content-Type-Options

script または stylesheet で読み込むファイルの MIME タイプが正しい(許可された)ものと一致しない限りファイルを読み込みません。非HTMLをHTMLと見なすなど、コンテンツ内容の誤判定を利用した XSS などの攻撃を防ぐために用いられます。

X-Content-Type-Options: nosniff

機密情報を含むJSONには X-Content-Type-Options: nosniff をつけるべき - 葉っぱ日記
MIME タイプのセキュリティ リスクの軽減 (Windows)

X-XSS-Protection

ブラウザの XSSフィルターの機能を有効にし、XSS攻撃を防ぐために用いられます。

X-XSS-Protection: 1; mode=block

  • 0 XSSフィルターを無効
  • 1 XSSフィルターを有効(IE,Chromeの場合は 1; mode=block が使える)

2008/7/2 - IE8 Security Part IV: The XSS Filter
IE8 XSS Filterの仕様が微妙に変更されていた。 - 葉っぱ日記

Content-Security-Policy

外部のリソースを信頼できる生成元以外から読み込めないように制限することができます。XSSやデータインジェクション攻撃を検出して軽減することがあります。(ただし、設定によっては外部リソースを読み込めないようにすることによって、現在動作しているスクリプトが動かなくなる可能性があります。)
以前は、"X-Content-Security-Policy" というヘッダーフィールド名を使っていました。

Content-Security-Policy: default-src 'self'

  • default-src 'self' 同じオリジン(同じURLスキーム、ホスト、ポート番号)からはすべてのコンテンツを読み込むようにしたい場合
  • default-src 'self' *.example.com 指定したドメインとすべてのサブドメインからのコンテンツを許可したい場合

CSP (Content Security Policy) - Security MDN

X-Permitted-Cross-Domain-Policies

「crossdomain.xml 」(Flash コンテンツから別ドメインにあるファイルを読み込む際に必要になる設定を記述したポリシーファイル)をサイトのドキュメントルートに置くことができない場合などに、同様の効果を発揮することができます。

X-Permitted-Cross-Domain-Policies: master-only

  • master-only マスターポリシーファイル( /crossdomain.xml)のみが許可される

Flash Player 9および10におけるポリシーファイル関連の変更点 | デベロッパーセンター

Strict-Transport-Security

指定されたサイトが常に HTTPS プロトコルを使ってアクセスするようにブラウザに指示します。HTTPのサイトからHTTPSにリダイレクトするより安全に誘導する方法です。

Strict-Transport-Security: max-age=31536000; includeSubDomains

  • max-age STSを有効にする期間、想定される再訪問の時間より遙かに長い目に設定した方がよい
  • includeSubDomains サブドメインにもルールを適用する。

HTTP Strict Transport Security - The Chromium Projects
HTTP Strict Transport Security - Security | MDN

Access-Control-Allow-Origin など CORS 関連

XMLHttpRequestを使って、他のドメインなどからリソースを取得したいクロスドメイン通信をしたい場合に指定します。使う場合には詳しくはCORS (Cross-Origin Resource Sharing)勧告などを参考にして下さい。

Access-Control-Allow-Origin: http://www.example.com
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Headers: X-TRICORDER
Access-Control-Max-Age: 1728000

上記は "http://www.example.com" からのクロスドメイン通信をしたい場合の設定で、当該リソースへの問い合わせには POST, GET, OPTIONS が実行可能なメソッド、カスタムヘッダーとして "X-TRICORDER" を付けたリクエストを送信し、プリフライトのレスポンスをキャッシュしていい時間が 1,728,00 秒だということを表しています。
HTTP access control (CORS) | MDN

X-Download-Options

ユーザーがダウンロードしたファイルを直接"開く"ことを防止したい場合に指定します。

X-Download-Options: noopen

  • noopen IE8以降ではユーザーはファイルを直接開くことができず、ローカルに保存することになります。ダウンロードのダイアログから"開く"がなくなります。

IE8 Security Part V: Comprehensive Protection - IEBlog - Site Home - MSDN Blogs

Set-Cookie

Cookie をセットします。サーバーがクライアントに対して状態管理を始める際などにさまざまな情報を伝えます。

Set-Cookie: name=value; secure; HttpOnly

  • secure HTTPSで通信している場合にのみ Cookie を送信する
  • HttpOnly CookieJavaScript からアクセスできないようにする
  • path 属性は Cookie を送出するディレクトリを限定する指定ですが、回避する方法がありセキュリティ機構としては期待できません。
  • domain 属性は後方一致になります。明示的に複数ドメインに対して Cookie を送出する場合を除いて、この属性は設定しない方が安全です。

Cache-Control

ディレクティブと呼ばれるコマンドを指定することで、ブラウザのキャッシング動作を指定します。

Cache-Control: no-cache, no-store, must-revalidate

  • no-cache キャッシュサーバーはリソースを格納してはならない。また有効性の再確認なしではキャッシュを使用してはならない
  • no-store キャッシュはリクエスト・レスポンスの一部分をローカルストレージに保存してはならない
  • must-revalidate キャッシュ可能であるが、オリジンサーバーにリソースの再確認を要求する

pragma

HTTP/1.0との後方互換性のためだけに定義されているヘッダーフィールドで、本来はクライアントからのリクエストのみに使用されます。"Cache-Control: no-cache”と併記するとよいでしょう。

pragma: no-cache

  • no-cache クライアントがすべての中間サーバーに対して、キャッシュされた応答を望まないことを要求する

expires

リソースの有効期限の日時を伝えます。キャッシュされることを望まない場合には、Date ヘッダーフィールドの値と同じに設定するか、"-1"と設定します。

expires: -1

HOWTO Internet Explorer でキャッシュを無効にする

content-type

エンティティボディに含まれるオブジェクトのメディアタイプを伝えます。charsetでは文字セットを指定します。正しいメディアタイプの設定と、正しい文字コードを正しい表記で設定しましょう。

content-type: text/html;charset=utf-8

HTTPレスポンスヘッダーの設定の仕方

Apache で追加する場合には、httpd.conf の中で下記のモジュールが有効になっている必要があります。

  • LoadModule headers_module modules/mod_headers.so

常に表示する HTTP レスポンスヘッダーを追加するには、下記のように設定を行います。

Header set HeaderFieldName "value"

Header set X-XSS-Protection "1; mode=block”

タイトルは、拙著『今夜わかるHTTP』からですが、『HTTPの教科書』の方が新しい本です。また、セキュリティ編としてますがたぶん完結です。2に続くか…?
ご意見などお待ちしています。そのうち OWASP Japan の OWASP Night でも紹介するかも。

HTTPの教科書
HTTPの教科書
  • 発売元: 翔泳社
  • 価格: ¥ 2,730
  • 発売日: 2013/05/25

追記

2013/12/01 "Access-Control-Allow-Origin"などCORS関連、"X-Download-Options"を追記しました。その他説明を微修正。コメント頂いた @hasegawayosuke さん、@kinugawamasato さん、@ockeghem さん、@hirayasu さんありがとうございます。