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"));

============================================================

(注意:字下げはTABです)

 

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

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

============================================================

ProxyPreserveHost on

============================================================

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

 

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

============================================================

patch -p1 < reverse_proxy.patch

============================================================

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

 

これで解決しました。

 

 

 

アメブロだとコードが見にくいので、Qiitaにも同じ内容を書きました。

https://qiita.com/koshikawa/items/416b705d4344109833ab

 

AmazonLinux2やCentOS7、RHEL7以降のsystemd用Xymon起動スクリプトの例

 

Xymonサーバ

 /etc/systemd/system/xymon.service

========================================================

[Unit]

Description=XymonClient

After=network-online.target

 

[Service]

Type=forking

ExecStart=/home/xymon/server/xymon.sh start

ExecStop=/home/xymon/server/xymon.sh stop

User=xymon

Group=xymon

 

[Install]

WantedBy=network-online.target

========================================================

起動の登録

systemctl enable xymon

起動

systemctl start xymon

 

Xymonクライアント側

/etc/systemd/system/xymonclient.service

========================================================

 

[Unit]

Description=XymonClient

After=network-online.target

 

[Service]

Type=forking

ExecStart=/home/xymon/runclient.sh start

ExecStop=/home/xymon/runclient.sh stop

User=xymon

Group=xymon

 

[Install]

WantedBy=network-online.target

========================================================

起動の登録

systemctl enable xymonclient

起動

systemctl start xymonclient

xymonからhttpsで監視を試みるも、SSL_ERRORと出て監視できず、

xymonnet.logには

error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure

と出て監視できない状況。

コマンドラインからwgetやcurlではhtml取ってこられるのに。

調べたところsniの指定が抜けていたのが原因でした。

 

hosts.cfgに、

127.0.0.1   hogehoge                     # cont=https_string;https://www.example.com/test.html;test sni

とのように、末尾にsniを付けたら意図通り正常に監視できました。

SNIとは、Server Name Indication、ひとつのサーバで複数のSSL証明書を使う技術。

監視対象がAWSのCloudFrontでのSSLだったのですが、正確には不明です。原因わかれば追記します。