Mozilla は、
過去に、
[TOC]
前提
サイトの
OS
cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core)
HTTPサーバ
Server version: Apache/2.4.29 (CentOS)
Pythonの
Version Python 3.6.4
Djangoの
Verison python3.6 -m pip list | grep Django Django 1.10.8
対策前 の、 Observatory by Mozilla の 結果
以下、
テスト時にHTTP Observatory
の
Scan Summary
Score が0/100
で
項目名 | 値 |
---|---|
Host: | www.monotalk.xyz |
Scan ID | xxxxxxx |
Start Time | xxxxxxx |
Duration | 5 seconds |
Score | 0/100 |
Tests Passed | 7/11 |
Test Scores
Test | Score | Explanation |
---|---|---|
Content Security Policy | -25 | Content Security Policy (CSP) header not implemented |
Cookies | -20 | Anti-CSRF tokens set without using the SameSite flag |
Cross-origin Resource Sharing | 0 | Content is not visible via cross-origin resource sharing (CORS) files or headers |
HTTP Public Key Pinning | 0 | HTTP Public Key Pinning (HPKP) header not implemented (optional) |
HTTP Strict Transport Security | 0 | HTTP Strict Transport Security (HSTS) header set to a minimum of six months (15768000) |
Redirection | -20 | Does not redirect to an HTTPS site |
Referrer Policy | 0 | Referrer-Policy header not implemented (optional) |
Subresource Integrity | -50 | Subresource Integrity (SRI) not implemented, and external scripts are loaded over HTTP or use protocol-relative URLs via src=”//…” |
X-Content-Type-Options | 0 | X-Content-Type-Options header set to “nosniff” |
X-Frame-Options | 0 | X-Frame-Options (XFO) header set to SAMEORIGIN or DENY |
X-XSS-Protection | 0 | X-XSS-Protection header set to “1; mode=block” |
減点をContent Security Policy
、Cookies
、Redirection
、Subresource Integrity
の
Content Security Policy
の
X-Content-Type-Options
、X-Frame-Options
、X-XSS-Protection
に
Apache、
以前、
対策
それぞれの
Cookies
これは、
SameSite に
- SameSite - OWASP
- Preventing CSRF Attacks with the SameSite Cookie Attribute
- Cookie関連の
最新動向 (2016) - Cookieの
First-Party-Only属性 - ASnoKaze blog
記事をSameSite=Lax;
を
対象となる
Django
Django 2.1.x では、
Django 1.x で
インストール
python3.6 -m pip install django-cookies-samesite
INSTALLED_APPS に、
django_cookies_samesite
を追加する。 INSTALLED_APPS = ( 'mezzanine_api', "django_cookies_samesite" )
MIDDLEWARE_CLASSES の
先頭に、 django_cookies_samesite.middleware.CookiesSameSite
を追加する。 MIDDLEWARE_CLASSES = ( 'django_cookies_samesite.middleware.CookiesSameSite', ... )
SameSite の
ポリシーと して、 Lax
を設定
SESSION_COOKIE_SAMESITE = 'Lax'
以上で、
デフォルトだと、csrftoken
と、sessionid
にsessionid
には、
Apache
Header edit
で
以下の
Redirection
これは、
以下の
Subresource Integrity
以前、
3rd party 静的コンテンツ は、
以下、
* Sub Resource Integrity value for //maps.google.com/maps/api/js - Stack Overflow
webpack で、 Subresource Integrity を 設定する plugin
Blog テーマの
当初、
以下、
webpack-subresource-integrity - npm stats ファイルに、
integrity を 書き出す 方法を 試したのですが、 owais/webpack-bundle-tracker: Spits out some stats about webpack compilation process to a file の 書き出す statsファイルには 属性追加できなさそうでしたので、 諦めました。 sri-stats-webpack-plugin - npm
Webpack 3 だと、使用できなかったのですが、 stats ファイルの 書き出しまで 実施してくれるので、 使用できるなら これを 使いたいです。
Hash を 管理する Django の setting ファイルを 作成して、 Template で 参照する
テーマの
以下、
settings.py
Hash を管理する python スクリプトを 読み込む 記載を 追加しました。 ##################### # SRI SETTINGS # ##################### try: from blog.sri import * except ImportError: pass
create_sri_settings.sh
以下、sri.py
を生成する スクリプトです。
cat $BLOG_ROOT/static/js/html5shiv.js | openssl dgst -sha256 -binary | openssl enc -base64
でHash を 生成しています。
Hash の生成方法は、 Subresource Integrityに ついて 調べた | 69log を 参考に しました。 BLOG_ROOT="/var/www/site/blog" rm -f "$BLOG_ROOT"/blog/sri.py echo "HTML5SHIV_SRI="'"'sha256-`cat $BLOG_ROOT/static/js/html5shiv.js | openssl dgst -sha256 -binary | openssl enc -base64`'"' >> "$BLOG_ROOT"/blog/sri.py echo "RESPOND_MIN_SRI="'"'sha256-`cat $BLOG_ROOT/static/js/respond.min.js | openssl dgst -sha256 -binary | openssl enc -base64`'"' >> "$BLOG_ROOT"/blog/sri.py echo "BUNDLE_JS_SRI="'"'sha256-`cat $BLOG_ROOT/static/webpack_bundles/bundle-*.js | openssl dgst -sha256 -binary | openssl enc -base64`'"' >> "$BLOG_ROOT"/blog/sri.py echo "BUNDLE_CSS_SRI="'"'sha256-`cat $BLOG_ROOT/static/webpack_bundles/bundle-*.css | openssl dgst -sha256 -binary | openssl enc -base64`'"' >> "$BLOG_ROOT"/blog/sri.py
base.html
Template 内での読み込み 記述は 以下に なります。 <!--[if lt IE 9]> <script src="{% static "js/html5shiv.js" %}" {% if settings.HTML5SHIV_SRI %}integrity="{{ settings.HTML5SHIV_SRI }}" crossorigin="anonymous"{% endif %} ></script> <script src="{% static "js/respond.min.js" %}" {% if settings.RESPOND_MIN_SRI %}integrity="{{ settings.RESPOND_MIN_SRI }}" crossorigin="anonymous"{% endif %} ></script> <![endif]--> {% if settings.BUNDLE_JS_SRI %} {% with 'async defer chatset="UTF-8" crossorigin="anonymous" integrity="'|add:settings.BUNDLE_JS_SRI|add:'"' as attrs_str %} {% render_bundle 'bundle' 'js' attrs=attrs_str %} {% endwith %} {% else %} {% render_bundle 'bundle' 'js' attrs='async defer chatset="UTF-8"' %} {% endif %}
default.py
このBlog は、 Mezzanine を 使って 構築していますが、 Template 内で settings.py の 値を 使用する 場合は、 defalut.py で、 対象の 値を 登録する 必要が あります。 from mezzanine.conf import register_setting ########################### # FOR CLEAN_BLOG SETTINGS # ########################### register_setting( name="TEMPLATE_ACCESSIBLE_SETTINGS", description=("Sequence of setting names available within templates."), editable=False, default=("BUNDLE_JS_SRI", "RESPOND_MIN_SRI", "BUNDLE_CSS_SRI", "HTML5SHIV_SRI" ), append=True, ) register_setting( name="BUNDLE_JS_SRI", description="", editable=False, default="", ) register_setting( name="RESPOND_MIN_SRI", description="", editable=False, default="", ) register_setting( name="BUNDLE_CSS_SRI", description="", editable=False, default="", ) register_setting( name="HTML5SHIV_SRI", description="", editable=False, default="", )
対策後 の、 Observatory by Mozilla の 結果
以下対策後の
Scan Summary
Score が20/100
で
項目名 | 値 |
---|---|
Host: | www.monotalk.xyz |
Scan ID | xxxxxxx |
Start Time | xxxxxxx |
Duration | 5 seconds |
Score | 20/100 |
Tests Passed | 8/11 |
Test Scores
Test | Score | Explanation |
---|---|---|
Content Security Policy | -25 | Content Security Policy (CSP) header not implemented |
Cookies | -5 | Anti-CSRF tokens set without using the SameSite flag |
Cross-origin Resource Sharing | 0 | Content is not visible via cross-origin resource sharing (CORS) files or headers |
HTTP Public Key Pinning | 0 | HTTP Public Key Pinning (HPKP) header not implemented (optional) |
HTTP Strict Transport Security | 0 | HTTP Strict Transport Security (HSTS) header set to a minimum of six months (15768000) |
Redirection | 0 | Does not redirect to an HTTPS site |
Referrer Policy | 0 | Referrer-Policy header not implemented (optional) |
Subresource Integrity | -50 | Subresource Integrity (SRI) not implemented, and external scripts are loaded over HTTP or use protocol-relative URLs via src=”//…” |
X-Content-Type-Options | 0 | X-Content-Type-Options header set to “nosniff” |
X-Frame-Options | 0 | X-Frame-Options (XFO) header set to SAMEORIGIN or DENY |
X-XSS-Protection | 0 | X-XSS-Protection header set to “1; mode=block” |
Subresource Integrity
の
gtm.js 等は
以上です。
コメント