リバースプロキシを使用して、外部公開しているwebサーバに直接アクセスできない構成にして、セキュリティを高めたい場合もあるかと思います。apacheを使用してリバースプロキシを構築することも可能ですが、nginxですと比較的コンフィグがわかりやすいことと、処理能力がapacheより良いとの事ですので、nginxで構成します。webサーバをapacheで構築していた場合、あえて別のパッケージを使用することで、セキュリティを高める狙いもあります。
今回の内容をイメージで表すと次のようになります。
nginxのインストール
以下のコマンドでインストールします。
# dnf install nginx
コンフィグ(/etc/nginx/nginx.conf)の編集
次にコンフィグファイル(/etc/nginx/nginx.conf)を下記の通り編集します。
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
# security対策
# バージョン情報を隠蔽
server_tokens off;
# X-Powered-By を非表示にする
proxy_hide_header X-Powered-By;
# クリックジャッキングの防止
add_header x-frame-options "DENY";
# クロスサイトスクリプティングの防止
add_header x-content-type-options "nosniff";
add_header x-xss-protection "1; mode=block";
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent ';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;
server {
listen 80 ;
# listen [::]:80 default_server;
server_name *.dassyi.com;
root /usr/share/nginx/html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
return 301 https://$host$request_uri;
}
# エラーページを表示する場合は下記を有効にする
# error_page 404 /404.html;
# location = /40x.html {
# }
#
# error_page 500 502 503 504 /50x.html;
# location = /50x.html {
# }
}
# Settings for a TLS enabled server.
server {
listen 443 ssl http2 ;
# listen [::]:443 ssl http2 default_server;
server_name *.dassyi.com;
root /usr/share/nginx/html;
ssl_certificate "/etc/pki/tls/certs/dassyi.com.crt";
ssl_certificate_key "/etc/pki/tls/private/dassyi.com.key";
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_session_tickets off;
# ssl_ciphers PROFILE=SYSTEM;
ssl_ciphers ECDHE+AESGCM:DHE+aRSA+AESGCM:ECDHE+AESCCM:DHE+aRSA+AESCCM:ECDHE+CHACHA20:DHE+aRSA+CHACHA20:+AES128:+DHE;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/ssl/dh2048.pem;
ssl_ecdh_curve X25519:X448:P-256:P-384:P-521;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
# リバースプロキシとして設定するメインはここから
location / {
proxy_pass https://apache.dassyi.com;
}
# 以下のように設定すると別のサイトもリバースプロキシ経由にすることが可能
location /medaka {
proxy_pass https://medaka.dassyi.com;
}
# エラーページを表示する場合は下記を有効にする
# error_page 404 /404.html;
# location = /40x.html {
# }
#
# error_page 500 502 503 504 /50x.html;
# location = /50x.html {
# }
}
}
ここで、コンフィグ中に出てきた、独自の 2048 ビットの位数を持つグループを指定する DHE パラメータファイルを PEM 形式で生成するために、以下のopensslコマンドを実行します。
# openssl dhparam -out /etc/ssl/dh2048.pem -outform PEM 2048
このあたりのTLSの具体的な暗号化については、IPAのTLS 暗号設定 サーバ設定編 のガイドラインを参考に設定してください。
IPアドレス直打ちのアクセス拒否設定(block_ip.conf)
こちらの設定はお好みで実施頂ければと思いますが、今後の運用を考慮して、事前に設定しておいて損はないと思います。具体的には、以下の内容のコンフィグファイル(ここではblock_ip.conf)を、/etc/nginx/conf.d/ に作成します。
# http通信に対する記述
server {
listen 80 default_server;
# listen [::]:80 default_server;
server_name _;
return 444;
}
# https通信に対する記述
server {
listen 443 ssl default_server;
# listen [::]:443 ssl default_server;
server_name _;
# サーバー証明書のフルパス
ssl_certificate /etc/pki/tls/certs/dassyi.com.crt;
# 暗号鍵のフルパス
ssl_certificate_key /etc/pki/tls/private/dassyi.com.key;
return 444;
}
なお、サーバ証明書で中間証明書も設定する場合、apacheでは中間証明書の指定パラメータがありましたが、nginxにはありません。この場合、サーバ証明書ファイル(上記コンフィグでいうと、dassyi.com.crt)に、中間証明書の内容を追記しておくようにしましょう。
サービスを起動して動作確認
ここまで準備ができましたら、問題なく動作するか確認を行います。
ただし大前提として、それぞれのサイトのURLがDNSで引けることになります。DNSの設定についてはここでは割愛します。
# nginx -t
こちらで、Webブラウザでホームページにアクセスします。問題なくWebページが閲覧できることに加え、nginx側では、 /var/log/nginx/access.log にログが記録されていることを確認します。
一方のapache側では、 /var/log/pache/access.log を確認し、リバースプロキシからアクセスが来ていることを確認します。
特に問題が無ければ、自動起動も有効にしておきます。
# systemctl enable nginx
また、Webサーバ側のFWも外部公開する必要は無いので、必要に応じて、リバースプロキシサーバからのみアクセスできるようにしておきます。
今回はここまでです。最後までお読みいただきありがとうございました。