CentOS 7で暗号化してNginxを保護する方法

前書き

Let's Encryptは、無料のTLS / SSL証明書を簡単に取得してインストールする新しい認証局(CA)です。これにより、Webサーバーで暗号化されたHTTPSを有効にします。 必要な手順のほとんど(すべてではないにしても)の自動化を試みるソフトウェアクライアントCertbotを提供することにより、プロセスを簡素化します。 現在、ApacheおよびNginx Webサーバーの両方で、証明書の取得とインストールのプロセス全体が完全に自動化されています。

このチュートリアルでは、certbot Let’s Encryptクライアントを使用して無料のSSL証明書を取得し、CentOS7のNginxで使用する方法を示します。 また、SSL証明書を自動的に更新する方法も示します。

前提条件

このチュートリアルを実行する前に、いくつかのものが必要です。

  • sudo特権を持つroot以外のユーザーを持つCentOS7サーバー。 initial server setup for CentOS 7 tutorialの手順1〜3に従って、このようなユーザーアカウントを設定する方法を学ぶことができます。

  • 証明書を使用する登録ドメイン名を所有または制御する必要があります。 登録済みのドメイン名をまだお持ちでない場合は、多数のドメイン名レジストラーのいずれかに登録できます(例: Namecheap、GoDaddyなど)。

  • ドメインがサーバーのパブリックIPアドレスを指すDNSA Record。 これは、Let’s Encryptが証明書を発行するドメインを所有していることを検証する方法のために必要です。 たとえば、example.comの証明書を取得する場合、検証プロセスを機能させるには、そのドメインをサーバーに解決する必要があります。 このセットアップでは、ドメイン名としてexample.comwww.example.comを使用するため、both DNS records are requiredを使用します。

すべての前提条件が整ったら、次にLet's Encryptクライアントソフトウェアのインストールに進みましょう。

[[step-1 -—- installing-the-certbot-let-39-s-encrypt-client]] ==ステップ1— Certbot Let’sEncryptクライアントのインストール

Let’s Encryptを使用してSSL証明書を取得するための最初のステップは、サーバーにcertbotソフトウェアをインストールすることです。 現在、これをインストールする最良の方法はEPELリポジトリを使用することです。

次を入力して、サーバー上のEPELリポジトリへのアクセスを有効にします。

sudo yum install epel-release

リポジトリを有効にしたら、次のように入力してcertbot-nginxパッケージを取得できます。

sudo yum install certbot-nginx

これで、certbot Let’s Encryptクライアントがインストールされ、使用できるようになりました。

[[step-2 -—- setting-up-nginx]] ==ステップ2—Nginxの設定

Nginxをまだインストールしていない場合は、今すぐインストールできます。 EPELリポジトリは前のセクションで既に有効になっているはずなので、次のように入力してNginxをインストールできます。

sudo yum install nginx

次に、systemctlを使用してNginxを起動します。

sudo systemctl start nginx

CertbotはNginxのSSLを自動的に構成できますが、構成内で正しいserverブロックを見つけることができる必要があります。 これは、証明書を要求しているドメインに一致するserver_nameディレクティブを探すことによって行われます。 Nginxの新規インストールを開始する場合は、デフォルトの構成ファイルを更新できます。

sudo vi /etc/nginx/nginx.conf

既存のserver_name行を見つけます。

/etc/nginx/sites-available/default

server_name _;

_アンダースコアをドメイン名に置き換えます。

/etc/nginx/nginx.conf

server_name example.com www.example.com;

ファイルを保存して、エディターを終了します。 以下を使用して、構成編集の構文を確認します。

sudo nginx -t

エラーなしで実行される場合、Nginxをリロードして新しい構成をロードします。

sudo systemctl reload nginx

これで、Certbotは正しいserverブロックを見つけて更新できるようになります。 次に、ファイアウォールを更新してHTTPSトラフィックを許可します。

[[step-3 -—- updating-the-firewall]] ==ステップ3—ファイアウォールの更新

ファイアウォールを有効にしている場合は、ポート80と443が着信トラフィックに対して開いていることを確認してください。 ファイアウォールを実行していない場合は、スキップできます。

firewalldファイアウォールを実行している場合は、次のように入力してこれらのポートを開くことができます。

sudo firewall-cmd --add-service=http
sudo firewall-cmd --add-service=https
sudo firewall-cmd --runtime-to-permanent

iptablesファイアウォールを実行している場合、実行する必要のあるコマンドは、現在のルールセットに大きく依存します。 基本的なルールセットの場合、次のように入力してHTTPおよびHTTPSアクセスを追加できます。

sudo iptables -I INPUT -p tcp -m tcp --dport 80 -j ACCEPT
sudo iptables -I INPUT -p tcp -m tcp --dport 443 -j ACCEPT

これで、Certbotを実行して証明書を取得する準備が整いました。

[[step-4 -—-証明書の取得]] ==ステップ4—証明書の取得

Certbotは、さまざまなプラグインを介してSSL証明書を取得するさまざまな方法を提供します。 Nginxプラグインは、必要に応じてNginxを再構成し、構成を再読み込みします。

sudo certbot --nginx -d example.com -d www.example.com

これは、--nginxプラグインでcertbotを実行し、-dを使用して、証明書を有効にする名前を指定します。

certbotを初めて実行する場合は、電子メールアドレスを入力し、利用規約に同意するように求められます。 その後、certbotはLet’s Encryptサーバーと通信し、チャレンジを実行して、証明書を要求しているドメインを制御していることを確認します。

それが成功すると、certbotはHTTPS設定をどのように構成するかを尋ねます。

OutputPlease choose whether HTTPS access is required or optional.
-------------------------------------------------------------------------------
1: Easy - Allow both HTTP and HTTPS access to these sites
2: Secure - Make all requests redirect to secure HTTPS access
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):

選択してからENTERを押します。 設定が更新され、Nginxがリロードして新しい設定を取得します。 certbotは、プロセスが成功したことと、証明書が保存されている場所を通知するメッセージで終了します。

OutputIMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/example.com/fullchain.pem. Your cert will
   expire on 2017-10-23. To obtain a new or tweaked version of this
   certificate in the future, simply run certbot again with the
   "certonly" option. To non-interactively renew *all* of your
   certificates, run "certbot renew"
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

証明書がダウンロード、インストール、およびロードされます。 https://を使用してWebサイトをリロードしてみて、ブラウザのセキュリティインジケータに注目してください。 サイトが適切に保護されていることを示す必要があります。通常、緑色のロックアイコンが表示されます。

[[step-5 -—- updating-diffie-hellman-parameters]] ==ステップ5—Diffie-Hellmanパラメーターの更新

ここでSSL Labs Server Testを使用してサーバーをテストすると、Diffie-Hellmanパラメーターが弱いため、サーバーはBグレードしか取得できません。 これは、サーバーとユーザー間の最初のキー交換のセキュリティに影響します。 これを修正するには、新しいdhparam.pemファイルを作成し、それをserverブロックに追加します。

opensslを使用してファイルを作成します。

sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

これには数分かかります。 完了したら、serverブロックを含むNginx構成ファイルを開きます。 この例では、デフォルトの構成ファイルです。

sudo vi /etc/nginx/nginx.conf

serverブロック内の任意の場所に次の行を貼り付けます。

/etc/nginx/nginx.conf

. . .
ssl_dhparam /etc/ssl/certs/dhparam.pem;

ファイルを保存してエディターを終了し、構成を確認します。

sudo nginx -t

エラーがない場合は、Nginxをリロードします。

sudo systemctl reload nginx

これでサイトはより安全になり、Aの評価を受けるはずです。

[[step-6 -—- setting-up-auto-renewal]] ==ステップ6—自動更新の設定

Let's Encryptの証明書は90日間のみ有効です。 これは、ユーザーが証明書の更新プロセスを自動化することを奨励するためです。 有効期限が切れる証明書を確認して自動的に更新するために、定期的に実行するコマンドを設定する必要があります。

更新チェックを毎日実行するために、定期的なジョブを実行するための標準システムサービスであるcronを使用します。 crontabというファイルを開いて編集することにより、cronに何をすべきかを指示します。

sudo crontab -e

テキストエディタは、この時点で空のテキストファイルであるデフォルトのcrontabを開きます。 次の行を貼り付けて、保存して閉じます。

crontab

. . .
15 3 * * * /usr/bin/certbot renew --quiet

この行の15 3 * * *の部分は、「毎日午前3時15分に次のコマンドを実行する」ことを意味します。 いつでも選択できます。

Certbotのrenewコマンドは、システムにインストールされているすべての証明書をチェックし、30日以内に期限切れになるように設定されている証明書を更新します。 --quietは、情報を出力したり、ユーザー入力を待機したりしないようにCertbotに指示します。

cronはこのコマンドを毎日実行します。 有効期限が30日以内になると、インストールされているすべての証明書が自動的に更新されて再ロードされます。

[.note] #cronジョブを作成およびスケジュールする方法の詳細については、How to Use Cron to Automate Tasks in a VPSガイドを確認してください。

結論

このチュートリアルでは、Let’s Encryptクライアントcertbotをインストールし、ドメインのSSL証明書をダウンロードし、これらの証明書を使用するようにNginxを構成し、証明書の自動更新を設定しました。 Certbotの使用についてさらに質問がある場合は、their documentationから始めることをお勧めします。