序章

Apache Tomcatは、Javaアプリケーションを提供するように設計されたWebサーバーおよびサーブレットコンテナです。 実稼働エンタープライズ展開や小規模なアプリケーションのニーズで頻繁に使用されるTomcatは、柔軟性と強力性の両方を備えています。

このガイドでは、SSLを使用してUbuntu16.04Tomcatのインストールを保護する方法について説明します。 デフォルトでは、インストール時に、入力されたパスワードや機密データを含め、Tomcatサーバーとクライアント間のすべての通信は暗号化されていません。 TomcatのインストールにSSLを組み込む方法はいくつかあります。 このガイドでは、SSL対応のプロキシサーバーをセットアップしてクライアントと安全にネゴシエートし、Tomcatにリクエストを渡す方法について説明します。

ApacheNginxの両方でこれを設定する方法について説明します。

なぜリバースプロキシなのか?

Tomcatインストール用にSSLを設定する方法はいくつかあり、それぞれにトレードオフがあります。 Tomcatには接続をネイティブに暗号化する機能があることを知った後、リバースプロキシソリューションについて説明するのは奇妙に思えるかもしれません。

Tomcatを使用したSSLには、管理を困難にするいくつかの欠点があります。

  • Tomcatは、非特権ユーザーで推奨されているように実行すると、従来のSSLポート443 のように制限付きポートにバインドできません。これには、authbindプログラムを使用して非特権プログラムをマップするなど、回避策があります。ポートが制限されている場合、ファイアウォールを使用してポートフォワーディングを設定している場合などですが、それでもさらに複雑になります。
  • Tomcatを使用したSSLは、他のソフトウェアではそれほど広くサポートされていません:Let’s Encryptのようなプロジェクトは、Tomcatと対話するネイティブな方法を提供しません。 さらに、Javaキーストア形式では、使用前に従来の証明書を変換する必要があるため、自動化が複雑になります。
  • 従来のWebサーバーはTomcatよりも頻繁にリリースされます:これは、アプリケーションに重大なセキュリティ上の影響を与える可能性があります。 たとえば、サポートされているTomcat SSL暗号スイートはすぐに古くなり、アプリケーションの保護が最適化されないままになる可能性があります。 セキュリティの更新が必要な場合は、TomcatをインストールするよりもWebサーバーを更新する方が簡単な場合があります。

リバースプロキシソリューションは、Tomcatインストールの前に強力なWebサーバーを配置するだけで、これらの問題の多くを回避します。 Webサーバーは、SSLを使用してクライアント要求を処理できます。SSLは、処理するように特別に設計された機能です。 次に、通常の非特権構成で実行されているTomcatに要求をプロキシできます。

この関心の分離により、追加のソフトウェアを実行することを意味する場合でも、構成が簡素化されます。

前提条件

このガイドを完了するには、Tomcatをサーバーにセットアップしておく必要があります。 このガイドでは、Ubuntu16.04インストールガイドTomcat8の手順を使用してセットアップを行ったことを前提としています。

Tomcatを稼働させたら、以下の優先Webサーバーのセクションに進みます。 Apache は真下から始まりますが、Nginx構成は少し先にスキップすることで見つけることができます。

(オプション1)ApacheWebサーバーのmod_jkを使用したプロキシ

Apache Webサーバーには、mod_jkというモジュールがあり、ApacheJServプロトコルを使用してTomcatと直接通信できます。 このプロトコルのコネクタはTomcat内でデフォルトで有効になっているため、Tomcatはすでにこれらの要求を処理する準備ができています。

セクションの前提条件

Apache Webサーバー接続をTomcatにプロキシする方法について説明する前に、ApacheWebサーバーをインストールして保護する必要があります。

このガイドのステップ1に従って、ApacheWebサーバーをインストールできます。 MySQLまたはPHPをインストールしないでください。

その後、サーバーでSSLを設定する必要があります。 これを行う方法は、ドメイン名を持っているかどうかによって異なります。

  • ドメイン名をお持ちの場合…サーバーを保護する最も簡単な方法は、無料の信頼できる証明書を提供するLet’sEncryptを使用することです。 これを設定するには、ApacheのLet’sEncryptガイドに従ってください。
  • ドメインがない場合…この構成をテストまたは個人使用に使用している場合は、代わりに自己署名証明書を使用できます。 これは同じタイプの暗号化を提供しますが、ドメイン検証はありません。 セットアップするには、Apache自己署名SSLガイドに従ってください。

これらの手順が完了したら、以下に進んで、ApacheWebサーバーをTomcatインストールに接続する方法を学習します。

ステップ1:mod_jkをインストールして構成する

まず、mod_jkモジュールをインストールする必要があります。 Apache Webサーバーはこれを使用して、ApacheJServプロトコルを使用してTomcatと通信します。

Ubuntuのデフォルトリポジトリからmod_jkをインストールできます。 ローカルパッケージインデックスを更新し、次のように入力してインストールします。

  1. sudo apt-get update
  2. sudo apt-get install libapache2-mod-jk

モジュールはインストール時に自動的に有効になります。

次に、モジュールを構成する必要があります。 メインの設定ファイルは/etc/libapache2-mod-jk/workers.propertiesにあります。 このファイルをテキストエディタで今すぐ開きます。

  1. sudo nano /etc/libapache2-mod-jk/workers.properties

内部で、workers.tomcat_homeディレクティブを見つけます。 これをTomcatインストールホームディレクトリに設定します。 Tomcatのインストールの場合、それは/opt/tomcatになります。

/etc/libapache2-mod-jk/workers.properties
workers.tomcat_home=/opt/tomcat

終了したら、ファイルを保存して閉じます。

手順2:mod_jkを使用してApache仮想ホストをプロキシに調整する

次に、リクエストをTomcatインストールにプロキシするようにApache仮想ホストを調整する必要があります。

開く正しい仮想ホストファイルは、SSLの設定に使用した方法によって異なります。

上記のリンク先のガイドを使用して自己署名SSL証明書を設定する場合は、default-ssl.confファイルを開きます。

  1. sudo nano /etc/apache2/sites-available/default-ssl.conf

Let’s Encryptを使用してSSLを設定した場合、ファイルの場所は、証明書プロセス中に選択したオプションによって異なります。 次のように入力すると、SSL要求の処理に関与している仮想ホストを見つけることができます。

  1. sudo apache2ctl -S

出力は、次のようなもので始まる可能性があります。

  1. Output
    VirtualHost configuration:
  2. *:80 example.com (/etc/apache2/sites-enabled/000-default.conf:1)
  3. *:443 is a NameVirtualHost
  4. default server example.com (/etc/apache2/sites-enabled/000-default-le-ssl.conf:2)
  5. port 443 namevhost example.com (/etc/apache2/sites-enabled/000-default-le-ssl.conf:2)
  6. port 443 namevhost www.example.com (/etc/apache2/sites-enabled/default-ssl.conf:2)
  7. . . .

SSLポート443に関連付けられている行(この例では行3〜6)を見ると、これらのドメインの提供に関与している仮想ホストファイルを特定できます。 ここでは、000-default-le-ssl.confファイルとdefault-ssl.confファイルの両方が関係していることがわかります。したがって、これらの両方を編集する必要があります。 結果は異なる可能性があります。

  1. sudo nano /etc/apache2/sites-enabled/000-default-le-ssl.conf
  2. sudo nano /etc/apache2/sites-enabled/default-ssl.conf

開く必要のあるファイルに関係なく、手順は同じです。 VirtualHostタグ内のどこかに、次のように入力する必要があります。

<VirtualHost *:443>

	. . .

	JKMount /* ajp13_worker

	. . .

</VirtualHost>

ファイルを保存して閉じます。 編集する必要があると特定した他のファイルについて、上記のプロセスを繰り返します。

終了したら、次のように入力して構成を確認します。

  1. sudo apache2ctl configtest

出力にSyntax OKが含まれている場合は、ApacheWebサーバープロセスを再起動します。

  1. sudo systemctl restart apache2

これで、WebブラウザでサイトのSSLバージョンにアクセスして、Tomcatのインストールにアクセスできるようになります。

https://example.com

次に、以下のNginx構成をスキップして、構成を完了するためにTomcatへのアクセスを制限する方法の詳細を説明するセクションに進みます。

(オプション2)Nginxを使用したHTTPプロキシ

Apache WebサーバーよりもNginxを使用したい場合は、プロキシも簡単です。 NginxにはApacheJServプロトコルを話すためのモジュールはありませんが、堅牢なHTTPプロキシ機能を使用してTomcatと通信できます。

セクションの前提条件

Nginx接続をTomcatにプロキシする方法について説明する前に、Nginxをインストールして保護する必要があります。

Ubuntu16.04へのNginxのインストールに関するガイドに従ってNginxをインストールできます。

その後、サーバーでSSLを設定する必要があります。 これを行う方法は、ドメイン名を持っているかどうかによって異なります。

  • ドメイン名をお持ちの場合…サーバーを保護する最も簡単な方法は、無料の信頼できる証明書を提供するLet’sEncryptを使用することです。 これを設定するには、NginxのLet’sEncryptガイドに従ってください。
  • ドメインがない場合…この構成をテストまたは個人使用に使用している場合は、代わりに自己署名証明書を使用できます。 これは同じタイプの暗号化を提供しますが、ドメイン検証はありません。 セットアップするには、Nginxの自己署名SSLガイドに従ってください。

これらの手順が完了したら、以下に進んで、NginxWebサーバーをTomcatインストールに接続する方法を学習します。

ステップ1:Nginxサーバーのブロック構成を調整する

TomcatにプロキシするようにNginxを設定するのは非常に簡単です。

サイトに関連付けられているサーバーブロックファイルを開くことから始めます。 このガイドでは、デフォルトのサーバーブロックファイルを使用していることを前提としています。

  1. sudo nano /etc/nginx/sites-available/default

内部で、ファイルの先頭に向かって、upstreamブロックを追加する必要があります。 これにより、接続の詳細が概説され、NginxがTomcatサーバーがリッスンしている場所を認識できるようになります。 これを、ファイル内で定義されているserverブロックの外側に配置します。

/ etc / nginx / sites-available / default
upstream tomcat {
    server 127.0.0.1:8080 fail_timeout=0;
}

server {

	. . .

次に、ポート443用に定義されたserverブロック内で、location /ブロックを変更します。 定義したupstreamブロックにすべてのリクエストを直接渡します。 現在の内容をコメントアウトし、proxy_passディレクティブを使用して、定義したアップストリームの「tomcat」に渡します。

また、このブロック内にproxy_params構成を含める必要があります。 このファイルは、Nginxが接続をプロキシする方法の詳細の多くを定義します。

/ etc / nginx / sites-available / default
upstream tomcat {
    server 127.0.0.1:8080 fail_timeout=0;
}

server {
    . . .

    location / {
        #try_files $uri $uri/ =404;
        include proxy_params;
        proxy_pass http://tomcat/;
    }

    . . .
}

終了したら、ファイルを保存して閉じます。

ステップ2:Nginxをテストして再起動する

次に、構成の変更によって構文エラーが発生していないことを確認するためにテストします。

  1. sudo nginx -t

エラーが報告されていない場合は、Nginxを再起動して変更を実装します。

  1. sudo systemctl restart nginx

これで、WebブラウザでサイトのSSLバージョンにアクセスして、Tomcatのインストールにアクセスできるようになります。

https://example.com

Tomcatインストールへのアクセスを制限する

これで、TomcatインストールへのSSL暗号化アクセスが可能になりました。これで、Tomcatインストールをもう少しロックダウンできます。

Tomcatへのすべての要求をプロキシ経由で送信する必要があるため、ローカルループバックインターフェイスでの接続のみをリッスンするようにTomcatを構成できます。 これにより、外部の関係者がTomcatから直接要求を行うことができなくなります。

Tomcat構成ディレクトリ内のserver.xmlファイルを開いて、次の設定を変更します。

  1. sudo nano /opt/tomcat/conf/server.xml

このファイル内で、Connectorの定義を変更する必要があります。 現在、構成内で2つのコネクタが有効になっています。 1つはポート8080で通常のHTTP要求を処理し、もう1つはポート8009でApacheJServプロトコル要求を処理します。 構成は次のようになります。

/opt/tomcat/conf/server.xml
. . .

    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
. . .

    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

ローカルループバックインターフェイスへのアクセスを制限するには、これらの各コネクタ定義で127.0.0.1に設定された「アドレス」属性を追加する必要があります。 最終結果は次のようになります。

/opt/tomcat/conf/server.xml
. . .

    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               address="127.0.0.1"
               redirectPort="8443" />
. . .

    <Connector port="8009" address="127.0.0.1" protocol="AJP/1.3" redirectPort="8443" />

これらの2つの変更を行ったら、ファイルを保存して閉じます。

これらの変更を実装するには、Tomcatプロセスを再起動する必要があります。

  1. sudo systemctl restart tomcat

Tomcatインストールガイドに従っている場合は、インストールでufwファイアウォールが有効になっています。 Tomcatへのすべてのリクエストがローカルループバックインターフェイスに制限されたので、Tomcatへの外部リクエストを許可したルールをファイアウォールから削除できます。

  1. sudo ufw delete allow 8080

これで、Tomcatのインストールには、Webサーバープロキシを介してのみアクセスできるようになります。

結論

この時点で、Tomcatインスタンスへの接続は、Webサーバープロキシを使用してSSLで暗号化する必要があります。 別のWebサーバープロセスを構成すると、アプリケーションの提供に関連するソフトウェアが増える可能性がありますが、トラフィックを保護するプロセスが大幅に簡素化されます。