カテゴリー
Linux

Certbot によって変更された Nginx 設定の内容を見てみました

はじめに

WordPress を動かしているリバースプロキシとWebサーバの Nginx で、Let’s Encrypt と Certbot で SSL/TLS の発行、導入をしました記録♪ – oki2a24 にて SSL/TLS を導入しました。

その際、Certbot によって Nginx の設定ファイルが書き換えられました。具体的には certbot --nginx コマンドを実行することで、/etc/nginx/conf.d/default.conf ファイルが書き換えられました。

今回は、その内容を見てみます。

Certbot によって書き換えられる前の /etc/nginx/conf.d/default.conf

  • 最初の server ディレクティブがリバースプロキシ設定
  • 次の server ディレクティブがWebサーバ設定
root   /srv/wordpress;
index  index.php index.html index.htm;

proxy_cache_path  /var/cache/nginx keys_zone=czone:32m levels=1:2 inactive=3d max_size=256m;
proxy_cache czone;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_cache_valid 200 404 1d;

server {
    listen 80 default_server;

    location ~ /\. {deny all; access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }
    location = /favicon.ico { access_log off; log_not_found off; }
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
        log_not_found off;
        proxy_pass http://unix:/var/run/nginx.sock;
    }

    set $do_not_cache 0;

    if ($request_method != "GET") {
        set $do_not_cache 1;
    }

    if ($uri ~* "\.php$") {
        set $do_not_cache 1;
    }

    if ($http_cookie ~ ^.*(comment_author_|wordpress_logged_in|wp-postpass_).*$) {
        set $do_not_cache 1;
    }

    location / {
        proxy_no_cache $do_not_cache;
        proxy_cache_bypass $do_not_cache;
        proxy_cache_key "$scheme://$host$request_uri";
        proxy_pass http://unix:/var/run/nginx.sock;
    }

}

server {
    listen unix:/var/run/nginx.sock;
    try_files $uri $uri/ /index.php?q=$uri&$args;

    location ~ \.php$ {
        fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
        fastcgi_pass_header "X-Accel-Redirect";
        fastcgi_pass_header "X-Accel-Buffering";
        fastcgi_pass_header "X-Accel-Charset";
        fastcgi_pass_header "X-Accel-Expires";
        fastcgi_pass_header "X-Accel-Limit-Rate";
    }
}

Certbot によって書き換えられた後の /etc/nginx/conf.d/default.conf

  • server ディレクティブが、書き換え前は 2 つだったのが、4 つになった。
  • server ディレクティブは、最後の 2 つが Certbot によって追加された。
root   /srv/wordpress;
index  index.php index.html index.htm;

proxy_cache_path  /var/cache/nginx keys_zone=czone:32m levels=1:2 inactive=3d max_size=256m;
proxy_cache czone;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_cache_valid 200 404 1d;

server {
    listen 80 default_server;

    location ~ /\. {deny all; access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }
    location = /favicon.ico { access_log off; log_not_found off; }
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
        log_not_found off;
        proxy_pass http://unix:/var/run/nginx.sock;
    }

    set $do_not_cache 0;

    if ($request_method != "GET") {
        set $do_not_cache 1;
    }

    if ($uri ~* "\.php$") {
        set $do_not_cache 1;
    }

    if ($http_cookie ~ ^.*(comment_author_|wordpress_logged_in|wp-postpass_).*$) {
        set $do_not_cache 1;
    }

    location / {
        proxy_no_cache $do_not_cache;
        proxy_cache_bypass $do_not_cache;
        proxy_cache_key "$scheme://$host$request_uri";
        proxy_pass http://unix:/var/run/nginx.sock;
    }

}

server {
    listen unix:/var/run/nginx.sock;
    try_files $uri $uri/ /index.php?q=$uri&$args;

    location ~ \.php$ {
        fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
        fastcgi_pass_header "X-Accel-Redirect";
        fastcgi_pass_header "X-Accel-Buffering";
        fastcgi_pass_header "X-Accel-Charset";
        fastcgi_pass_header "X-Accel-Expires";
        fastcgi_pass_header "X-Accel-Limit-Rate";
    }
}


server {

    location ~ /\. {deny all; access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }
    location = /favicon.ico { access_log off; log_not_found off; }
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
        log_not_found off;
        proxy_pass http://unix:/var/run/nginx.sock;
    }

    set $do_not_cache 0;

    if ($request_method != "GET") {
        set $do_not_cache 1;
    }

    if ($uri ~* "\.php$") {
        set $do_not_cache 1;
    }

    if ($http_cookie ~ ^.*(comment_author_|wordpress_logged_in|wp-postpass_).*$) {
        set $do_not_cache 1;
    }

    location / {
        proxy_no_cache $do_not_cache;
        proxy_cache_bypass $do_not_cache;
        proxy_cache_key "$scheme://$host$request_uri";
        proxy_pass http://unix:/var/run/nginx.sock;
    }


    server_name oki2a24.com; # managed by Certbot

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/oki2a24.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/oki2a24.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}

server {
    if ($host = oki2a24.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    listen 80 ;
    server_name oki2a24.com;
    return 404; # managed by Certbot


}

Certbot によって 書き換えられた前後の /etc/nginx/conf.d/default.conf の差分

  • 追加された 1 つめの server は SSL/TLS のWebサーバ設定
    • HTTP のWebサーバ設定をコピーしたものに、SSL/TLS 設定を追記したもの
    • さらに、Certbot によって追加された設定ファイルを読み込んでいる
  • 追加された 2 つめの server は HTTP のWebサーバ設定
    • 既存の HTTP 設定を上書きしている。???
    • HTTP へのアクセスを HTTPS へリダイレクトしている。
# diff -up default.conf.before default.conf
--- default.conf.before	2018-06-30 13:26:40.985797113 +0900
+++ default.conf	2018-06-22 13:35:28.717365000 +0900
@@ -60,3 +60,59 @@ server {
         fastcgi_pass_header "X-Accel-Limit-Rate";
     }
 }
+
+
+server {
+
+    location ~ /\. {deny all; access_log off; log_not_found off; }
+    location = /robots.txt  { access_log off; log_not_found off; }
+    location = /favicon.ico { access_log off; log_not_found off; }
+    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
+        log_not_found off;
+        proxy_pass http://unix:/var/run/nginx.sock;
+    }
+
+    set $do_not_cache 0;
+
+    if ($request_method != "GET") {
+        set $do_not_cache 1;
+    }
+
+    if ($uri ~* "\.php$") {
+        set $do_not_cache 1;
+    }
+
+    if ($http_cookie ~ ^.*(comment_author_|wordpress_logged_in|wp-postpass_).*$) {
+        set $do_not_cache 1;
+    }
+
+    location / {
+        proxy_no_cache $do_not_cache;
+        proxy_cache_bypass $do_not_cache;
+        proxy_cache_key "$scheme://$host$request_uri";
+        proxy_pass http://unix:/var/run/nginx.sock;
+    }
+
+
+    server_name oki2a24.com; # managed by Certbot
+
+    listen 443 ssl; # managed by Certbot
+    ssl_certificate /etc/letsencrypt/live/oki2a24.com/fullchain.pem; # managed by Certbot
+    ssl_certificate_key /etc/letsencrypt/live/oki2a24.com/privkey.pem; # managed by Certbot
+    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
+    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
+
+}
+
+server {
+    if ($host = oki2a24.com) {
+        return 301 https://$host$request_uri;
+    } # managed by Certbot
+
+
+    listen 80 ;
+    server_name oki2a24.com;
+    return 404; # managed by Certbot
+
+
+}
\ No newline at end of file
#

Certbot によって追加された設定ファイル /etc/letsencrypt/options-ssl-nginx.conf

性能アップのための設定

暗号化アルゴリズムと前方秘匿性(Perfect Forward Secrecy)

# This file contains important security parameters. If you modify this file
# manually, Certbot will be unable to automatically provide future security
# updates. Instead, Certbot will print and log an error message with a path to
# the up-to-date file that you will need to refer to when manually updating
# this file.

ssl_session_cache shared:le_nginx_SSL:1m;
ssl_session_timeout 1440m;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;

ssl_ciphers "ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS";

SSL/TLS の評価

SSL の評価とは?については、次のページが参考になります。

そこで、

でテストしたところ、A でした。問題なさそうです♪

おわりに

Nginx の SSL/TLS 設定については、次の本を見ながら勉強しました。

他に、次のページがとても勉強になりました。

Certbot の書き換え前から存在した、HTTP 設定は必要でしょうか?削除してみてどうなるか、など確かめてみたいなと考えています。

以上です。

コメントを残す