20
22

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Webアプリケーションのおすすめセキュリティ設定

Posted at

はじめに

Ruby + NginxでWebサイトを構築し、脆弱性診断で毎回ほぼ同じことを指摘されるので
この際まとめてみることにしました。
昨今のフレームワークはセキュリティ対策もある程度されており、余程ひどいコードを書かない限りは大丈夫だと思いますが、これから説明する設定を付け足すだけでより堅牢なサイトになり得るのでこの機会にみなさんのサイトにも適応されてはいかがでしょうか。(記事を書くにあたりApacheの設定も一緒に調べて記載していますので参考になればと思います。)

バージョン情報

Nginx:1.12.1
Ruby:2.2.3〜2.4.1
Rails:4.2.4〜5.1.2

X-Frame-Optionsヘッダ(XFO)

説明

X-Frame-Options HTTPレスポンスヘッダは、ブラウザが <frame> <iframe><object>
ページ内部に表示することを許可するかを設定することができます。

想定される脆弱性

クリックジャッキング
自身のサイトがいつの間にか罠サイトの中に <iframe> で埋め込まれてしまった結果、
罠サイトに来訪したユーザーによって意図しないうちに自分のサイトが操作されてしまうような脆弱性です。

対策

HTTPレスポンスヘッダをX-Frame-Options: DENY または SAMEORIGINとすることが望ましいです。

対応方法

  • Nginx
nginx.conf
add_header X-Frame-Options DENY;
  • Apache
httpd.conf
Header append X-Frame-Options DENY
  • Rails
config/application.rb
module Projectname
  class Application < Rails::Application
    config.action_dispatch.default_headers["X-Frame-Options"] = "DENY"
  end
end

HTTP Strict-Transport-Securityヘッダ(HSTS)

説明

HTTPS 通信を強制するようブラウザに伝達するセキュリティ機能です。

想定される脆弱性

Webサイトを閲覧しているユーザーがHTTPS対応ページにHTTPでアクセスしてしまう恐れがあります。

対策

HTTPレスポンスヘッダに Strict-Transport-Security 設定を付与します。
max-age はブラウザがサイトにHTTPSで通信させる有効期限
includeSubDomains は、サブドメインに対してもHSTSを適用

対応方法

  • Nginx
ngixn.conf
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains";
  • Apache
httpd.conf
Header set Strict-Transport-Security "max-age=31536000; includeSubDomains"
  • Rails
config/environments/production.rb
  # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
  config.force_ssl = true

※Rails5.1未満は設定方法が異なるようなので注意が必要です。(参考サイト

注意点

HTTPHTTPS が混在するサイトでStrict-Transport-Security を適応すると有効期限内はサイトにアクセス出来なくなる可能性があります。
max-age は5分、1週間、1ヶ月と徐々に期間を伸ばし、サイトに問題ないことが確認出来たら1-2年に設定するようです。(参考サイト

X-XSS-Protectionヘッダ

説明

ブラウザのXSSフィルターを強制的に有効にすることが出来ます。

想定される脆弱性

クロスサイトスクリプティング(XSS)の予防策

対策

HTTPレスポンスヘッダに X-XSS-Protection 設定を付与します。

対応方法

  • Nginx
ngixn.conf
add_header X-XSS-Protection "1; mode=block";
もしくは
add_header X-XSS-Protection "0";
  • Apache
httpd.conf
Header set X-XSS-Protection "1; mode=block" 
もしくは
Header set X-XSS-Protection "0" 
  • Rails

デフォルトで設定されているためNginx + Railsの組み合わせで利用する場合はNginx側の設定は不要です。
双方で設定した場合はChrome開発者ツールで下記のようなエラーが発生します。

Error parsing header X-XSS-Protection: 1; mode=block, 1; mode=block: expected semicolon at character position 14. The default protections will be applied.

X-Content-Type-Optionsヘッダ

説明

ブラウザが Content-type を検査(sniffing)することを無効にします。

想定される脆弱性

IEや一部ブラウザにおいて Content-Type に従わない動作をした場合に、クロスサイト・スクリプティング(XSS)が発生する可能性があります。

対策

HTTPレスポンスヘッダに X-Content-Type-Options 設定を付与します。

対応方法

  • Nginx
nginx.conf
add_header X-Content-Type-Options nosniff;
  • Apache
httpd.conf
Header set X-Content-Type-Options nosniff

X-Download-Optionsヘッダ

説明

ユーザーがダウンロードしたファイルを直接「開く」ことを防止します。

想定される脆弱性

ダウンロードしたファイルを直接「開く」ことにより、サーバをオリジンとしてコンテンツがブラウザ上で表示されるため蓄積型のクロスサイト・スクリプティング(XSS)攻撃が行われる可能性があります。

対策

HTTPレスポンスヘッダに X-Download-Options 設定を付与します。

対応方法

  • Nginx
nginx.conf
add_header X-Download-Options "noopen";
  • Apache
httpd.conf
Header set X-Download-Options: noopen

OS, ソフトウェアのバージョン情報

想定される脆弱性

バージョン情報がHTTPレスポンスヘッダーに含まれていることにより何らかの攻撃の手掛かりとなる恐れがあります。(ゼロデイ攻撃など)

対策

バージョン情報を表示させないよう各種設定を付与します。

対応方法

  • Nginx
nginx.conf
http {
    server_tokens off;
    ...
  • Apache
httpd.conf
ServerTokens ProductOnly
ServerSignature On
  • PHP
php.ini
expose_php = Off

SSL設定

想定される脆弱性

暗号方式(CipherSuite)の強度が弱いと、データ通信の盗聴や改ざんが行われる可能性があります。

対策

情報処理推進機構(IPA)のnSSL/TLS暗号設定ガイドラインに沿い、自身のサイトに合ったものを設定する。

Qualys SSL Labs社からもベストプラクティスが提示されています。
SSL/TLS Deployment Best Practices

対応方法(参考)

  • Nginx
nginx.conf
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE+RSAGCM:ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:!EXPORT:!DES:!3DES:!MD5:!DSS;
  • Apache
httpd.conf
SSLProtocol ALL -SSLv3
SSLCipherSuite ECDHE+RSAGCM:ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:!EXPORT:!DES:!3DES:!MD5:!DSS

※Apache 2.4以降ではSSLv2が除外

さいごに

対応方法として記載した設定情報についてはご自身のお使いの環境バージョンに応じて適宜読み替えてくださいm(_ _)m
またおすすめの設定があれば逐次記載していきたいと思います。

20
22
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
20
22

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?