このチュートリアルの以前のバージョンは、Sergey Zhukaevによって作成されました。
前書き
Nginxは、高速で信頼性の高いオープンソースWebサーバーです。 メモリフットプリントが小さく、拡張性が高く、構成が簡単で、さまざまなプロトコルがサポートされているため、人気を博しました。
HTTP/2 is a new version of the Hypertext Transport Protocol, which is used on the Web to deliver pages from server to browser. HTTP/2 is the first major update of HTTP in almost two decades: HTTP1.1 was introduced to the public back in 1999 when webpages were usually just a single HTML file with inline CSS stylesheet. インターネットはそれ以来劇的に変化しており、現在、HTTP 1.1の制限に直面しています。プロトコルは、キュー内のページの一部をダウンロードするため、ほとんどの最新Webサイトの潜在的な転送速度を制限します(前の部分は、ダウンロードする前に完全にダウンロードする必要があります次の部分が始まります)、平均的な最新のWebページでは約100のリクエストをダウンロードする必要があります(各リクエストは画像、jsファイル、cssファイルなどです)。
HTTP/2 solves this problem because it brings a few fundamental changes:
-
すべてのリクエストはキューではなく並行してダウンロードされます
-
HTTPヘッダーは圧縮されています
-
ページはテキストファイルとしてではなくバイナリとして転送されるため、より効率的です
-
サーバーはユーザーのリクエストがなくてもデータを「プッシュ」できるため、待ち時間の長いユーザーの速度が向上します
HTTP / 2は暗号化を必要としませんが、Google ChromeとMozilla Firefoxの2つの最も人気のあるブラウザーの開発者は、セキュリティ上の理由からHTTPS接続に対してのみHTTP / 2をサポートすると述べました。 したがって、HTTP / 2サポートを使用してサーバーをセットアップする場合は、HTTPSを使用してサーバーを保護する必要もあります。
このチュートリアルは、HTTP / 2をサポートする高速で安全なNginxサーバーのセットアップに役立ちます。
前提条件
始める前に、いくつかのことが必要です。
-
sudo非rootユーザーとファイアウォールを含むthe Ubuntu 18.04 initial server setup guideをフォローしてセットアップされた1つのUbuntu18.04サーバー。
-
Nginxがサーバーにインストールされています。これはHow To Install Nginx on Ubuntu 18.04に従って実行できます。
-
サーバーを指すように構成されたドメイン名。 Namecheapで購入するか、Freenomで無料で入手できます。 How To Set Up a Host Name with DigitalOceanチュートリアルに従うことで、ドメインをDigitalOceanDropletsにポイントする方法を学ぶことができます。
-
サーバー用に構成されたTLS / SSL証明書。 3つの選択肢があります。
-
How to Secure Nginx with Let’s Encrypt on Ubuntu 18.04をフォローすると、Let’s Encryptから無料の証明書を取得できます。
-
How to Create a Self-signed SSL Certificate for Nginx in Ubuntu 18.04を使用して、自己署名証明書を生成および構成することもできます。
-
How to Create a Self-signed SSL Certificate for Nginx in Ubuntu 18.04のステップ2から6に従って、buy one from another providerを使用し、それを使用するようにNginxを構成できます。
-
-
Nginxは、トラフィックをポート
80
からポート443
にリダイレクトするように構成されています。これは、前の前提条件でカバーされている必要があります。 -
Nginxは、2048ビット以上のEphemeral Diffie-Hellman(DHE)キーを使用するように構成されています。これは、以前の前提条件でもカバーされている必要があります。
[[step-1 -—- enableing-http-2-support]] ==ステップ1— HTTP / 2サポートを有効にする
server block set up step in the Nginx installation tutorialに従っている場合は、ドメインのサーバーブロックが/etc/nginx/sites-available/your_domain
にあり、 `server_name`ディレクティブが適切に設定されている必要があります。 最初に行う変更は、HTTP / 2を使用するようにドメインのサーバーブロックを変更することです。
ドメインの構成ファイルを開きます。
sudo nano /etc/nginx/sites-available/your_domain
ファイルで、ポート443
に関連付けられているlisten
変数を見つけます。
your_domain’>/etc/nginx/sites-available/your_domain
...
listen [::]:443 ssl ipv6only=on;
listen 443 ssl;
...
1つ目はIPv6接続用です。 2つ目は、すべてのIPv4接続用です。 両方でHTTP / 2を有効にします。
各listen
ディレクティブを変更して、http2
を含めます。
your_domain’>/etc/nginx/sites-available/your_domain
...
listen [::]:443 ssl http2 ipv6only=on;
listen 443 ssl http2;
...
これは、サポートされているブラウザーでHTTP / 2を使用するようにNginxに指示します。
構成ファイルを保存し、テキストエディターを編集します。
Nginx設定ファイルに変更を加えるときはいつでも、次のような構文エラーの設定を確認する必要があります。
sudo nginx -t
構文にエラーがない場合、次の出力が表示されます。
sudo nginx -tの出力
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
次に、より制限の厳しい暗号リストを使用するようにサーバーを構成します。
[[step-2 -—- removing-old-and-insecure-cipher-suites]] ==ステップ2—古くて安全でない暗号スイートの削除
HTTP/2 has a blacklist of old and insecure ciphers, so we must avoid them. 暗号スイートは、転送されたデータを暗号化する方法を記述する暗号化アルゴリズムです。
暗号の定義に使用する方法は、NginxのTLS / SSL証明書の設定方法によって異なります。
Certbotを使用して証明書を取得した場合は、HTTP / 2に対して十分な強度がない暗号を含むファイル/etc/letsencrypt/options-ssl-nginx.conf
も作成されました。 このファイルを変更すると、残念ながら将来Certbotが更新を適用できなくなるため、Nginxにこのファイルを使用しないように指示し、独自の暗号リストを指定します。
ドメインのサーバーブロック構成ファイルを開きます。
sudo nano /etc/nginx/sites-available/your_domain
options-ssl-nginx.conf
ファイルを含む行を見つけて、コメントアウトします。
your_domain’>/etc/nginx/sites-available/your_domain
# include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot<^>
その行の下に、許可された暗号を定義する次の行を追加します。
your_domain’>/etc/nginx/sites-available/your_domain
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ファイルを保存し、エディターを終了します。
自己署名証明書を使用した場合、またはサードパーティの証明書を使用して前提条件に従って構成した場合は、テキストエディタでファイル/etc/nginx/snippets/ssl-params.conf
を開きます。
sudo nano /etc/nginx/snippets/ssl-params.conf
次の行を見つけます。
/etc/nginx/snippets/ssl-params.conf
...
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
...
次のように変更します。
/etc/nginx/snippets/ssl-params.conf
...
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ファイルを保存して、エディターを終了します。
もう一度、構文エラーの構成を確認します。
sudo nginx -t
エラーが表示された場合は、エラーに対処して再度テストしてください。
構文エラーが表示されなくなったら、Nginxを再起動します。
sudo systemctl reload nginx
サーバーを再起動したら、動作することを確認しましょう。
[[step-3 -—- verifying-that-http-2-is-enabled]] ==ステップ3— HTTP / 2が有効になっていることを確認する
サーバーが実行され、HTTP / 2で動作していることを確認しましょう。
curl
コマンドを使用して、サイトにリクエストを送信し、ヘッダーを表示します。
curl -I -L https://your_domain
次の出力が表示されます。
OutputHTTP/1.1 301 Moved Permanently
Server: nginx/1.14.0 (Ubuntu)
Date: Fri, 06 Jul 2018 19:07:12 GMT
Content-Type: text/html
Content-Length: 194
Connection: keep-alive
Location: https://your_domain/
HTTP/2 200
server: nginx/1.14.0 (Ubuntu)
date: Fri, 06 Jul 2018 19:07:12 GMT
content-type: text/html
content-length: 16
last-modified: Fri, 06 Jul 2018 16:55:37 GMT
etag: "5b3f9f09-10"
accept-ranges: bytes
HTTP / 2がGoogle Chromeで使用されていることも確認できます。 Chromeを開き、http://your_domain
に移動します。 Chromeデベロッパーツールを開き(View→Developer→Developer Tools)、ページをリロードします(View→Reload This Page)。 [Network]タブに移動し、Nameで始まるテーブルヘッダー行を右クリックして、ポップアップメニューから[Protocol]オプションを選択します。
新しいProtocol列にh2
(HTTP / 2の略)が表示され、HTTP / 2が機能していることを示します。
この時点で、HTTP / 2プロトコルを介してコンテンツを提供する準備が整いました。 HSTSを有効にして、セキュリティとパフォーマンスを改善しましょう。
[[step-4 -—- enableing-http-strict-transport-security-hsts]] ==ステップ4— HTTP Strict Transport Security(HSTS)の有効化
HTTPリクエストはHTTPSにリダイレクトされますが、HTTP Strict Transport Security(HSTS)を有効にして、これらのリダイレクトを実行する必要をなくすことができます。 ブラウザがHSTSヘッダーを検出した場合、所定の期間、通常のHTTPを介してサーバーへの接続を再試行しません。 何があっても、暗号化されたHTTPS接続のみを使用してデータを交換します。 このヘッダーは、プロトコルdowngrade attacksからも保護します。
エディターでNginx構成ファイルを開きます。
sudo nano /etc/nginx/nginx.conf
次の行をファイルに追加して、HSTSを有効にします。
/etc/nginx/nginx.conf
http {
...
##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
add_header Strict-Transport-Security "max-age=15768000" always;
}
...
max-age
は秒単位で設定されます。 値15768000
は6か月に相当します。
デフォルトでは、このヘッダーはサブドメイン要求に追加されません。 サブドメインがあり、HSTSをそれらすべてに適用する場合は、次のように、行の最後にincludeSubDomains
変数を追加する必要があります。
/etc/nginx/nginx.conf
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains" always;
ファイルを保存し、エディターを終了します。
もう一度、構文エラーの構成を確認します。
sudo nginx -t
最後に、変更を適用するためにNginxサーバーを再起動します。
sudo systemctl reload nginx
結論
NginxサーバーはHTTP / 2ページを提供しています。 SSL接続の強度をテストする場合は、Qualys SSL Labにアクセスして、サーバーに対してテストを実行してください。 すべてが適切に構成されている場合、セキュリティのためにA +マークを取得する必要があります。