AC-5

某SEの雑記帳

Nginxで無料SSL証明書 Let’s Encryptを導入して、ついでにHTTP/2化。セキュリティ評価をA+まで上げる。

      2016/05/19

NginxでのLet’s Encryptの導入方法です。
証明書の発行までの方法は無料SSL証明書 Let’s Encryptを導入すると同じですので、そちらを参照してください。
Apacheの設定ファイル編集の部分がNginxと異なるので記載します。

また、http/2とは2015年に16年ぶりにアップデートしたHTTPの最新バージョンのプロトコルです。
HTTP/2は部分的にGoogleが提案したSPDY(スピーディ)と呼ばれるプロトコルをベースとしていて、このプロトコルから継承した形でリリースされました。
HTTP/2によって、複数のリクエストを同時に処理することができます。
これによって、データ接続はより高速で簡単になると言われています。

基本設定

firewalldを設定している場合は、HTTPS(Port443)を開放しておいてください。
また、HTTP/2に対応しているNginxのバージョンはnginx1.9.5以降となるので、バージョンを確認してyumでアップデートしてください。

Nginxの設定ファイル編集

今回はヴァーチャルサーバに設定しました。
hogehoge.comというドメインのhogehoge.com.confファイルに設定を入れます。

CentOS7でのファイアウォールの設定(firewalld)

[root@test]# vi /etc/nginx/conf.d/hogehoge.com.conf←設定ファイル編集
←server内の下記の項目を修正、追加する
server {
     listen 443 ssl http2←listen 80からHTTPSのポートに変更して、HTTP/2も有効化します
     listen [::]:443 ssl http2
     ssl_certificate /etc/letsencrypt/live/hogehoge.com/fullchain.pem;←サーバ証明書+中間証明書のパスを追加
     ssl_certificate_key /etc/letsencrypt/live/hogehoge.com/privkey.pem;←サーバ秘密鍵のパスを追加
}
ついでに、httpへのアクセスは全てhttpsへリダイレクトするように下記を追記します。
server {
        listen 80;
        listen [::]:80;
        server_name hogehoge.com;
        #httpへのアクセスをhttpsへリダイレクトする
        return 301 https://$host$request_uri;
}

以上の設定で、Nginxを再起動して確認します。

POODLE対策

SSLはv1.0~v3.0まで全て「POODLE」と呼ばれる重大な脆弱性が見つかった為、使用してはいけません。
下記を追加して、TLSのみを利用するようにします。

[root@test]# vi /etc/nginx/conf.d/hogehoge.com.conf←設定ファイル編集
server { 
     ssl_protocols TLSv1 TLSv1.1 TLSv1.2;←serverディレクティブに追記します。
}

脆弱な暗号化スイートを無効にする

脆弱性のあるものや、使用頻度の低い暗号化スイートを明示的にオフにして、使用する暗号化スイートを設定します。
これによりセキュリティを向上させることができます。

[root@test]# vi /etc/nginx/conf.d/hogehoge.com.conf←設定ファイル編集
server { 
下記をserverディレクティブに追記します。
 ssl on;サーバ側の暗号化スイートを優先する
 ssl_prefer_server_ciphers on;
 ssl_ciphers ECDHE+RSAGCM:ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:!EXPORT:!DES:!3DES:!MD5:!DSS;
}

<h2>PFS(Perfect Forward Security)の有効

Forward Securityとは2014年のHeartbleed(CVE-2014-0160)の際に注目された、秘密鍵が漏洩してもそれだけでは解読できないようにする仕組みです。
具体的には、鍵の交換にEDH鍵交換方式を用いて、決まった鍵の代わりにセッションごとに、クライアントとサーバ側で異なったランダムな数字を鍵として使うことができます。
これは、EDH鍵交換はDiffie-Hellman鍵共有という方法で実現しています。

その中でも、以下の条件を満たしたものがPFSと呼ばれます。
・鍵合意のために公開可能な、ランダムな値を使う。
・鍵合意の過程で決定的なアルゴリズムを一切使わない。

このPFSを用いる為にはDH鍵共有に使用するパラメータファイルが必要なので、opensslコマンドで2048bitの鍵を生成します。

[root@test]# mkdir /etc/nginx/ssl←ディレクトリ作成
[root@test]# cd /etc/nginx/ssl←ディレクトリ移動
[root@test ssl]# openssl dhparam 2048 -out dhparam.pem←ファイル生成
[root@test]# vi /etc/nginx/conf.d/hogehoge.com.conf←設定ファイル編集
server { 
 ssl_dhparam /etc/nginx/ssl/dhparam.pem;serverディレクティブに追記
}

OCSP Staplingの有効化

OCSP(Online Certificate Status Protocol)とは、SSL/TLS暗号化通信の初期フェーズにおいて証明書の失効を確認するための手順です。
ライアントがOCSP要求を行うのではなく、サーバがOCSP要求を行って、その応答をキャッシュします。
サーバはキャッシュしたOCSP応答を、サーバ証明書と一緒にクライアントに送信します。これによりクライアントはOCSP responderに問い合わせる必要がなくなり、HTTPS通信の開始を高速化することができるようになります。

[root@test]# vi /etc/nginx/conf.d/hogehoge.com.conf←設定ファイル編集
server { 
serverディレクティブに下記を追記
ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate /etc/letsencrypt/live/hogehoge.com/fullchain.pem;サーバ証明書+中間証明書のパスを記載
        resolver 8.8.8.8;
}

HSTSを有効化

サーバーからブラウザへHTTP平文を送らないでほしいというリクエストをヘッダに返します。
するとそのブラウザで常時HTTPSで暗号化した通信を行うようになります。
これまでの設定では評価はAだと思いますが、HSTSの設定が反映されれば評価はA+になりました。

[root@test]# vi /etc/nginx/conf.d/hogehoge.com.conf←設定ファイル編集
server { 
add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains;preload';';←serverディレクティブに追記
add_header Strict-Transport-Security 'max-age=31536000;preload';←サブドメインは対象外にする場合
}

max-age=31536000は一年間、そのブラウザではHTTPSで通信するように、情報を保持する設定になっています。
この値を0にすると、設定後にユーザがサイトに訪れた際に、max-age=0に更新されるので一旦リセットする事が可能です。

HSTSの設定確認はHSTS Preload Submissionから確認できます。
また、自身のchromeで一度読み込んでしまったHSTSはこちらから削除可能です。

SSLの評価はSSL LABSで行います。
見事A+を獲得できました。
WS000000

 - Linux