« サーバー復旧奮戦記(2.SSLの設定) | メイン | サーバー復旧奮戦記(4.tomcat が止まってしまう(1)・・・今はまっています) »

2017年12月12日 (火)

サーバー復旧奮戦記(3.セキュリティー強化)

今日の内容は(も)テクニカルです。

サーバーがダウンした事だし、これを機会にセキュリティーの強化をしました。やった事は
(1)tomcat を root 以外で実行する。
(2)エラーページを作る。

(1)tomcat を root 以外で実行する。
tomcat を root で実行すると、何らかの攻撃にあって tomcat を乗っ取られると root 権限を奪われてしまう可能性があります。確かに対策すべきですね。

まず tomcat 専用のユーザーを作ります。これは簡単。


次に /etc/init.d/tomcat を編集して、startup.sh を起動する行を su tomcat-user -c startup.sh に変更するんですが、少しはまりました。
su tomcat-user -c startup.sh では動かない。エラーメッセージは出ないしログも出ない。どうも startup.sh が呼ばれていないみたい。いろいろやっていると、su tomcat-user --preserve-environment -c startup.sh とすれば startup.sh が動くのを発見。発見??なぜそうなるのかが分からないので「発見」なんですね。startup.sh は動いたもののエラーの山で tomcat は起動しません。ログを見ると port80 と port443 に接続できない。あっ、そうか。tomcat-user は root ではない。1024 以下のポートは root でしか接続できないのです。server.xml を書き直して port80, port443 のコネクタを作っていたのですが、これではダメですね。
port80, port443 を削除、port8080, port8443 にproxyPort を設定しました。
再起動したら port 関連のエラーは消えましたが、「ログファイルが開けない・・権限がない」となりました。なんで??ログファイルって、tomcat が作ったファイルじゃないの・・考えてみたら、root でテストした時のログファイルがあり,それを使おうとしていました。
所有者:root rw、グループ:root r、それ以外:none でした。tomcat-user は「それ以外」なので権限がない。ふむふむ。所有者、権限を調整して再起動。動きました。

ところが、一部のページが動かない。jsp を使っていますが、これも root でテストしていた時のファイルが残ってたのが原因でした。jsp は必要な時にコンパイルされて class ファイルが作成され、それが実行されるのですが、tomcat-user には root が作った class ファイルをアクセスする権限がなかったんですね。work 以下の class ファイルを削除して再起動。
class ファイルがなければ再コンパイルされるので、これでOKです。

(2)エラーページを作る。
web.xml にエラーページを定義できるので、とりあえず 404 だけ定義し、404 用のファイル err404.html を作ってテスト。OK。簡単だね。
でも、エラーごとにエラーページを作らなくてはならない。エラーの数は(数えていないけど)30以上あります。こんなにたくさん作るのはいやだ。ネット上の情報によると、エラーページは html, jsp のいずれでも可能とあります。パラメータでエラー番号を受け取り、それに従ってエラー表示をする jsp を作ってテスト。OK。と思ったのですが、

webapps/reclibApp 以下のページは動作するのですが、webapps/root 以下のエラーページが呼ばれない。しばらくねばったのですがダメ。jsp はあきらめることにして・・・html でもパラメータが読めるので、 javascript で同様の方法を試しました。結果はNG。/webapps/root 以下の html にパラメータが渡せない。調べてみると、パラメータには web.xml のエラーページの URL に書いたエラー番号ではなく、エラーを起こしたページ名が入っていました。ふ~ん、こういう仕様なのか。結局、エラーページを沢山作ることになりました。やれやれ。

コメント

コメントを投稿