序章

Tomcatは、JavaサーブレットおよびJavaServerPagesテクノロジーの一般的な実装です。 これは、人気のあるApacheオープンソースライセンスの下でApacheSoftwareFoundationによってリリースされています。 その強力な機能、有利なライセンス、および優れたコミュニティにより、Javaサーブレットは最高かつ最も好まれるものの1つになっています。

Tomcatは、ほとんどの場合、インストール後に追加の微調整が必要です。 この記事を読んで、Tomcatのインストールを最適化して安全かつ効率的に実行する方法を学習してください。

この記事は、Ubuntu 14.04でTomcatを実行するというテーマを継続しており、以前にApt-Getを介してUbuntu14.04にApacheTomcat7をインストールする方法を読んだことを前提としています。

前提条件

このガイドはUbuntu14.04でテストされています。 説明されているインストールと構成は、他のOSまたはOSバージョンでも同様ですが、コマンドと構成ファイルの場所が異なる場合があります。

このチュートリアルでは、次のものが必要になります。

このチュートリアルのすべてのコマンドは、root以外のユーザーとして実行する必要があります。 コマンドにrootアクセスが必要な場合は、その前にsudoが付きます。

標準のHTTPポートでリクエストを処理する

おそらくすでにお気づきかもしれませんが、TomcatはデフォルトでTCPポート8080でリッスンします。 このデフォルトのポートは主に、Tomcatが非特権ユーザーtomcat7の下で実行されるために発生します。 Linuxでは、特に設定されていない限り、rootなどの特権ユーザーのみが1024未満のポートでリッスンできます。 したがって、Tomcatのリスナーポートを80(HTTP)に単純に変更することはできません。

したがって、Tomcatのインストールを最適化する最初のタスクは、上記の問題を解決し、TomcatWebアプリケーションが標準のHTTPポートで使用可能であることを確認することです。

これを解決する最も簡単な方法(必ずしも最良の方法ではありません)は、ファイアウォール(iptables)を作成することです—TCPポート80からTCPポート8080に転送します。 これは、iptablesコマンドで実行できます。

  1. sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

このiptablesルールを永続的にするには、Iptables構成の保存の記事Ubuntu14.04でIPTablesを使用してファイアウォールを設定する方法を確認してください。

このiptablesルールを削除するには、ルールを追加するための-Aフラグを、上記のコマンドでルールを削除するための-Dフラグに置き換えるだけです。

  1. sudo iptables -t nat -D PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

このような単純なトラフィック転送は、セキュリティまたはパフォーマンスの観点から最適ではありません。 代わりに、Tomcatの前にNginxなどのWebサーバーを追加することをお勧めします。 この理由は、TomcatはWebサーバーの基本機能を備えた単なるJavaサーブレットであるのに対し、Nginxは典型的で強力な完全に機能するWebサーバーであるためです。 Nginxをフロントエンドサーバーとして使用することのいくつかの重要な利点は次のとおりです。

  • NginxはTomcatよりも安全であり、さまざまな攻撃から効率的に保護できます。 緊急のセキュリティ更新の場合、Tomcatのアップグレードに関連するダウンタイムや互換性の問題を心配するよりも、フロントエンドのNginx Webサーバーを更新する方がはるかに簡単、高速、安全です。
  • Nginxは、静的コンテンツ、キャッシング、SSLのサポートを強化し、HTTPおよびHTTPSトラフィックをより効率的に処理します。
  • Nginxは、80や443を含む任意のポートでリッスンするように簡単に構成できます。

上記の利点を確信している場合は、最初に以前のiptablesルールを削除したことを確認してから、次のコマンドを使用してNginxをインストールします。

  1. sudo apt-get install nginx

その後、次のようなお気に入りのエディターを使用して、Nginxのデフォルトのサーバーブロック構成(/etc/nginx/sites-enabled/default)を編集します。

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

location /の部分を探します。これは、すべてのリクエストの処理方法を指定し、次のようになっていることを確認します。

/ etc / nginx / sites-enabled / default
location / {
	proxy_pass http://127.0.0.1:8080/;
}

上記のproxy_passディレクティブは、TomcatがリッスンするTCPポート8080のローカルIP127.0.0.1にすべての要求を転送する必要があることを意味します。 ファイルを閉じ、次のコマンドでNginxを再起動します。

  1. sudo service nginx restart

その後、ブラウザの標準HTTPポートでDropletのIPに接続してTomcatにアクセスしてみてください。 URLはhttp://your_droplet's_ipのようになります。 すべてが正常に機能する場合は、Tomcatのデフォルトページを開く必要があります。 そうでない場合は、iptablesルールを削除し、この記事の前提条件に従ってTomcatが正しくインストールされていることを確認してください。

Tomcatの保護

Tomcatの保護は、おそらく最も重要なタスクであり、しばしば無視されます。 幸いなことに、ほんの数ステップで、かなり安全なTomcatセットアップを行うことができます。 記事のこの部分に従うには、前述のように、Tomcatの前にNginxをインストールして構成する必要があります。

管理Webアプリケーションの削除

機能とセキュリティの間の通常のトレードオフは、Tomcatにも当てはまります。 セキュリティを強化するために、デフォルトのWebマネージャーおよびホストマネージャーアプリケーションを削除できます。 これは、Webアプリケーションの展開を含むすべての管理をコマンドラインから実行する必要があるため、不便です。

TomcatのWeb管理ツールを削除すると、誰かがそれらを悪用する可能性があることを心配する必要がないため、セキュリティに役立ちます。 この優れたセキュリティ慣行は、一般的に本番サイトに適用されます。

管理Webアプリケーションは、Ubuntuのパッケージtomcat7-adminに含まれています。 したがって、それらを削除するには、次のコマンドを実行します。

  1. sudo apt-get remove tomcat7-admin

管理Webアプリケーションへのアクセスを制限する

前の部分で推奨されているように、管理Webアプリケーションを削除していない場合は、少なくともそれらへのアクセスを制限できます。 それらのURLはhttp://your_servlet_ip/manager/およびhttp://your_servlet_ip/host-manager/である必要があります。 これらのURLで404Not Found エラーが表示された場合は、それらがすでに削除されていることを意味し、何もする必要はありません。 それでも、次の手順を読んで、保護したい他の機密リソースを処理する方法を学ぶことができます。

この時点で、Nginxはポート80で接続を受け入れているため、どこからでもhttp://your_servlet_ipのすべてのWebアプリケーションにアクセスできます。 同様に、Tomcatはポート8080でグローバルにリッスンします。 http://your_servlet_ip:8080、同じアプリケーションを見つけることができます。 セキュリティを向上させるために、Nginxを介してポート80で利用可能なリソースを制限します。 また、Tomcatとその公開ポート8080をサーバーとNginxでローカルにのみ使用できるようにします。

デフォルトのサーバーブロック構成ファイル/etc/nginx/sites-enabled/defaultを開きます。

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

server_nameディレクティブの後、デフォルトのルートの場所(location /)の上に、以下を追加し、your_local_ipをローカルコンピューターのIPアドレスに置き換えます。

/ etc / nginx / sites-enabled / default
...
location /manager/ {
	allow your_local_ip;
	deny all;
	proxy_pass http://127.0.0.1:8080/manager/;
}
...

このようにmanagerhost-managerに置き換えられた別の構成ブロックを追加して、ホストマネージャーアプリケーションに同じ制限を適用する必要があります(ここでも、your_local_ipをローカルIPに置き換えます)住所):

/ etc / nginx / sites-enabled / default
...
location /host-manager/ {
	allow your_local_ip;
	deny all;
	proxy_pass http://127.0.0.1:8080/host-manager/;
}
...

Nginxを再起動すると、managerおよびhost-manager Webコンテキストへのアクセスは、ローカルIPアドレスのみに制限されます。

  1. sudo service nginx restart

ブラウザでhttp://your_servlet_ip/manager/http://your_servlet_ip/host-manager/を開いてテストできます。 アプリケーションは利用可能である必要がありますが、パブリックプロキシまたは別のコンピューターを使用して同じURLにアクセスしようとすると、403Forbiddenエラーが表示されます。

さらに、追加の手段として、次のコマンドを使用してTomcatのドキュメントと例を削除することもできます。

  1. sudo apt-get remove tomcat7-docs tomcat7-examples

Tomcatは引き続きTCPポート8080で外部接続をリッスンすることに注意してください。 したがって、Nginxとそのセキュリティ対策は簡単に回避できます。 この問題を解決するには、ローカルインターフェイス127.0.0.1でのみリッスンするようにTomcatを設定します。 この目的のために、お気に入りのエディタでファイル/etc/tomcat7/server.xmlを開きます。

  1. sudo nano /etc/tomcat7/server.xml

次のように、Connector構成部分にaddress="127.0.0.1"を追加します。

/etc/tomcat7/server.xml
...
<Connector address="127.0.0.1" port="8080" protocol="HTTP/1.1"
	connectionTimeout="20000"
    URIEncoding="UTF-8"
    redirectPort="8443" />
...

その後、Tomcatを再起動して、新しい設定を有効にします。

  1. sudo service tomcat7 restart

上記の手順に従うことで、Tomcatの優れた基本レベルのセキュリティを確保できます。

JVM設定の微調整

当然、ユニバーサルJava仮想マシン(JVM)の微調整の原則はTomcatにも適用できます。 JVMチューニングはそれ自体が科学的なものですが、誰でも簡単に適用できる基本的な優れたプラクティスがいくつかあります。

  • 最大ヒープサイズXmxは、Tomcatが使用できる最大メモリです。 これは、Droplet自体およびDropletで使用できるその他のサービスを実行するのに十分な空きメモリを残す値に設定する必要があります。 たとえば、Dropletに2 GBのRAMがある場合、1GBのRAMをxmxに割り当てても安全な場合があります。 ただし、Tomcatが実際に使用するメモリは、Xmxのサイズよりも少し大きくなることに注意してください。
  • 最小ヒープサイズXmsは、起動時に割り当てられるメモリの量です。 ほとんどの場合、xmx値と同じである必要があります。 したがって、割り当てられたメモリのサイズは常に一定であるため、コストのかかるメモリ割り当てプロセスを実行する必要がなくなります。
  • クラスが永続的に保存されるメモリMaxPermSizeにより、Tomcatはアプリケーションのクラスをロードし、これらのクラスのインスタンス化のためにXmx値からスペアメモリを残すことができます。 アプリケーションのクラスに必要なメモリ量がわからない場合は、MaxPermSizeXmxの半分のサイズ(この例では512 MB)に設定できます。

Ubuntu 14.04では、ファイル/etc/default/tomcat7を編集して、TomcatのJVMオプションをカスタマイズできます。 したがって、上記のヒントを適用するには、お気に入りのエディタでこのファイルを開いてください。

  1. sudo nano /etc/default/tomcat7

前提条件からTomcatのインストール手順に従った場合は、次の行が見つかります。

/ etc / default / tomcat7
...
JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom -Djava.awt.headless=true -Xmx512m -XX:MaxPermSize=256m -XX:+UseConcMarkSweepGC"
...

ドロップレットに2GBのRAMがあり、Tomcatに約1 GBを割り当てたい場合は、この行を次のように変更する必要があります。

/ etc / default / tomcat7
...
JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom -Djava.awt.headless=true -Xms1024m -Xmx1024m -XX:MaxPermSize=512m -XX:+UseConcMarkSweepGC"
...

この設定を有効にするには、Tomcatを再起動する必要があります。

  1. sudo service tomcat7 restart

上記のJVM構成は良いスタートですが、特にTomcatを再起動した後、またはデプロイメントを行った後は、Tomcatのログ(/var/log/tomcat7/catalina.out)で問題がないか監視する必要があります。 ログを監視するには、次のようにtailコマンドを使用します。

  1. sudo tail -f /var/log/tomcat7/catalina.out

tailを初めて使用する場合は、キーボードのキーの組み合わせCtrl-Cを押して、ログの末尾を停止する必要があります。

OutOfMemoryErrorのようなエラーを検索します。 このようなエラーは、JVM設定を調整し、より具体的にはXmxサイズを増やす必要があることを示します。

結論

それでおしまい! これで、簡単な手順でTomcatを保護および最適化できました。 これらの基本的な最適化は、本番環境だけでなく、インターネットに公開されているテストおよび開発環境にも推奨されます。