-->

nginxのセキュリティ設定

nginxのセキュリティ設定

Ubuntu環境でnginxのセキュリティ設定を行う方法。
情報の盗み取りやDoS攻撃からの防御。

関連ページ
前のページ でnginxを自分のサーバーに導入しましたが、これだけだとセキュリティがガバガバなのでその対応を行いました。
やってる事としてはこちらの Apacheのセキュリティ設定 を、ほぼそのままnginxに翻訳した形になります。

nginxの全環境設定について

前回は
 /etc/nginx/conf.d 
にWebページへのルーティング設定を行ったので、セキュリティ設定も同様にこのディレクトリ内で行います。
ファイル名は
 security.conf 
とします。


Webページのルーティング設定はserverブロックで行いましたが、今回のようなセキュリティ設定は全環境に対して反映させた方が効率的です。
これには本来
 httpブロック 
というものを使います。

しかしconf.d以下のファイルをincludeしている大元の
 /etc/nginx/nginx.conf 
では、そのhttpブロック内でincludeを実行しています。
61行目辺りです。

httpブロック内で更にhttpブロックを記述するとエラーになります。
このためconf.d内のファイルでセキュリティを記述する場合、ブロックは何も記述しなくていいです。

nginx.confの修正

security.confの記述の前に、一行だけnginx.confの修正を行います。
以下の
 ssl_prefer_server_ciphers on; 
の記述をonからoffにしてください。


昔はサーバー側で暗号化アルゴリズムを強制するonが推奨されていましたが、現在は以下の理由でoffが主流になっています。
 
通信速度の向上:
 
最近のスマホやPCは、自分自身が最も速く処理できる暗号化方式を知っている。
 
安全なブラウザの普及:
 
今のブラウザは賢いため、端末側が脆弱性のある暗号化方式を選択することはない。
 
十分な安全性:
 
端末側がどんな暗号化方式を選択しても、サーバー側のssl_ciphers で安全なものだけを受け入れるため問題がない。

セキュリティの設定を記述

以下の内容をsecurity.confに記述します。
既にnginx.confの方に記述してあるプロトコルの指定などは除外しています。
# --- セキュリティ設定 ---

# 安全な暗号化アルゴリズムだけを網羅して許可

ssl_ciphers                ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;  
# セッションごとに使い捨ての鍵を使う(前方秘匿性強化)

ssl_session_tickets        off;

# --- 情報漏洩対策 ---

# nginx側のヘッダーと画面上の情報を最小限にする

server_tokens off;
# 上流から送られてくる使用言語情報を秘匿する

proxy_hide_header X-Powered-By;
# バックエンドサーバーのヘッダー情報を秘匿する

proxy_hide_header Server;
# PHPが生成するヘッダー情報を秘匿する

fastcgi_hide_header X-Powered-By;

#スニッフィング攻撃対策

# (ファイルの中身を勝手に推測して実行するのを禁止)

add_header X-Content-Type-Options "nosniff" always;

# --- Denial of Service(DoS)攻撃対策 ---

# ブラウザ等から送られてくるデータ容量を制限

# (巨大データ送信によるメモリ枯渇、ディスク容量枯渇の防止)

client_max_body_size 10m;
# ブラウザ等からサーバーに送られてくるヘッダーのサイズを制限

# (長いヘッダー情報送信によるメモリ枯渇、CPU枯渇の防止)

large_client_header_buffers 4 8k;
# Slowloris攻撃対策のためタイムアウト設定

# (通信を意図的に遅延させたコネクション上限の枯渇を防止)

client_header_timeout 20s;
client_body_timeout 20s;

# httpoxy脆弱性対策

# (HTTP_PROXYという環境変数を使った情報の盗み取りを防御)

proxy_set_header Proxy "";

# 一度アクセスHTTPSにアクセスすると、その後6ヶ月間はHTTPSアクセスに強制

# (HTTPでアクセスされた瞬間に攻撃者が通信を傍受するのを阻止)

add_header Strict-Transport-Security "max-age=15768000" always;
# 上記設定はHTTP通信でのテストが困難になるので、テスト段階ではこちら10分設定を推奨

#add_header Strict-Transport-Security "max-age=600" always;


# --- Content-Security-Policy(CSP)設定 ---

# default-src設定: 自分と同じドメインから配信されるファイルを許可

# https設定: HTTPS通信から送られるデータは許可

# script-src設定: 自サーバー内のJavaScript、またはHTML内のインラインと、テキストデータから変換されるJavaScriptを許可

# frame-ancestors設定: 他人がiframeを使って自分のサイトを埋め込むのを禁止

add_header Content-Security-Policy "default-src 'self' https: data: 'unsafe-inline' 'unsafe-eval'; frame-ancestors 'self';" always;

編集を終えたら
 nginx -t 
のコマンドで構文に間違いがないか事前に確認が可能です。

最後にnginxサーバーをリスタートすれば設定完了です。
sudo service nginx restart
0
0