HTTP Observe サイトのセキュリティ診断。
これで、筆者が公開しているRedmineのセキュリティを上げたときのメモです。
どう判断されたか
結果はB-。特に引っかかったのは
- Content Security Policy(CSP)
- Content Security Policy (CSP) header not implemented
- Cookies
- Session cookie set without the Secure flag, but transmission over HTTP prevented by HSTS.
何が問題なのか
クッキーの「剥き出し」状態(Secure Flag の欠如)
セッション情報(ログイン情報を保持する)が記録されたクッキーにSecureフラグが付与されていなかったため、たとえ常時httpsで通信していたとしても、ブラウザの設定や不慮の事故で通信が発生した差違に、クッキーがそのままNWに漏洩するリスクがあります。
これが漏洩し、奪われると、悪意ある第三者のなりすまし(セッションハイジャック)を可能にします。
CSPの未実装
Content-Security-Policy (CSP) ヘッダーが全く存在していなかったため、ブラウザに対して「どのスクリプトを実行していいか」が確認されていない状態。Redmineそのものや導入しているプラグインに脆弱性があった場合、攻撃者は外部から悪意あるスクリプトを注入し、閲覧者のブラウザ上で実行させるXSSに無防備となります。
個の2点を直していきます。
環境
- Redmine 5.1
- Apache 2.4
- 常時SSL化設定済み。
- Ruby 3.2.3
さっくりとした手順
- 設定ファイルを作成します。
- 設定を反映します。
- セキュリティ診断でのランクアップを確認します。
設定ファイルの作成
cd /path/to/redmine/config && pwd
自分の環境のRedmineconfigディレクトリに合わせます。(筆者環境/home/www-data/redmine/config)
- 設定ファイル作成前確認
ls -l ./initializers/additional_environment.rb
ファイルが無いことを確認します。
- 設定ファイル作成
sudo -u www-data tee ./initializers/additional_environment.rb > /dev/null << 'EOF'
Rails.application.configure do
# Cookie の Secure フラグを立てます
config.session_store :cookie_store, key: '_redmine_session', secure: true
# CSP の設定を追加します
config.content_security_policy do |policy|
policy.default_src :self, :https
policy.font_src :self, :https, :data
policy.img_src :self, :https, :data
policy.object_src :none
# Redmine はインラインのスクリプトとスタイルを多用するため、これを許可します。
policy.script_src :self, :https, :unsafe_inline, :unsafe_eval
policy.style_src :self, :https, :unsafe_inline
end
# ブラウザが違反を報告するだけで、ブロックしないモードです。(デバッグ用)
# config.content_security_policy_report_only = true
end
EOF
設定ファイル作成前確認
ls -l ./initializers/additional_environment.rb
ファイルがあることを確認します。
設定反映を確認します。
- 構文確認
sudo apache2ctl configtest
Syntax OKを確認します。
- サービス再起動
sudo systemctl restart apache2.service
- サービス再起動確認
systemctl status apache2.service
active (running)を確認します。
まとめ
HTTP Observe に再度アクセスし、セキュリティ診断を行いました。
結果はB+。
- Contents Security Policy (CSP)
- Content Security Policy (CSP) implemented unsafely. This includes 'unsafe-inline' or data: inside script-src, overly broad sources such as https: inside object-src or script-src, or not restricting the sources for object-src or script-src.
- Remove unsafe-inline and data: from script-src, overly broad sources from object-src and script-src, and ensure object-src and script-src are set.
依然として課題は残るものの、ここを下手にいじると、外部プラグインとの連携などに支障を来します。
これらを狙った脆弱性はWAFで埋めて生きつつ、これらの改善案を図っていくのが今後の課題です。























