CentOS7でApacheまたはNginxを使用してTomcat8接続を暗号化する方法
序章
Apache Tomcatは、Javaアプリケーションを提供するように設計されたWebサーバーおよびサーブレットコンテナです。 実稼働エンタープライズ展開や小規模なアプリケーションのニーズで頻繁に使用されるTomcatは、柔軟性と強力性の両方を備えています。
このガイドでは、SSLを使用してCentOS7Tomcatのインストールを保護する方法について説明します。 デフォルトでは、インストール時に、入力されたパスワードや機密データを含め、Tomcatサーバーとクライアント間のすべての通信は暗号化されていません。 TomcatのインストールにSSLを組み込む方法はいくつかあります。 このガイドでは、SSL対応のプロキシサーバーをセットアップしてクライアントと安全にネゴシエートし、Tomcatにリクエストを渡す方法について説明します。
ApacheとNginxの両方でこれを設定する方法について説明します。
なぜリバースプロキシなのか?
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をサーバーにセットアップしておく必要があります。 このガイドでは、CentOS7インストールガイドのTomcat8の手順を使用してセットアップを行ったことを前提としています。
Tomcatを稼働させたら、以下の優先Webサーバーのセクションに進みます。 Apache は真下から始まりますが、Nginx構成は少し先にスキップすることで見つけることができます。
(オプション1)ApacheWebサーバーのmod_jk
を使用したプロキシ
Apache Webサーバーには、mod_jk
というモジュールがあり、Apacheの「JServ」プロトコルを使用してTomcatと直接通信できます。 このプロトコルのコネクタはTomcat内でデフォルトで有効になっているため、Tomcatはすでにこれらの要求を処理する準備ができています。
セクションの前提条件
Apache Webサーバー接続をTomcatにプロキシする方法について説明する前に、ApacheWebサーバーをインストールして保護する必要があります。
Apache Webサーバーをインストールするには、 CentOS7LAMPインストールガイドの手順1に従ってください。 MySQLまたはPHPをインストールしないでください。
その後、サーバーでSSLを設定する必要があります。 これを行う方法は、ドメイン名を持っているかどうかによって異なります。
- ドメイン名をお持ちの場合…サーバーを保護する最も簡単な方法は、無料の信頼できる証明書を提供するLet’sEncryptを使用することです。 これを設定するには、ApacheのLet’sEncryptガイドに従ってください。
- ドメインがない場合…この構成をテストまたは個人使用に使用している場合は、代わりに自己署名証明書を使用できます。 これは同じタイプの暗号化を提供しますが、ドメイン検証はありません。 セットアップするには、Apacheの自己署名SSLガイドに従ってください。
これらの手順が完了したら、以下に進んで、ApacheWebサーバーをTomcatインストールに接続する方法を学習します。
ステップ1:mod_jk
をコンパイルしてインストールします
Tomcat自体にはJServコネクタが付属していますが、CentOS 7パッケージリポジトリには、ApacheWebサーバーがそのプロトコルを使用して通信するために必要なmod_jk
モジュールは含まれていません。 この機能を追加するには、Tomcatプロジェクトのサイトからコネクタをダウンロードしてコンパイルする必要があります。
コネクタのソースコードをダウンロードする前に、CentOSリポジトリから必要なビルドとランタイムの依存関係をインストールする必要があります。 必要なApacheライブラリが利用できるように、GCCをインストールしてコネクタとApacheWebサーバー開発ファイルをコンパイルします。
- sudo yum install gcc httpd-devel
依存関係がインストールされたら、書き込み可能なディレクトリに移動し、コネクタのソースコードをダウンロードします。 最新バージョンは、Tomcatコネクタのダウンロードページにあります。 TomcatJKコネクタの最新のtar.gz
ソースに関連付けられているリンクをコピーし、curl
コマンドを使用してサーバーにダウンロードします。
- cd /tmp
- curl -LO http://mirrors.ibiblio.org/apache/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.48-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モジュールを構成する
モジュールがインストールされたので、Tomcatインスタンスとの通信に使用するようにApacheWebサーバーを構成できます。 これは、いくつかの構成ファイルを設定することで実行できます。
/etc/httpd/conf.d
ディレクトリ内のjk.conf
というファイルを開くことから始めます。
- sudo vi /etc/httpd/conf.d/jk.conf
内部では、mod_jk
モジュールをロードすることから始める必要があります。 その後、専用ログと共有メモリファイルを設定します。 最後に、JkWorkersFile
ディレクティブを使用して、ワーカー構成を指定するために作成するファイルをポイントします。
次の構成をファイルに貼り付けて、これらの部分をリンクします。 何も変更する必要はありません。
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
このファイル内で、ApacheJServプロトコルのバージョン13を使用してポート8009でTomcatインスタンスに接続する単一のワーカーを定義します。
worker.list=worker1
worker.worker1.type=ajp13
worker.worker1.host=127.0.0.1
worker.worker1.port=8009
終了したら、ファイルを保存して閉じます。
手順3:mod_jk
を使用してApache仮想ホストをプロキシに調整する
最後に、SSLが有効になっているApache仮想ホストファイルを調整する必要があります。 前提条件に従っている場合、これは現在、信頼できるSSL証明書または自己署名SSL証明書のいずれかを使用してコンテンツを保護するように構成されている必要があります。
次のように入力して、ファイルを今すぐ開きます。
- sudo vi /etc/httpd/conf.d/ssl.conf
内部のVirtualHost
構成ブロック内に、JkMount
ディレクティブを追加して、この仮想ホストが受信するすべてのトラフィックを、定義したワーカーインスタンスに渡します。 JkMount
は、VirtualHost
セクション内のどこにでも配置できます。
. . .
<VirtualHost _default_:443>
. . .
JkMount /* worker1
. . .
</VirtualHost>
終了したら、ファイルを保存して閉じます。
次に、次のように入力して構成を確認します。
- sudo apachectl configtest
出力にSyntax OK
が含まれている場合は、ApacheWebサーバープロセスを再起動します。
- sudo systemctl restart httpd
これで、WebブラウザでサイトのSSLバージョンにアクセスして、Tomcatのインストールにアクセスできるようになります。
https://example.com
次に、以下のNginx構成をスキップして、構成を完了するためにTomcatへのアクセスを制限する方法の詳細を説明するセクションに進みます。
(オプション2)Nginxを使用したHTTPプロキシ
Apache WebサーバーよりもNginxを使用したい場合は、プロキシも簡単です。 NginxにはApacheJServプロトコルを使用できるモジュールはありませんが、堅牢なHTTPプロキシ機能を使用してTomcatと通信できます。
セクションの前提条件
Nginx接続をTomcatにプロキシする方法について説明する前に、Nginxをインストールして保護する必要があります。
これを行う方法は、ドメイン名を持っているかどうかによって異なります。
- ドメイン名をお持ちの場合…サーバーを保護する最も簡単な方法は、無料の信頼できる証明書を提供するLet’sEncryptを使用することです。 Let’sEncryptガイドforNginxに従って、Nginxをセットアップし、Let’sEncryptで保護します。
- ドメインがない場合…この構成をテストまたは個人使用に使用している場合は、代わりに自己署名証明書を使用できます。 これは同じタイプの暗号化を提供しますが、ドメイン検証はありません。 Nginx の自己署名SSLガイドに従って、Nginxをインストールし、自己署名証明書を使用して構成します。
これらの手順が完了したら、以下に進んで、NginxWebサーバーをTomcatインストールに接続する方法を学習します。
ステップ1:Nginxサーバーのブロック構成を調整する
TomcatにプロキシするようにNginxを設定するのは非常に簡単です。
サイトに関連付けられているサーバーブロックファイルを開くことから始めます。 自己署名とLet’sEncryptSSLガイドはどちらも、/etc/httpd/conf.d/ssl.conf
ファイル内で暗号化されたサーバーブロックを構成するため、次のように使用します。
- sudo vi /etc/nginx/conf.d/ssl.conf
内部で、ファイルの先頭に向かって、upstream
ブロックを追加する必要があります。 これにより、接続の詳細が概説され、NginxがTomcatサーバーがリッスンしている場所を認識できるようになります。 これを、ファイル内で定義されているserver
ブロックの外側に配置します。
upstream tomcat {
server 127.0.0.1:8080 fail_timeout=0;
}
server {
. . .
次に、ポート443用に定義されたserver
ブロック内で、location /
ブロックを変更します。 定義したupstream
ブロックにすべてのリクエストを直接渡します。 既存のコンテンツをコメントアウトし、proxy_pass
ディレクティブを使用して、定義したアップストリームの「tomcat」に渡します。
また、Nginxがリクエストに関するTomcat情報を渡すことができるようにするいくつかのヘッダーを設定します。
upstream tomcat {
server 127.0.0.1:8080 fail_timeout=0;
}
server {
. . .
location / {
#try_files $uri $uri/ =404;
proxy_pass http://tomcat/;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
. . .
}
終了したら、ファイルを保存して閉じます。
ステップ2:Nginxをテストして再起動する
次に、構成の変更によって構文エラーが発生していないことを確認するためにテストします。
- sudo nginx -t
エラーが報告されていない場合は、Nginxを再起動して変更を実装します。
- sudo systemctl restart nginx
これで、WebブラウザでサイトのSSLバージョンにアクセスして、Tomcatのインストールにアクセスできるようになります。
https://example.com
Tomcatインストールへのアクセスを制限する
これで、TomcatインストールへのSSL暗号化アクセスが可能になりました。これで、Tomcatインストールをもう少しロックダウンできます。
Tomcatへのすべての要求をプロキシ経由で送信する必要があるため、ローカルループバックインターフェイスでの接続のみをリッスンするようにTomcatを構成できます。 これにより、外部の関係者がTomcatから直接要求を行うことができなくなります。
Tomcat構成ディレクトリ内のserver.xml
ファイルを開いて、次の設定を変更します。
- sudo vi /opt/tomcat/conf/server.xml
このファイル内で、Connectorの定義を変更する必要があります。 現在、構成内で2つのコネクタが有効になっています。 1つはポート8080で通常のHTTP要求を処理し、もう1つはポート8009でApacheJServプロトコル要求を処理します。 構成は次のようになります。
. . .
<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
に設定された「アドレス」属性を追加する必要があります。 最終結果は次のようになります。
. . .
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
address="127.0.0.1"
redirectPort="8443" />
. . .
<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="8009" address="127.0.0.1" protocol="AJP/1.3" redirectPort="8443" />
これらの2つの変更を行ったら、ファイルを保存して閉じます。
これらの変更を実装するには、Tomcatプロセスを再起動する必要があります。
- sudo systemctl restart tomcat
これで、Tomcatのインストールには、Webサーバープロキシを介してのみアクセスできるようになります。
結論
この時点で、Tomcatインスタンスへの接続は、Webサーバープロキシを使用してSSLで暗号化する必要があります。 別のWebサーバープロセスを構成すると、アプリケーションの提供に関連するソフトウェアが増える可能性がありますが、トラフィックを保護するプロセスが大幅に簡素化されます。