LoginSignup
6
8

More than 5 years have passed since last update.

セキュリティ設定の備忘録

Last updated at Posted at 2018-03-25

react-reduxで作成する機会があたったのでそのサイトに対して行ったセキュリティ対策の備忘録。Webサーバにはnginxを使用。

バージョン情報の非表示

バージョン情報をレスポンスヘッダとエラーページに表示させない
そのバージョンに脆弱性があることが分かった時に狙ってくださいと言っているようなものなので非表示にしましょう。

nginx.conf
server_tokens off;

クリックジャッキング対策

nginx.conf
add_header X-Frame-Options SAMEORIGIN(もしくはDENY);

この設定によりウェブページを他のサイトのページのiframeに呼び出さないようにウェブブラウザに指示することができる。

話がずれますが、add_headerは「現在のコンテキストにそのディレクティブがない時に限って上位のコンテキストで設定された値が継承される」ということに注意。

XSS対策

今回のサイト作成は完全に学習目的だったので
https://github.com/leizongmin/js-xss/blob/master/lib/default.js
などをみつつ自分でやってみようと思っていたが、時間の関係でホワイトリスト形式のバリデーションにした。

次にブラウザ側のフィルタ機能を使用

nginx.conf
add_header X-XSS-Protection "1; mode=block";
  1. 通常モード (非ブロックモード) X-XSS-Protection: 1 (デフォルト)
  2. ブロックモード X-XSS-Protection: 1; mode=block
  3. オフ X-XSS-Protection: 0

XSSフィルタの設定。これはブラウザ側の機能です。サイト側にXSSの脆弱性がある場合、攻略されるリスクを減らしてくれるというものなので、しっかりとした対策はアプリケーション側でしましょう
アプリケーション側の設定が完全にできていればオフでも問題ないですが、アプリケーションにXSSがある疑いが強いならばブロックモードが最善のようです。

XSSを含む幅広い攻撃の軽減

nginx.conf
Content-Security-Policy: default-src 'self'

設定したポリシーをWebブラウザに強制させることができる。
つまり、読み込み可能なリソースをホワイトリストで制限することで、悪意ある攻撃者によって予期しないリソースを読み込まされることを防ぐことができる。
上記だと「すべてのコンテンツを自身のドメイン(サブドメインを除く)から取得可能とする」となる。サブドメからの読み込みはできない。

また、デフォルトでは以下のポリシーが適応されるとのこと

  • data: URLでのコンテンツの埋込
  • <a href=’javascript:’>のようなhtmlへのjavascriptの埋込
  • onclickなどのインラインのイベント属性
  • <script>要素内のインラインスクリプト
  • eval() での文字列コードnew Function()コンストラクタ
  • setInterval()ないでの文字列コード setTimeout()ないでの文字列コード
  • <style>要素でのCSSの設定インラインのstyle属性

インラインで<script>を使用したければscript-src 'unsafe-inline'をポリシーとして設定する必要がある。

CSRF

JWTを使用してLocalStorageでトークンを管理することで対応(予定でした)
JWTは改竄不可能のトークンでlocalStorageに保持し、リクエスト時にAuthorizationヘッダに乗せてやります。
他者はトークンを入手することができないためCSRFを防ぐことができる。
ただし、トークンをcookieに入れると結局サーバに送られてしまうのでNG。

content-typeの宣言回避

nginx.conf
add_header X-Content-Type-Options nosniff;

Webブラウザはサーバから送られてきたHTTPレスポンスに記述されている「Content-Type」に基づいて、HTTPレスポンスをどのように処理するのかを決定しています。しかしWebブラウザの中には、HTTPレスポンス全体を検査(sniffing)してコンテンツ タイプを判断し、「Content-Type」を無視した動作を行うものも存在します。このような実装はWebアプリケーション開発者の意図しない動作を引き起こし、セキュリティ上の問題につながるためそのsniffingを防止するための設定。

参考

nginxでproxy_hide_header, proxy_set_header, add_headerを書く時にはまりがちな罠 - でこてっくろぐ ねお
https://www.mbsd.jp/blog/20160407_2.html
https://devcentral.f5.com/articles/7http
https://developer.mozilla.org/ja/docs/Web/HTTP/CSP
https://qiita.com/o_Ozzzzk/items/c505b7dd20707eb4ee08

6
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
8