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が主流になっています。

セキュリティの設定を記述
以下の内容を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