Ubuntu16.04でLet’sEncryptを使用してRancherWebアプリを保護する方法
序章
TLS / SSL でWebアプリケーションを保護することは、機密情報を処理するアプリケーションにのみ必要であると考えられていました。これは、公式の証明書を取得するにはコストがかかり、追加のセットアップが必要だったためです。 Let’s Encrypt を使用すると、コストをかけずに自動化された方法で公式の証明書を作成できます。つまり、このセキュリティ層をトレードオフなしで任意のWebサイトに追加できます。
Rancher は、使いやすいダッシュボードを使用して、Dockerコンテナーを直感的な方法で管理します。 Rancherには、証明書を生成できるLet’s Encryptサービスなど、すぐに展開できる人気のあるアプリケーションのカタログがあり、必要に応じて更新も行います。 作成されると、証明書はランチャー内に保存され、問題なく使用できます。
ランチャーでLet’sEncryptを設定するプロセスは、3つの主要なステップで構成されます。Let’sEncryptサービスをデプロイし、生成した証明書をロードバランサーに適用し、HTTPからHTTPSへのリダイレクトを設定します。 このチュートリアルでは、プロセス全体を順を追って説明します。
前提条件
このチュートリアルを完了するには、次のものが必要です。
- Rancherがインストールされた1GBのUbuntu16.04サーバー。 これを構成するには、チュートリアル Ubuntu16.04でRancherとDockerマシンを使用してマルチノード展開を管理する方法に従ってください。 そのチュートリアルで追加のサーバーを作成します。これは、Dockerコンテナーのホストとして機能します。
- Rancherの組み込みのロードバランサーサービスを使用するRancherを使用してデプロイされたアプリケーション。 このチュートリアルは、Rancherカタログにあるものを含め、どのアプリケーションでも実行できますが、 Ubuntu16.04でRancherを使用してNode.jsおよびMongoDBアプリケーションをデプロイする方法に関するガイドを確認して開始することもできます。 。 どちらのルートを選択する場合でも、構成でRancherの組み込みのロードバランサーサービスを使用して、リクエストをアプリケーションコンテナーに転送するようにしてください。
- ランチャーロードバランサーサービスを実行するホストのパブリックIPアドレスを指す
your_domain
のAレコードを持つ完全修飾ドメイン名(FQDN)。 これが必要なのは、Let’s Encryptが、証明書を発行しているドメインを所有していることを検証する方法のためです。 チュートリアルDigitalOceanでホスト名を設定する方法に従って、このレコードを構成できます。 このチュートリアルを開始する前に、デプロイされたアプリケーションをhttp://your_domain
で表示できることを確認してください。
ステップ1—Let’sEncryptサービスの展開
Let’s EncryptサービスをDockerコンテナーとしてデプロイします。これは、Rancherホストの1つでホストされます。 このプロセスは、RancherカタログからLet’s Encryptサービスを選択し、必要な情報を入力することで構成されます。 この手順を完了すると、Rancherで証明書を利用できるようになります。 何よりも、サービスは、有効期限が近づくと、ユーザー側でそれ以上のアクションを実行することなく、証明書を自動的に更新します。
開始するには、Rancherユーザーインターフェイスの上部にある Catalog メニューをクリックして、 RancherCatalogに移動します。 次に、 Let’sEncryptサービスを検索します。 見つかったら、詳細の表示ボタンをクリックし、次の手順に従ってサービスを構成します。
- 最新のテンプレートバージョンを選択します。 このチュートリアルでは、バージョン0.4.0を使用します。
- 新しいアプリケーションスタックに固有の名前を付けます。 このチュートリアルではCertificatesと呼びますが、どのような名前でもかまいません。
- 条件に同意する場合は、情報を読んだ後、 I Agree to Let’s EncryptTOSフィールドのYesオプションを選択します。
- Let’sEncryptAPIのProductionバージョンを選択します。
- メールアドレスフィールドに有効なメールアドレスを入力してください。
- 証明書名には、証明書の名前を入力して、Rancherのユーザーインターフェイスで簡単に識別できるようにします。 これにはドメイン名を使用できます。
- ドメイン名には、保護するドメイン名を入力します。 複数のドメインを保護する場合は、各ドメインをコンマで区切って入力します。
- 公開鍵アルゴリズムには、Webアプリケーションで使用される最も一般的なアルゴリズムであるデフォルトの RSA-2048 を選択するか、ニーズに合ったアルゴリズムを選択します。
- 更新時刻で、証明書を更新する時刻をUTCで選択します。 12 のデフォルト値は、特定の制約がない限り正常に機能します。
- ドメイン検証方法の場合、このチュートリアルではHTTPを選択します。 ドメインに使用しているDNSプロバイダーで機能する他の方法を選択できます。 DigitalOceanは、Cloudflare、DNSimple、Dyn、Gandi、Ovh、Route53、Vultrとともにリストに含まれています。 HTTP オプションはプロバイダーに関係なく機能し、このチュートリアルで使用するアプローチです。
- 残りのフィールドは、特定のDNSプロバイダーに関連しています。 HTTP 方式を選択したため、空白のままにすることができます。
- 次に、作成後にサービスを開始するチェックボックスをオフにします。 追加の構成変更を行った後、サービスを開始します。
- 最後に、ページの下部にある起動ボタンをクリックしてサービスを開始し、サービスが展開されるのを待ちます。
次に、Racherのロードバランササービスに、/.well-known/acme-challenge
のリクエストを新しいCertificateサービスに転送するように指示する必要があります。 これがないと、Let’sEncryptは私たちがドメインの所有者であることを確認できません。 次の手順に従って、プロセスを完了します。
- ランチャーでロードバランサーサービスを見つけて、そのアップグレード/編集ボタンをクリックします。
- 新しいサービスルールを追加します。
- 新しいルールの場合:
アクセスがパブリックに設定されていることを確認します。 プロトコルがHTTPに設定されていることを確認します。 ポートが80に設定されていることを確認します。 パスを/.well-known/acme-challengeに設定します。 TargetをCertificateサービスに設定します。 - この新しいサービスの上矢印を押して、リストの最初のサービスであることを確認します。
- 画面下部の編集を押して設定を保存します。
新しいルールを設定したら、Let’sEncryptサービスを開始します。
- インターフェイスの上部にあるStacksメニューを選択して、Certificateスタックを見つけます。
- Certificates スタックを選択して、letsencryptサービスを表示します。
- Startボタンを押してサービスを開始します。
この時点で、Let’s Encryptサービスが実行されているはずであり、証明書が作成されます。 このプロセスには、5〜15分かかる場合があります。 インフラストラクチャメニューを選択し、証明書を選択して証明書を表示します。 しばらくすると、新しい証明書が表示されますが、ページを更新する必要がある場合があります。 証明書が表示されたら、アプリケーションで使用できます。
ステップ2—証明書とアプリケーションのリンク
Let’s Encrypt証明書がRancherで利用可能になったら、RancherLoadBalancerサービスで使用するためにそれを選択できます。 これを行うには、HTTPSを使用するようにロードバランサーのルールを変更し、証明書を適用します。 これらの構成を変更するには、次の手順に従います。
- ランチャーでロードバランサーサービスを見つけ、そのアップグレード/編集ボタンを押して設定にアクセスします。
- ポートルールセクションで、アプリケーションにリクエストを転送するエントリを探し、プロトコルを HTTPS に変更し、
リクエストホストポート[ X186X]から443まで。これはHTTPSのデフォルトポートです。 - ページ下部のSSL終了タブに移動し、証明書フィールドで使用する証明書を選択します。 複数の証明書を追加する場合は、代替証明書フィールドでそれらを選択できます。 証明書を選択すると、対応するドメインに自動的にリンクされます。
- ページ下部の作成ボタンをクリックします。
HTTPSプロトコル(https://your_domain
)を使用してWebサイトにアクセスすると、接続が安全になっていることがわかります。 ただし、ポート80
をポート443
に置き換えたため、HTTPを介したリクエストは機能しなくなります。 この問題を解決するには、以前のHTTPとポート80
のルールを追加し直すことができますが、代わりに、トラフィックをHTTPからHTTPSにリダイレクトするようにロードバランサーを調整します。 これにより、人々は常に安全な方法でサイトにアクセスできます。
ステップ3—HTTPをHTTPSにリダイレクトする
Rancher Load Balancerサービスは、カスタムHAProxy構成設定をサポートしています。 この機能を使用して、HTTPからHTTPSに送信されるすべてのトラフィックをリダイレクトする構成を含めます。 このセクションのアプローチでは、以前に構成したLet’s Encryptサービスを利用します。これは、現在ポート80
をリッスンして、ドメイン検証要求を転送しているためです。
リダイレクトを設定するには、Rancherでロードバランサーサービスを見つけ、アップグレード/編集ボタンを押して、前の手順で行ったように設定にアクセスします。 設定ページが表示されたら、ページの下部にある Customhaproxy.cfgタブを選択します。
次のコードを追加して、リダイレクトを作成します。
frontend 80
acl lepath path_beg -i /.well-known/acme-challenge
redirect scheme https code 301 if !lepath !{ ssl_fc }
これにより、すべてのトラフィックをHTTPSにリダイレクトするロードバランサーのルールが作成されますが、Let’sEncryptドメイン検証用に構成した/.well-known/acme-challenge
パスのリクエストは無視されます。 code 301
を使用して、このドメインの永続的なリダイレクトが必要であることを示します。 リダイレクション設定の詳細については、HAProxyドキュメントを参照してください。
これらの変更を適用するには、ページの下部にある編集ボタンをクリックします。
この時点で、訪問者がHTTPを介してWebサイトにアクセスするたびに、訪問者はHTTPSにリダイレクトされ、Webサイトがすべての人にとって安全になります。 これで、Webサイトのテストに進むことができます。
ステップ4—セットアップのテスト
Webサイトをテストするには、HTTPプロトコル(http://your_domain
)を使用してWebブラウザーでアドレスを開き、アドレスバーで安全なインジケーターを探します。 curl
ユーティリティを使用して、次のコマンドを実行してテストすることもできます。このコマンドは、サーバーにリクエストを送信し、リダイレクトを追跡し、応答ヘッダーのみを返します。
- curl -I -L http://your_domain
次のような結果が表示されるはずです。
OutputHTTP/1.1 301 Found
Cache-Control: no-cache
Content-length: 0
Location: https://your_domain/
Connection: close
HTTP/1.1 200 OK
Cache-Control: public, max-age=0
Content-Type: text/html; charset=utf-8
Vary: Accept-Encoding
Date: Sun, 19 Feb 2017 03:42:47 GMT
出力の最初のブロックは、HTTPを介して最初にWebサイトを要求したときの応答を示しています。これは、Webサイトが見つかったが、場所が別のアドレスにあることを示しています。 301 Found
セクションに注意してください。これは、追加したHAProxyルールが機能したことを示しています。 Location
セクションには、要求されたリソースの新しい場所が表示されます。 出力の2番目のブロックは、curl
が新しい場所へのリダイレクトに従ったことを示しています。 また、200 OK
応答で示されているように、Webサイトが新しい場所で見つかったことも示しています。
結論
このチュートリアルでは、RancherとLet’sEncryptサービスを使用してWebサイトにHTTPSを設定します。 安全なWebサイトの取得がこれまでになく簡単になり、証明書を絶えず更新したり、タスク用の他のツールを設定したりすることを心配する必要がなくなりました。 また、Rancherを使用すると、将来の需要を満たすためにインフラストラクチャをスケールアップできます。