Friday, May 1, 2020

Tomcat9をアップデートしたらWebサーバ(Apache)とAJP接続できなくなった話

こんにちは。おおたにです。

先日Tomcat9を最新バージョン(その時点では9.0.33)にアップデートしたところ、WebサーバとのAJP接続がうまくいかなくなったので、今回はその対処法を紹介します。

原因


こちらの脆弱性への対応のため、Tomcat 9.0.31でAJP1.3コネクタ設定が変更されたことが原因でした。具体的な変更点はTomcat 9.0.31のchangelogにありますが、主なものは以下の3点です。
  • AJPコネクタ(8009番ポートのやつ)がデフォルトでdisabledになった
  • バインドアドレスのデフォルトがIPv6ループバックアドレス(::1)になった
  • 新しい属性secretRequiredが追加され、デフォルトでtrueとなっている(trueの場合、secret属性でシークレットキーを指定する必要がある)

以下、上記変更に対応するための設定方法です。今回はApache HTTP Serverを例に説明しますが、Apache HTTP Serverのバージョンにより設定が若干異なります。

Apache HTTP Server 2.4.43以降の場合


Tomcat側は、<TOMCAT_DIR>/conf/server.xmlでAJPコネクタのコメントアウトを外した後、以下のように設定します。
    <Connector protocol="AJP/1.3"
               address="TomcatサーバのIPアドレス"
               port="8009"
               secret="シークレットキー"
               redirectPort="8443" URIEncoding="UTF-8" />
  • address : TomcatサーバのIPアドレス。複数のインタフェースが存在する場合はWebサーバとの通信に利用する方のIPアドレスを指定する。
  • secret : AJPコネクタのシークレットキー。

Apache HTTP Server側は、ProxyPass設定にsecretパラメータを追加して先ほどと同じ値を指定します。
ProxyPass / ajp://TomcatサーバのIPアドレス/ secret=シークレットキー

Apache HTTP Server 2.4.41以前の場合


AJPコネクタのシークレットキーに対応できないため、Tomcat側でsecretRequiredfalseに設定する必要があります。
    <Connector protocol="AJP/1.3"
               address="TomcatサーバのIPアドレス"
               port="8009"
               secretRequired="false"
               redirectPort="8443" URIEncoding="UTF-8" />
Apache HTTP Server側は特に設定変更しなくてOKです。


弊社ではLiferayやAlfrescoといったオープンソース製品のカスタマイズ/導入支援を行っておりますが、Tomcat/Apacheを使ってホストすることが多いためさっそくこの問題にあたりました。どうぞご参考まで。

No comments: