序章

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で接続を受け入れているため、次の場所ですべてのWebアプリケーションにアクセスできます。 http://your_servlet_ip どこからでも。 同様に、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/;
}
...

別の構成ブロックを追加して、host-managerアプリケーションに同じ制限を適用する必要があります。 manager に置き換えられます host-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を再起動したら、にアクセスします managerhost-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

追加 address="127.0.0.1" の中に Connector このような構成部分:

/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 これらのクラスのインスタンス化の値。 アプリケーションのクラスに必要なメモリ量がわからない場合は、 MaxPermSize の半分のサイズに Xmx 開始点として—この例では512MBです。

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

  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のログを監視する必要があります(/var/log/tomcat7/catalina.out)特にTomcatを再起動した後、またはデプロイメントを実行した後の問題。 ログを監視するには、 tail このようなコマンド:

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

初めての方 tail、キーの組み合わせを押す必要があります Ctrl-C キーボードでログのテーリングを停止します。

次のようなエラーを検索します OutOfMemoryError. このようなエラーは、JVM設定を調整し、より具体的には Xmx サイズ。

結論

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