CentOS 7でApacheまたはNginxを使用してTomcat 8接続を暗号化する方法

前書き

Apache Tomcatは、Javaアプリケーションを提供するために設計されたWebサーバーおよびサーブレットコンテナーです。 実稼働環境での展開や小規模なアプリケーションのニーズによく使用されるTomcatは、柔軟で強力です。

このガイドでは、CentOS 7 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-centos-7 [Tomcat 8 on CentOS 7インストールガイドの指示を使用したことを前提としています。 ]を設定します。

Tomcatを起動して実行したら、希望するWebサーバーのセクションに進んでください。 * Apache はすぐ下から始まりますが、 Nginx *の設定は少し先にスキップして見つけることができます。

(オプション1)Apache Webサーバー `+ mod_jk`を使用したプロキシ

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

セクションの前提条件

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

Apache Webサーバーをインストールするには、https://www.digitalocean.com/community/tutorials/how-to-install-linux-apache-mysql-php-lamp-stack-on-centos-7 [ CentOS 7 LAMPインストールガイド]。 MySQLまたはPHPをインストールしないでください。

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

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

ステップ1: `+ mod_jk +`をコンパイルしてインストールする

Tomcat自体にはJServコネクタが付属していますが、CentOS 7パッケージリポジトリには、Apache Webサーバーがそのプロトコルを使用して通信するために必要な `+ mod_jk +`モジュールが含まれていません。 この機能を追加するには、Tomcatプロジェクトのサイトからコネクタをダウンロードしてコンパイルする必要があります。

コネクタのソースコードをダウンロードする前に、CentOSリポジトリから必要なビルドとランタイムの依存関係をインストールする必要があります。 必要なApacheライブラリが利用できるように、GCCをインストールしてコネクタとApache Webサーバー開発ファイルをコンパイルします。

sudo yum install gcc httpd-devel

依存関係がインストールされたら、書き込み可能なディレクトリに移動して、コネクタのソースコードをダウンロードします。 最新バージョンは、https://tomcat.apache.org/download-connectors.cgi [Tomcatコネクタダウンロードページ]にあります。 Tomcat JKコネクターの最新の `+ tar.gz `ソースに関連付けられたリンクをコピーし、 ` curl +`コマンドを使用してサーバーにダウンロードします。

cd /tmp
curl -LO http://mirrors.ibiblio.org/apache/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.42-src.tar.gz

次に、現在のディレクトリにtarballを抽出し、抽出されたファイル階層内のソースコードとビルドスクリプトが置かれている `+ native +`サブディレクトリに移動します。

tar xzvf tomcat-connectors*
cd tomcat-connectors*/native

これで、ソフトウェアを構成する準備が整いました。 サーバーのソースを正常に設定するには、 + apxs Apache拡張ツールバイナリの場所を設定する必要があります。 その後、 `+ make +`を使用してソフトウェアをビルドし、コンパイルされたモジュールをインストールできます。

./configure --with-apxs=/usr/bin/apxs
make
sudo make install

これにより、 `+ mod_jk +`モジュールがApacheモジュールディレクトリにインストールされます。

ステップ2:mod_jkモジュールを構成する

モジュールがインストールされたので、Apache Webサーバーを設定して、Tomcatインスタンスとの通信に使用できます。 これは、いくつかの構成ファイルをセットアップすることで実行できます。

`+ / etc / httpd / conf.d `ディレクトリ内の ` jk.conf +`というファイルを開くことから始めます:

sudo vi /etc/httpd/conf.d/jk.conf

内部では、 `+ mod_jk `モジュールをロードすることから始めます。 その後、専用のログと共有メモリファイルを構成します。 最後に、作成するファイルを指すために ` JkWorkersFile +`ディレクティブを使用して、ワーカー構成を指定します。

これらの部分をリンクするには、次の構成をファイルに貼り付けます。 何も変更する必要はありません:

/etc/httpd/conf.d/jk.conf

LoadModule jk_module modules/mod_jk.so

JkLogFile logs/mod_jk.log
JkLogLevel info
JkShmFile logs/mod_jk.shm

JkWorkersFile conf/workers.properties

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

次に、ワーカープロパティファイルを作成します。 これを使用して、Tomcatバックエンドに接続するワーカーを定義します。

sudo vi /etc/httpd/conf/workers.properties

このファイル内で、Apache JServプロトコルのバージョン13を使用してポート8009でTomcatインスタンスに接続する単一のワーカーを定義します。

/etc/httpd/conf/workers.properties

worker.list=worker1
worker.worker1.type=ajp13
worker.worker1.host=127.0.0.1
worker.worker1.port=8009

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

ステップ3:Apache仮想ホストを `+ mod_jk +`でプロキシに調整する

最後に、SSLが有効になっているApache仮想ホストファイルを調整する必要があります。 前提条件に従った場合、信頼済みまたは自己署名SSL証明書を使用してコンテンツを保護するように現在構成する必要があります。

次のように入力して、ファイルを開きます。

sudo vi /etc/httpd/conf.d/ssl.conf

内部で、 `+ VirtualHost `設定ブロック内で、 ` JkMount `ディレクティブを追加して、この仮想ホストが受信したすべてのトラフィックを先ほど定義したワーカーインスタンスに渡します。 ` JkMount `は ` VirtualHost +`セクション内のどこにでも配置できます:

/etc/httpd/conf.d/ssl.conf

. . .

<VirtualHost _default_:443>

. . .
JkMount /* worker1
. . .

</VirtualHost>

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

次に、次を入力して構成を確認します。

sudo apachectl configtest

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

sudo systemctl restart httpd

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

https://

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

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

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

セクションの前提条件

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

これを行う方法は、ドメイン名を持っているかどうかによって異なります。

  • *ドメイン名を持っている場合…*サーバーを保護する最も簡単な方法は、無料の信頼できる証明書を提供するLet’s Encryptを使用することです。 Nginxの暗号化ガイドに従って、Nginxをセットアップし、セキュリティで保護してくださいLet’s Encryptを使用します。

  • *ドメインがない場合…*この構成をテストまたは個人的な使用のために使用している場合は、代わりに自己署名証明書を使用できます。 これにより、同じタイプの暗号化が提供されますが、ドメイン検証は行われません。 Nginxの自己署名SSLガイドに従ってくださいNginxをインストールし、自己署名証明書で構成します。

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

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

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

まず、サイトに関連付けられているサーバーブロックファイルを開きます。 自己署名SSLガイドとLet’s Encrypt SSLガイドの両方が、 `+ / etc / httpd / conf.d / ssl.conf +`ファイル内の暗号化されたサーバーブロックを構成するため、それを使用します。

sudo vi /etc/nginx/conf.d/ssl.conf

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

/ etc / nginx / sites-available / default

server {

   . . .

次に、ポート443に対して定義された `+ server `ブロック内で、 ` location / `ブロックを変更します。 すべてのリクエストを、先ほど定義した ` upstream `ブロックに直接渡したいです。 既存の内容をコメントアウトし、 ` proxy_pass +`ディレクティブを使用して、先ほど定義した“ tomcat”アップストリームに渡します。

また、Nginxがリクエストに関するTomcat情報を渡すことができるヘッダーを設定します。

/ 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 vi /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" />
. . .

   <!-- Define an AJP 1.3 Connector on port 8009 -->
   <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" />
. . .

   <!-- Define an AJP 1.3 Connector on port 8009 -->
   <Connector port="8009"  protocol="AJP/1.3" redirectPort="8443" />

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

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

sudo systemctl restart tomcat

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

結論

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

前の投稿:Debian 9にMosquitto MQTT Messaging Brokerをインストールして保護する方法
次の投稿:Ubuntu 14.04でRancherを使用してNode.jsおよびMongoDBアプリケーションをデプロイする方法