最近 OWASP ZAP
を
自ブログにも、OWASP ZAP
を
OWASP ZAP の 参考記事
OWASP ZAP に
前提
環境情報
ブログは
OS
CentOS release 6.7 (Final)Python Version
Python 2.7.8Package (必要そうな
ものだけ 抜粋)
Django (1.10)
Mezzanine (4.2.0)
検証の 内容
OWASP ZAP
はデフォルト設定で、 プロキシ設定なしの、 標準モードで 実行
インストールして起動すると 表示される クイックスタートに、
ブログのドメインを 入力するだけです。 Mezzanine は、
公開画面 ドメイン指定での 検証と、 管理ログイン画面の 検証 を 行う 1 [1] ブログ投稿画面は、 ゴミ投稿データが 大量に できそうなので 見送りました。
ドメイン直下指定で、 検証した 結果
以下の
ドメイン直下指定だと、
各記事、
また、
X-Frame-Options ヘッダの
欠如 アプリケーションエラーの
開示 Cross-Domain JavaScript Source File Inclusion
Webブラウザの
XSS防止機能が 有効に なっていません。 X-Content-Type-Optionsヘッダの
設定ミス Incomplete or No Cache-control and Pragma HTTP Header Set
Secure Pages Include Mixed Content
管理画面指定で、 検証した 結果
以下のOWASP ZAP
は、
X-Frame-Options ヘッダーの
欠如 アプリケーションエラーの
開示 Cross-Domain JavaScript Source File Inclusion
Web ブラウザの
XSS 防止機能が 有効に なっていません。 X-Content-Type-Options ヘッダの
設定ミス Incomplete or No Cache-control and Pragma HTTP Header Set
Cookie No HttpOnly Flag
Cookie Without Secure Flag
Password Autocomplete in Browser
各警告に 対する 対処
警告の
OWASP ZAP スキャンポリシーの
X-Frame-Options ヘッダーの 欠如
対処しました。
クリックジャッキング対策が
Clickjacking Protection | Django documentation | Django に
Django.middleware.clickjacking.XFrameOptionsMiddleware
の
<Directory /var/static> Header set X-Frame-Options SAMEORIGIN </Directory>
[3] mezzanine-project でXFrameOptionsMiddleware
は
アプリケーションエラーの 開示
対処しませんでした。
対象ページはエラーを<wbr>示す<wbr>文言
を
検出されていましたので、
Cross-Domain JavaScript Source File Inclusion
対処しませんでした。
はてな
Webブラウザの XSS防止機能が 有効に なっていません。 と、 X-Content-Type-Optionsヘッダの 設定ミス
対処しました。SecurityMiddleware
と
MIDDLEWARE_CLASSES = ( ... "Django.middleware.security.SecurityMiddleware", ... ) SECURE_CONTENT_TYPE_NOSNIFF = True SECURE_BROWSER_XSS_FILTER = True
[Django 1.8で
<Directory /var/static> Header set X-XSS-Protection "1; mode=block" Header set X-Content-Type-Options "nosniff" </Directory>
[4] mezzanine-project でSecurityMiddleware
は
Incomplete or No Cache-control and Pragma HTTP Header Set
対処しました。
設定します。
Django post request data caching - Stack Overflow と、NoCacheMiddleware
を
Django.utils.cache.add_never_cache_headers
だと、private
がQWASP ZAP
の
Django.utils.cache.patch_cache_control
で、
- NoCacheMiddleware.py
from Django.utils.cache import patch_cache_control class NoCacheMiddleware(object): def process_response(self, request, response): response['Pragma'] = 'no-cache' patch_cache_control(response, no_cache=True, no_store=True, must_revalidate=True, private=True) return response
- settings.py
XFrameOptionsMiddleware
の直下あたりに 記載しました。 static なMIDDLEWARE_CLASSES = ( .... "Django.middleware.clickjacking.XFrameOptionsMiddleware", "mezzanine_extentions.middleware.NoCacheMiddleware", .... )
js,css で 出力されているので、 Apacheにも、 静的ファイルを 対象に ヘッダを 追加する 設定を 行いました。 <Directory /var/www/site/blog/static> Header append Cache-Control "private" </Directory>
Secure Pages Include Mixed Content
対処しませんでした。
SSL の
数が
Cookie No HttpOnly Flag
ログイン画面で
対処しました。
crsf token に
settings.py にCSRF_COOKIE_HTTPONLY = True
を
Mezzanine では
plugin 等で、
Cookie Without Secure Flag
ログイン画面で
対処しました。
crsf token に
settings.py にCSRF_COOKIE_SECURE = True
を
[5] デフォルト値がFalse
です。
Password Autocomplete in Browser
ログイン画面で
対処しませんでした。
調べていると、autocomplete=off
つければ、
個人的には、
ブラウザに
よっては 効果が ないことも 多い。 そもそも
個人ブログなので、 管理画面で ログインしようとする 人は いるかもしれないが、 基本自分一人。
且つ、autocomplete
されるのは、自宅PCなので、 あまり リスクに ならない。
ブラウザの
再実施
設定変更後、OWASP ZAP
を
トータルの
修正対象外、
どうもまだ、
[6] HTTP サーバ側の
アプリケーションエラーの
開示 Cross-Domain JavaScript Source File Inclusion
Password Autocomplete in Browser
Secure Pages Include Mixed Content
Incomplete or No Cache-control and Pragma HTTP Header Set
X-Content-Type-Optionsヘッダの
設定ミス
補足 Mezzanine が 発行する cookie値 に ついて
何の役に
調べていましたので、
管理画面を
__utma
Google Analytics のcookie 値です。
サイトに 導入しているので、 存在しています。
ログイン画面自体は、計測対象にはなっていない。 また、 当たり前だと 思いますが、 メタタグで、 <meta name="robots" content="NONE,NOARCHIVE"></meta>
が設定されています。
管理画面で発行されるわけではないですが、 いるので 記載。 csrftoken
'Django.middleware.csrf.CsrfViewMiddleware'
の発行する cookie です。
CSRF_COOKIE_NAME
で名称は 変える ことができます。
サイトで 使ってる フレームワーク特定されたくない 場合、
変更したほうが いいかと 思います。 mezzanine-admin-toolbar Mezzanine が
発行している セッション cookie (ブラウザに 保存されないやつ)
editable.js
という javascript 内で 使っている ものです。 Http Only 属性は ついていません。
管理画面の制御に 使っているように 思います。 sessionid ログイン成功時に
払い出される キー値です。
Django のDjango.contrib.sessions
の設定値で、 名称と、 cookie の secure 属性が コントロールできます。
SESSION_COOKIE_SECURE
のデフォルト値は False
だったので、
SESSION_COOKIE_SECURE = True
に変更しました。
Settings | Django documentation | Django
まとめ
以下、
公開部に
ついては、 Mezzanine 側の 基本的な セキュリティ対策なされていると 思った。 7
[7] ブログ投稿などの編集画面に ついては、 試して おりません。 設定値で
コントロールするような ところは、 デフォルト設定では、 secure ではない 場合が ある。 (HTTPS/HTTP でも 動作するようになっている )
HTTPS 強制のサイトの 場合は、 設定値の 見直しは 必要。 設定変更は、
HTTP サーバ側の 設定と、 Django の 双方必要。 Sitemap.xml から、
ページ辿り 攻撃とか OWASP ZAP
怖い。
なんと
以上です。
コメント