nginxでSSLアクセラレータを構築する

目次

SSLアクセラレータとは何か

HTTPS通信では通常のHTTP通信に加え、証明書の検証、データの暗号化/復号処理が発生します。これらは計算量が多く、サーバーCPUに負荷がかかります。SSLアクセラレータは、この処理を代行する専用ハードウェアまたは専用ソフトウェアで、Webサーバーの負荷を軽減します。
しかし、現代ではマシン性能の向上とTLS処理の最適化により処理が高速化されたため、SSL証明書の一元管理やロードバランサーと組み合わせた構成の効率化を目的に導入される形が主となっています。

SSLアクセラレータの役割

  • データの暗号化(送信時)
  • データの復号(受信時)
  • 証明書の検証(TLSハンドシェイク)
  • SSL証明書の一元管理

SSLアクセラレータの通信の流れは以下のようになります。なお、セキュリティ上の観点から、Webサーバーには必要に応じて外部から直接アクセスできないよう適切に制御します。

[Client]
↓ HTTPS
[nginx SSLアクセラレータ]
↓ HTTP
[Webサーバー 192.168.10.x]

※SSLアクセラレータとWebサーバーが別ネットワークまたは別拠点となる場合、セキュリティの観点からHTTPS化する構成もありますが、今回は割愛します。

SSLアクセラレータのメリット

SSLアクセラレータのメリットとしては、以下の点が挙げられます。

メリット

  • WebサーバーのCPU負荷軽減によるレスポンス向上
  • SSL証明書一元化によるメンテナンス効率アップ
  • webサーバー設定の簡素化

導入効果があるシステム例

  • WebサーバーのCPU負荷が高いシステム
  • 同時接続数多いサービス(TLSハンドシェイク処理がボトルネックになりやすい)
  • Webサーバーが複数あり、SSL証明書が複数個所に分散している場合

SSLアクセラレータのデメリット

SSLアクセラレータのデメリットとしては、以下の点が挙げられます。

  • サーバーが増えることによる導入、運用コストの増加
  • 構成の複雑化に伴うネットワーク管理、障害対応コストの増加
  • HTTPSとHTTPの混在によるシステム構造の複雑化

nginxでのSSLアクセラレータ設定手順

オーソドックスな複数Webサーバーへの負荷分散を内包した[nginx SSLアクセラレータ]と[Webサーバー]のシンプルな設定例となります。ドメイン名部分などは必要に応じて読み替えて下さい。

[Client]
↓ HTTPS
[nginx SSLアクセラレータ]
↓ HTTP(負荷分散)
[Webサーバー 192.168.10.x]
[Webサーバー 192.168.10.x]

・SSLアクセラレータでのnginx.conf設定例

upstream websv {
    # 負荷分散
    least_conn;
    server 192.168.10.11:80;
    server 192.168.10.12:80;
}

server {
    listen 80;
    server_name yourdomain.com;

    location / {
        return 301 https://$host$request_uri;
    }
}


server {
    listen 443 ssl;
    server_name yourdomain.com;

    # Let's Encryptの場合の設定例
    ssl_certificate /etc/nginx/ssl.key/filecrt/yourdomain.com.crt;
    ssl_certificate_key /etc/nginx/ssl.key/key/yourdomain.com.key;

    # 使用を許可するTLSのバージョン
    ssl_protocols       TLSv1.2 TLSv1.3;
    # 使用可能な暗号スイート
    ssl_ciphers HIGH:!aNULL:!MD5:!3DES;
    # セッションキャッシュ
    ssl_session_cache   shared:SSL:10m;
    ssl_session_timeout 10m;

    location / {
        # バックエンドにドメイン名を通知
	      proxy_set_header Host $host;
        # バックエンドにクライアントの接続元IPアドレス + 自分のIPを通知
	      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        # クライアントからの通信がhttpsでのアクセスだったことを通知
	      proxy_set_header X-Forwarded-Proto https;

        # バックエンドにhttpで転送(今回はhttpなので注意)
        proxy_pass http://websv;
    }
}

・upstream先のWebサーバーでのnginx.xonf設定例
ここではSSLアクセラレータとHTTPで対話する想定として、80番ポートのみ設定します。
外部からの直接アクセス、またはSSLアクセラレータとHTTPSで対話する構造の場合は443番ポートも設定します。

# log_formatの $http_x_forwarded_for でユーザーの送信元IPの特定
# デフォルトの $remote_addr だとSSLアクセラレーターのローカルIPアドレスになる
log_format  main  '$http_x_forwarded_for - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent"';

server {
    listen 80;
    server_name yourdomain.com;
    root   /usr/share/nginx/html;

    location / {
        allow 192.168.10.0/24;
        deny all;
    }

}

以上の設定でWebサーバーへのアクセスがSSLアクセラレータ経由になります!

最後に

今回はSSLアクセラレータについて紹介しました。SSLアクセラレータ以外にもSSL証明書管理の簡素化方法はさまざまですが、負荷分散と組み合わせたオーソドックスなものとして紹介させてもらいました。
大規模なシステムではWebサーバー数も多く、比例して管理するSSL証明書の数も膨大となるかと思います。SSL証明書に不備があると即アクセス障害に繋がります。他社様でもたびたびSSL証明書を起因とするアクセス障害を目にします。同じことの無い様に慎重かつ効率よく運用したいですね。

スペース・アイでは、長年にわたりSSLアクセラレータをはじめとしたSSL証明書を活用したシステムの運用実績が多くございます。サーバーのSSL証明書関連でお困りの際は、お気軽にご相談ください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

目次