「AJP コネクタは secretRequired=“true” として構成されていますが…」の対処方法

カテゴリ:Java

Apache と Tomcat を AJP を用いて連携した際に catalina.out に「Caused by: java.lang.IllegalArgumentException: AJP コネクタは secretRequired="true" として構成されていますが、secret 属性は null または空文字列が設定されています。この組み合わせは有効ではありません」エラーが発生した場合の対処方法について解説いたします。

※環境によっては英語で「Caused by: java.lang.IllegalArgumentException: The AJP Connector is configured with secretRequired="true" but the secret attribute is either null or "". This combination is not valid.」と出力される場合もあります。

原因

Apache Tomcat 8.5.51 以降では secretRequired パラメータがデフォルトで true に設定されていますが、secret 属性が設定されていない場合にこのエラーが発生します。

secretRequired パラメータは Apache と Tomcat 間の AJP 通信の脆弱性である Ghostcat (CVE-2020-1938) の対策のために導入されたパラメータです。

参考この修正が実施された Tomcat のバージョンは以下となります。
Tomcat 7.0.1000
Tomcat 8.5.51
Tomcat 9.0.31

同修正により、まず、AJP がデフォルトで無効にされています。AJPを有効にする場合、server.xml でコメントを解除する必要があります。

さらに、secretRequired パラメータが true に設定されている場合、Apache 側と Tomcat 側の両方に同じ secret の値を指定しておく必要があります。もし secret の指定が無かったり、値が一致しない場合は認証に失敗します。

secretRequired や secret パラメータについては、Apache Tomcat 9 構成リファレンス(英語)を参照いただければと思います。

抜粋(日本語訳)

secretRequired

この属性が true の場合、AJP コネクタは、secret 属性が null 以外、ゼロ以外の長さの値で構成されている場合にのみ起動します。

この属性は、AJP コネクタを開始するために secret 属性を指定する必要があるかどうかのみを制御します。 ワーカーが secret を提供する必要があるかどうかは制御されません。 デフォルト値は true です。この属性は、コネクタが信頼されたネットワーク上で使用される場合にのみ false に設定する必要があります。

secret

この secret のキーワードを持つワーカーからのリクエストのみが受け付けられます。デフォルト値は null です。 この属性は、secretRequired が明示的に false に設定されていない限り、null またはゼロ以外の長さの値で指定する必要があります。

この属性が null 以外、ゼロ以外の長さの値で構成されている場合、ワーカーは一致する値を提供する必要があり、そうでない場合、要求は secretRequired の設定に関係なく拒否されます。

対処方法

Tomcat の server.xml で AJP 接続の設定において secretRequired="false" を指定するか、もしくは secret 属性を指定します。

secretRequired="false" を設定する場合

<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector protocol="AJP/1.3"
               address="::1"
               secretRequired="false"
               port="8009"
               redirectPort="8443" />

secret を指定する場合(secretRequired は true のまま)

<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector protocol="AJP/1.3"
               address="::1"
               secret="PASSWORD"
               port="8009"
               redirectPort="8443" />

Apache 側にも secret を指定します。値は Tomcat 側と同一でなければなりません。

ProxyPass / ajp://localhost:8009/ secret=PASSWORD
ProxyPassReverse / ajp://localhost:8009/ secret=PASSWORD

公開日時:2024年03月22日 18:20:14
最終更新日時:2024年03月29日 15:09:54

なお、VPS選びで迷ったらこちらの記事で主要VPSのメモリ容量ごとの月額、年額料金を比較していますので、是非参考にしてみてください。

Javaに戻る

このページのトップに戻る