🐡

XymonのEnable/Disable機能がリバースプロキシ環境で使えないのを直す

2020/04/26に公開

XymonにはEnable/Disable という監視を一時停止する機能がありますが、それが使えなくなる事象がありました。
AmazonLinux 2環境のXymon 4.3.30。
Enable/Disable画面の Select what to Disable で「Apply」をクリックしても、なにも反応がありません。

このとき Apache のエラーログには

AH01215: 日付 Enadis POST that is not coming from self or svcstatus (referer=http://example.com/xymon-seccgi/enadis.sh). Ignoring.: /home/xymon/cgi-secure/enadis.sh, referer: http://example.com/xymon-seccgi/enadis.sh

とのエラーメッセージが出力されています。
EnadisとはEnable/Disableの略ですね。POSTはhttpのPOSTのことではなく投稿との意味。
Enable/Disableの投稿は自分自身かsvcstatusからは許可されていないとのことです。
リバースプロキシを使って転送している環境なので使えないと出ているようです。

公式メーリングリストを探すと 2019年9月12日 に René Vermareさんからパッチの投稿がありました。
https://lists.xymon.com/archive/2019-September/046708.html から引用。

--- a/web/enadis.c      2019-07-23 17:29:06.000000000 +0200
+++ b/web/enadis.c      2019-09-11 01:06:33.283642013 +0200
@@ -332,7 +332,8 @@
    int argi, i;
    char *username = getenv("REMOTE_USER");
    char *userhost = getenv("REMOTE_HOST");
-    char *userip   = getenv("REMOTE_ADDR");
+    char *userip   = getenv("HTTP_X_FORWARDED_FOR");
+    if (userip == NULL) userip = getenv("REMOTE_ADDR");
    SBUF_DEFINE(fullmsg);
    char *envarea = NULL;
    int  obeycookies = 1;
--- a/web/acknowledge.c 2019-07-23 17:29:06.000000000 +0200
+++ b/web/acknowledge.c 2019-09-11 01:01:55.493676233 +0200
@@ -374,7 +374,8 @@
 
    parse_query();
        if (getenv("REMOTE_USER")) {
-            char *remaddr = getenv("REMOTE_ADDR");
+            char *remaddr = getenv("HTTP_X_FORWARDED_FOR");
+            if (remaddr == NULL) remaddr = getenv("REMOTE_ADDR");
 
            SBUF_MALLOC(acking_user, 1024 + strlen(getenv("REMOTE_USER")) + (remaddr ? strlen(remaddr) : 0));
            snprintf(acking_user, acking_user_buflen, "\nAcked by: %s", getenv("REMOTE_USER"));

変更点を見てもらえばわかりますが、REMOTE_ADDRでIPアドレスを拾っているところをHTTP_X_FORWARDED_FORから拾うように変えています。これで良さそうです。

フロントのリバースプロキシをApacheでやっている場合は、

ProxyPreserveHost on

で転送先にホスト名を送る必要があります。

このパッチをソースの直下に置いて、reverse_proxy.patchとか適当にファイル名をつけて保存。

patch -p1 < reverse_proxy.patch

で適応したら、あとはビルドし直します。

これで解決しました。

GitHubで編集を提案

Discussion