この記事は以下のターゲットを対象としています。
★5 Django の開発経験が 3 年以上。
★4 Django の開発経験が 1 年以上。
★3 WEB サイト開発経験あり。これから Django を学習します。
★2 Python 初級者。簡単なプログラムコードが書けます。
★1 プログラミング未経験。
こんにちは。グローバルウェイの清家です。
今月は久しぶりにDjangoのセキュリティについて記事をお届けします。前回の記事ではクロスサイトスクリプティング(引用リンク)、SQLインジェクション(引用リンク)を紹介しました。これらのセキュリティ対策はほんの一部に過ぎず、攻撃者はあらゆる手を使って攻撃を試みます。
今回紹介するセキュリティ対策は、レスポンスヘッダに適切な設定をすることでWEBアプリケーション全体のセキュリティリスクを防ぐことができます。
今回Djangoの環境設定やミドルウェアを使用します。ミドルウェアについて、本記事では詳しく取り上げませんが、簡単に言うと、Djangoのリクエスト/レスポンス処理にフックを加えるためのDjangoフレームワークです。今回はこの仕組みを用います。
それでは、セキュリティリスクと対策を見ていきましょう。
〔Cache-Controlレスポンスヘッダ〕
Cache-Controlレスポンスヘッダは、キャッシュの動作を管理するための設定です。
本設定がされていない場合、HTTPSによる通信内容が通信経路途中のプロキシサーバやキャッシュサーバに記録される可能性があり、情報漏洩の危険性が生じます。
Djangoではどのように設定すればいいか見ていきます。
base.pyは、Djangoの環境設定ファイルでミドルウェアを設定します。
フック処理用にResponseHeaderクラスを定義します。
〔base.py〕 MIDDLEWARE = [ ・・・ “middleware.response.ResponseHeader”, ] |
ResponseHeaderではprocess_responseをオーバーライドし、レスポンス処理をフックします。
Cache-Controlに以下の設定をすることで、キャッシュを無効化します。
HTTP/1.0との下位互換で、Cache-Controlを使用できないブラウザに対応する場合、”Pragma”を設定します。
〔response.py〕 class ResponseHeader(MiddlewareMixin): def process_response(self, request, response): response[“Cache-Control”] = “no-cache, no-store” response[“Pragma”] = “no-cache” return response |
〔Content-Security-Policyレスポンスヘッダ〕
Content-Security-Policyレスポンスヘッダは、クロスサイトスクリプティングやその他の攻撃に対するブラウザの防御機能を有効化する設定です。CSPはHTTPヘッダを介してブラウザに送信されます。このヘッダには許可されるドメインや、スクリプトの実行方法、CSSの読み込み先などが指示されます。これらの指示に従って許可されない操作をブロックします。
Djangoでは、以下の方法が一般的です。
サードパーティ製のプラグインdjango-cspをインストールします。
〔terminal〕 # pip install django-csp |
それぞれCSPMiddlrewareを定義し、それぞれディレクティブを設定します。
〔base.py〕 MIDDLEWARE = [ ・・・ “csp.middleware.CSPMiddleware”, ・・・ ] CSP_DEFAULT_SRC = (“‘self'”,) CSP_SCRIPT_SRC = (“‘self'”, “https://xxx.com”) CSP_STYLE_SRC = (“‘self'”, “https://xxx.com”) |
プラグインを使用しない場合でも、Content-Security-Policyレスポンスヘッダに直接設定する子で細かく調整することが可能です。
〔response.py〕 class ResponseHeader(MiddlewareMixin): def process_response(self, request, response): response[“Cache-Control”] = “no-cache, no-store” response[“Pragma”] = “no-cache” response[“Content-Security-Policy”] = “default-src ‘self’; connect-src ‘self’;・・・” return response |
CSPの導入では以下の事柄に注意する必要があります。これらのことに気をつければ安全なWEBアプリケーションを構築することが可能です。
- 強力なセキュリティ機構ですが、設定を誤ったり、厳密すぎる設定だとWEBアプリケーションが機能しなくなる恐れがあります。十分なテストが必要です。
- サードパーティのスクリプトやCSSなど外部から提供されるリソースがある場合、それらのリソースをCSPに適用させる必要があります。
- CSPはモダンなブラウザではサポートしていますが、全てのブラウザで完全な機能を利用できるわけではありません。リリースノート等を確認して機能を把握する必要があります。
〔まとめ〕
今回のセキュリティ対策は、HTTPレスポンスヘッダに関するものを取り上げました。Djangoに限った話ではなく、言語やフレームワークを問わずWEBアプリケーション開発には必要な知識となるため、さまざまな場面で活かせると思います。
次回もまたDjangoのノウハウを紹介します。