前書き
Apache Tomcatは、Javaアプリケーションを提供するために設計されたWebサーバーおよびサーブレットコンテナーです。 実稼働環境での展開や小規模なアプリケーションのニーズによく使用されるTomcatは、柔軟で強力です。
このガイドでは、Ubuntu 16.04 TomcatインストールをSSLで保護する方法について説明します。 デフォルトでは、インストール時に、入力されたパスワードや機密データなど、Tomcatサーバーとクライアント間のすべての通信は暗号化されません。 TomcatのインストールにSSLを組み込む方法はいくつかあります。 このガイドでは、SSL対応のプロキシサーバーを設定してクライアントと安全にネゴシエートし、リクエストをTomcatに渡す方法について説明します。
-
Apache と Nginx *の両方でこれを設定する方法を説明します。
なぜ逆プロキシなのか?
Tomcatインストール用にSSLをセットアップする方法はいくつかありますが、それぞれにトレードオフのセットがあります。 Tomcatに接続をネイティブに暗号化する機能があることを知った後、リバースプロキシソリューションについて説明するのは奇妙に思えるかもしれません。
Tomcatを使用したSSLには、管理が困難になる多くの欠点があります。
-
* Tomcatは、非特権ユーザーで推奨されるように実行された場合、従来のSSLポート443のような制限されたポートにバインドできません*:回避策があります。ファイアウォールなどでポート転送を設定しますが、それでも追加の複雑さを表しています。
-
* TomcatでのSSLは、他のソフトウェアではそれほど広くサポートされていません*:Let’s Encryptのようなプロジェクトは、Tomcatと対話するネイティブな方法を提供しません。 さらに、Javaキーストア形式では、使用前に従来の証明書を変換する必要があるため、自動化が複雑になります。
-
従来のWebサーバーはTomcatよりも頻繁にリリースされます:これは、アプリケーションに重大なセキュリティ上の影響を与える可能性があります。 たとえば、サポートされているTomcat SSL暗号スイートはすぐに古くなる可能性があり、アプリケーションの保護が最適ではなくなります。 セキュリティアップデートが必要な場合は、TomcatをインストールするよりもWebサーバーを更新する方が簡単です。
リバースプロキシソリューションは、Tomcatインストールの前に強力なWebサーバーを配置するだけで、これらの問題の多くを回避します。 Webサーバーは、SSLを使用してクライアント要求を処理できます。SSLは、処理するように特別に設計された機能です。 その後、通常の非特権構成で実行されているTomcatにリクエストをプロキシできます。
この懸念の分離は、追加のソフトウェアを実行することを意味する場合でも、構成を簡素化します。
前提条件
このガイドを完了するには、サーバーにTomcatが既にセットアップされている必要があります。 このガイドでは、https://www.digitalocean.com/community/tutorials/how-to-install-apache-tomcat-8-on-ubuntu-16-04 [Ubuntu 16.04のTomcat 8]の手順を使用したことを前提としています。インストールガイド]を設定します。
Tomcatを起動して実行したら、希望するWebサーバーのセクションに進んでください。 * Apache はすぐ下から始まりますが、 Nginx *の設定は少し先にスキップして見つけることができます。
(オプション1)Apache Webサーバー `+ mod_jk`を使用したプロキシ
Apache Webサーバーには、Apache JServプロトコルを使用してTomcatと直接通信できる「+ mod_jk +」というモジュールがあります。 このプロトコルのコネクタはデフォルトでTomcat内で有効になっているため、Tomcatはこれらのリクエストを処理する準備がすでに整っています。
セクションの前提条件
Apache Webサーバー接続をTomcatにプロキシする方法を説明する前に、Apache Webサーバーをインストールして保護する必要があります。
https://www.digitalocean.com/community/tutorials/how-to-install-linux-apache-mysql-php-lamp-stack-on-ubuntu-16-のステップ1に従ってApache Webサーバーをインストールできます。 04 [このガイド]。 MySQLまたはPHPをインストールしないでください。
その後、サーバーでSSLをセットアップする必要があります。 これを行う方法は、ドメイン名を持っているかどうかによって異なります。
-
*ドメイン名を持っている場合…*サーバーを保護する最も簡単な方法は、無料の信頼できる証明書を提供するLet’s Encryptを使用することです。 Apacheの暗号化ガイドに従って設定してください。 。
-
*ドメインがない場合…*この構成をテストまたは個人的な使用のために使用している場合は、代わりに自己署名証明書を使用できます。 これにより、同じタイプの暗号化が提供されますが、ドメイン検証は行われません。 https://www.digitalocean.com/community/tutorials/how-to-create-a-self-signed-ssl-certificate-for-apache-in-ubuntu-16-04 [自己署名SSLガイドApache]をセットアップします。
これらの手順を完了したら、以下に進み、Apache WebサーバーをTomcatインストールに接続する方法を学習します。
ステップ1: `+ mod_jk +`のインストールと設定
最初に、 `+ mod_jk +`モジュールをインストールする必要があります。 Apache Webサーバーはこれを使用して、Apache JServプロトコルを使用してTomcatと通信します。
Ubuntuのデフォルトリポジトリから `+ mod_jk`をインストールできます。 次を入力して、ローカルパッケージインデックスを更新し、インストールします。
sudo apt-get update
sudo apt-get install libapache2-mod-jk
モジュールはインストール時に自動的に有効になります。
次に、モジュールを構成する必要があります。 メインの設定ファイルは `+ / etc / libapache2-mod-jk / workers.properties +`にあります。 テキストエディタでこのファイルを開きます。
sudo nano /etc/libapache2-mod-jk/workers.properties
内部で、 `+ workers.tomcat_home `ディレクティブを見つけます。 これをTomcatインストールホームディレクトリに設定します。 Tomcatのインストールでは、それは ` / opt / tomcat`になります:
/etc/libapache2-mod-jk/workers.properties
workers.tomcat_home=
完了したら、ファイルを保存して閉じます。
ステップ2:Apache仮想ホストを `+ mod_jk +`でプロキシに調整する
次に、TomcatインストールへのリクエストをプロキシするようにApache仮想ホストを調整する必要があります。
開く仮想ホストファイルは、SSLのセットアップに使用した方法によって異なります。
上記にリンクされているガイドを使用して自己署名SSL証明書を設定する場合、 `+ default-ssl.conf +`ファイルを開きます:
sudo nano /etc/apache2/sites-available/default-ssl.conf
Let’s EncryptでSSLを設定した場合、ファイルの場所は、証明書プロセス中に選択したオプションによって異なります。 次のように入力して、SSL要求の処理に関係する仮想ホストを見つけることができます。
sudo apache2ctl -S
出力はおそらく次のようなもので始まります。
OutputVirtualHost configuration:
*:80 (/etc/apache2/sites-enabled/000-default.conf:1)
*:443 is a NameVirtualHost
default server (/etc/apache2/sites-enabled/000-default-le-ssl.conf:2)
port 443 namevhost (/etc/apache2/sites-enabled/000-default-le-ssl.conf:2)
port 443 namevhost www. (/etc/apache2/sites-enabled/default-ssl.conf:2)
. . .
SSLポート443に関連付けられている行(この例では行3〜6)を見ると、これらのドメインの提供にどの仮想ホストファイルが関係しているかを判断できます。 ここでは、 `+ 000-default-le-ssl.conf `ファイルと ` default-ssl.conf +`ファイルの両方が関係していることがわかります。したがって、これらの両方を編集する必要があります。 結果は異なる可能性があります。
sudo nano /etc/apache2/sites-enabled/000-default-le-ssl.conf
sudo nano /etc/apache2/sites-enabled/default-ssl.conf
どのファイルを開く必要があるかに関係なく、手順は同じです。 `+ VirtualHost +`タグ内のどこかに、次を入力する必要があります。
<VirtualHost *:443>
. . .
. . .
</VirtualHost>
ファイルを保存して閉じます。 編集する必要があると特定した他のファイルについて、上記のプロセスを繰り返します。
終了したら、次を入力して構成を確認します。
sudo apache2ctl configtest
出力に「+ Syntax OK +」が含まれている場合、Apache Webサーバープロセスを再起動します。
sudo systemctl restart apache2
これで、WebブラウザでサイトのSSLバージョンにアクセスして、Tomcatのインストールにアクセスできるはずです。
https://
次に、以下のNginx設定をスキップして、設定を完了するためにTomcatへのアクセスを制限する方法を詳述するセクションに進みます。
(オプション2)Nginxを使用したHTTPプロキシ
プロキシは、Apache Webサーバーよりも望ましい場合、Nginxを使用しても簡単です。 NginxにはApache JServプロトコルと通信できるモジュールはありませんが、堅牢なHTTPプロキシ機能を使用してTomcatと通信できます。
セクションの前提条件
TomcatへのNginx接続をプロキシする方法について説明する前に、Nginxをインストールして保護する必要があります。
Ubuntu 16.04でのNginxのインストールに関するガイドに従ってNginxをインストールできます。
その後、サーバーでSSLをセットアップする必要があります。 これを行う方法は、ドメイン名を持っているかどうかによって異なります。
-
*ドメイン名を持っている場合…*サーバーを保護する最も簡単な方法は、無料の信頼できる証明書を提供するLet’s Encryptを使用することです。 Nginxの暗号化ガイドに従って設定してください。 。
-
*ドメインがない場合…*この構成をテストまたは個人的な使用のために使用している場合は、代わりに自己署名証明書を使用できます。 これにより、同じタイプの暗号化が提供されますが、ドメイン検証は行われません。 https://www.digitalocean.com/community/tutorials/how-to-create-a-self-signed-ssl-certificate-for-nginx-in-ubuntu-16-04 [自己署名SSLガイドNginx]をセットアップします。
これらの手順が完了したら、以下に進み、Nginx WebサーバーをTomcatインストールに接続する方法を学習します。
ステップ1:Nginxサーバーブロック構成の調整
TomcatにプロキシするようにNginxを設定するのは非常に簡単です。
まず、サイトに関連付けられているサーバーブロックファイルを開きます。 このガイドでは、デフォルトのサーバーブロックファイルを使用していると仮定します。
sudo nano /etc/nginx/sites-available/default
内部では、ファイルの上部に向かって、 `+ upstream `ブロックを追加する必要があります。 これにより、Tomcatサーバーがリッスンしている場所をNginxが把握できるように、接続の詳細が概説されます。 これをファイル内で定義された「 server +」ブロックの外側に配置します。
/ etc / nginx / sites-available / default
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;
}
. . .
}
終了したら、ファイルを保存して閉じます。
ステップ2:Nginxをテストして再起動する
次に、構成の変更によって構文エラーが発生していないことを確認するためにテストします。
sudo nginx -t
エラーが報告されていない場合は、Nginxを再起動して変更を実装します。
sudo systemctl restart nginx
これで、WebブラウザでサイトのSSLバージョンにアクセスして、Tomcatのインストールにアクセスできるはずです。
https://
Tomcatインストールへのアクセスを制限する
これで、TomcatインストールへのSSL暗号化アクセスができました。Tomcatインストールをもう少しロックダウンできます。
Tomcatへのすべてのリクエストがプロキシを経由するようにするため、ローカルループバックインターフェイスでの接続のみをリッスンするようにTomcatを構成できます。 これにより、外部の関係者がTomcatから直接リクエストを試みることができなくなります。
これらの設定を変更するには、Tomcat設定ディレクトリ内の `+ server.xml +`ファイルを開きます。
sudo nano /opt/tomcat/conf/server.xml
このファイル内で、* Connector *定義を変更する必要があります。 現在、構成内で2つのコネクタが有効になっています。 1つはポート8080で通常のHTTP要求を処理し、もう1つはポート8009でApache JServプロトコル要求を処理します。 設定は次のようになります。
/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」に設定された「address」属性を追加するだけです。 最終結果は次のようになります。
/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" />
これらの2つの変更を行った後、ファイルを保存して閉じます。
これらの変更を実装するには、Tomcatプロセスを再起動する必要があります。
sudo systemctl restart tomcat
Tomcatのインストールガイドに従っている場合、インストールで「+ ufw +」ファイアウォールが有効になっています。 Tomcatへのすべてのリクエストはローカルループバックインターフェイスに制限されているため、Tomcatへの外部リクエストを許可するルールをファイアウォールから削除できます。
sudo ufw delete allow 8080
Tomcatインストールは、Webサーバープロキシを介してのみアクセスできるようになります。
結論
この時点で、Tomcatインスタンスへの接続は、Webサーバープロキシを使用してSSLで暗号化する必要があります。 個別のWebサーバープロセスを構成すると、アプリケーションの提供に関連するソフトウェアが増加する可能性がありますが、トラフィックを大幅に保護するプロセスが簡素化されます。