Tomcatはどこまで“安全”にできるのか?(4)

Tomcatのセキュリティとリスクの基本
分かってる?


株式会社アメニクス
x-lab チーム
2008/1/28


Tomcatにありがちなセキュリティリスクの改善

 この連載の第1回に沿ってインストールしていない初期状態のままのTomcatではいくつかのセキュリティリスクが残っている場合があります。今回、連載第1回どおりにインストールしていない人は次の点を確認していきましょう(連載第1回どおりにインストールしている人は設定する必要は一切ありません)。

初期状態で気付きにくいセキュリティ・ホールとその対応


Tomcatがrootで実行されている

 root権限で公開アプリケーションを実行していると、アプリケーションにバッファオーバーフローが存在した場合、その権限で任意のアプリケーションを実行されてしまう恐れがあります。しかし、通常のTomcatは$CATALINA_HOME/bin/startup.shで起動して利用するように設計されており、root権限で実行するようになっています。

 このような場合、Linuxに実装されているsurunuserのコマンドを用いて別のユーザーから起動する方法があります。別のユーザーから実行するには、まずはtomcatユーザーを作成します。

useradd -d /opt/tomcat6 -s /bin/sh tomcat

 このユーザーの環境変数に「JAVA_HOME」を追加する必要があるので、viエディタで/opt/tomcat6/.bash_profileを開いて編集します。

# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi

# User specific environment and startup programs

JAVA_HOME=/usr/java/jdk1.5.0_12

PATH=$PATH:$HOME/bin:$JAVA_HOME/bin

export PATH JAVA_HOME

 編集が完了したら、tomcatユーザーで読み書きできるように変更します。

chown -R tomcat. /opt/tomcat6

 以上で、準備は完了です。それでは、以下のコマンドのどちらかを実行してTomcatを起動してみましょう。

su -l tomcat -c "/opt/tomcat6/bin/startup.sh"

runuser -l tomcat -c "/opt/tomcat6/bin/startup.sh"

 無事に起動するようになると思いますが、この場合にはtomcatユーザーでログインできる環境を用意することになります。このことで、セキュリティリスクが高まる恐れがあるために、この対応は推奨されません

 tomcatユーザーで起動するのであれば、すでにデーモン化ツールがTomcatに同梱されているので、前述のように連載第1回を読みながらjvscを利用して起動スクリプトからtomcatユーザーで実行する方法を取りましょう。

Tomcatの8005番ポート(シャットダウンポート)が起動している

 デフォルトのTomcatの設定では、Tomcatのシャットダウンに利用する8005番ポートが起動しています。このポートにデフォルトの場合はtelnetで接続して「SHUTDOWN」と文字列を打ち込むことでTomcatを停止できるようになっています。

 アプリケーションにアクセスされることで遠隔シャットダウンをさせない対策として以下の2つの方法が簡単に思い付きます。

  1. シャットダウンポート番号を変える
  2. シャットダウン文字列を変える

 これらは、server.xmlの以下の部分を変更することで対応可能です。

<Server port="8005" shutdown="SHUTDOWN">

 しかし、これでは総当たりで検索/攻撃されたときにはいずれ見つかってしまう可能性があります。このため、別の方法を実施する必要が通常あります。このような場合にはこれら以外の方法として以下のような対策が思い付きます。

  1. シャットダウンポートへのアクセスを制限する
  2. シャットダウンポート自体を利用させなくする

 ほかのユーザーがシャットダウンポートへ到達できないようにするのであれば8005番ポートへの接続を禁止すればよいだけなので、ファイアウォール機器を調整したりLinuxの標準的なパケットフィルタリングiptablesを用いたりしてシャットダウンポートへのアクセスを制限できます(ここでは、iptablesのインストールについては省略します)。

編集部注パケットフィルタiptablesについて詳しく知りたい読者は、連載「ゼロから始めるLinuxセキュリティ」や連載「習うより慣れろ! iptablesテンプレート集」をご参照ください。

 iptablesを使う場合には、以下のようなシャットダウンポートへの新規接続を禁止するルールを追加することで対応できるでしょう。

iptables -A INPUT -p tcp -m state --state NEW --dport 8005 -j DROP

 ただし、この場合でも完ぺきとはいい切れません。ファイアウォールの設定ミスやiptablesのバグによりこの壁が破られることが考えられます。結局は起動すらしないことが一番確実といえる対策なので、このような場合でもシャットダウンポートを起動しないようにしてくれるjvscを利用することをお勧めします。

 このように、jvscを用いてデーモン化することはTomcatの管理を容易化するためだけではなく、セキュリティ面の強化に大いに役立ちますので、ぜひお試しください。

忘れがちな設定のセキュリティリスク

 連載第2回で紹介した管理マネージャは非常に便利な機能ですが、ユーザーを作成するだけ作成して放置してしまいがちです。このままだと、インターネットを経由してほかのユーザーからも自由にアクセスできるようになってしまいます。これでは、いつ何が起きるか分からないので、アクセスできるユーザーを制限するようにしましょう。

 アクセスの制限はコンテキスト別に行うようにします。まずは、コンテキスト別のContext.xmlを作成するために/opt/tomcat6/confのディレクトリに[Engine名]/[Host名]のディレクトリを作成します。

mkdir -p Catalina/localhost

 ディレクトリを作成したらviエディタで管理マネージャのコンテキストファイル(/opt/tomcat6/conf/Catalina/localhost/manager.xml)を作成します。ここでは、192.168.1.0/24のアドレスからのアクセスのみを受け付けるように設定してみます。

<Context path="/manager" docBase="${catalina.home}/webapps/manager"
  debug="0" privileged="true">
  <Valve
    className="org.apache.catalina.valves.RemoteHostValve"
    allow="192.168.1.*" />
</Context>

 作成が完了したら、Tomcatを再起動します。

/etc/init.d/tomcat restart

 管理マネージャを「http://tomcatのIPアドレス:8080/manager/html」で直接開いて確認してみると、以下のようにダイアログが正常に表示されました。

図13 正常に表示された接続ダイアログ
図13 正常に表示された接続ダイアログ

 ユーザーID/パスワードを入力すれば、正常に管理マネージャにログインできることが確認できます。

図14 正常にログインできた管理マネージャ

 もし、IPアドレスのアクセス制限に掛かったネットワークからアクセスすると、以下のような表示がされることが確認できます。

図15 ログイン失敗!
図15 ログイン失敗!

 管理マネージャのセキュリティも無事に強化されてこれで少しは安全になるでしょう。

 といいたいところですが、最後に1つだけ対応するべきところがあります。まだ完全に実装されておらず、Tomcatのトップページからは行けませんが、Tomcatのバーチャルホスト管理マネージャ「http://tomcatのIPアドレス:8080/host-manager/html」が実は存在しています。

 この機能に対してもアクセス制限をしておくとよいでしょう。viエディタで/opt/tomcat6/conf/Catalina/localhost/host-manager.xmlを作成して、以下の内容を記述します。

<Context path="/host-manager" docBase="${catalina.home}/webapps/manager"
  debug="0" privileged="true">
  <Valve
    className="org.apache.catalina.valves.RemoteHostValve"
    allow="192.168.1.*" />
</Context>

 最後に、Tomcatを再起動して終了です。

/etc/init.d/tomcat restart

 完了後にWebブラウザから「http://tomcatのIPアドレス:8080/host-manager/html」にアクセスして認証を抜けると、以下のような画面が確認できると思います。

図16 Tomcatのバーチャルホストマネージャ
図16 Tomcatのバーチャルホストマネージャ

 もし、実際に運用する際に管理マネージャなどを利用しない場合には、/opt/tomcat6/webapps以下から削除しておくことをお勧めします。

次回はツールを使ってセキュリティ対策

 以上で、セキュリティの更新と設定の改善までが完了しました。次回はセキュリティマネージャというツールについて解説します。

@IT関連記事

プロフィール
x-lab チーム

株式会社アメニクスのR&D部門として、企業の価値向上を目的に結成された研究開発チーム(x-lab=amenix laboratory)。
アメニクスの社員をはじめ、システム開発技術者のみに限らず、MBA教授や外資系出身エンジニアなど幅広いメンバーが所属している。IT技術からマーケティング、金融テクノロジーなどさまざまな分野で活動中。

主な著書
最速導入!オープンソースでつくる実用オンラインショップ

1-2-3-4

 INDEX
第4回 Tomcatのセキュリティとリスクの基本分かってる?
  Page1
「セキュリティ」対策をしないと、人生が変わる?
Tomcatはどんなセキュリティリスクを持つのか?
  Page2
Tomcatが持つセキュリティリスクを調べるには?
  Page3
Tomcatのセキュリティリスクを解決するためには?
Page4
Tomcatにありがちなセキュリティリスクの改善
次回はツールを使ってセキュリティ対策



Java Solution全記事一覧

TechTargetジャパン

Java Solution フォーラム 新着記事

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

RSSフィード

キャリアアップ

- PR -
@IT Sepcial

イベントカレンダー

PickUpイベント

- PR -
もっと見る
- PR -

お勧め求人情報

ホワイトペーパーTechTargetジャパン

@IT Sepcial
ソリューションFLASH