ログイン後のWEB監視について

WEB監視で以下の設定にすると「メニュー」の文字が見つかりませんとのエラーが出力され、
要求文字列をログイン前の画面に表示される文字にすると正常に監視できます。
そのためログイン後の画面に遷移ができていないように思えます。

【設定内容】
1.シナリオ
 名前:サイト名
 アプリケーション:Web
 更新間隔:60
 試行回数:1
 エージェント:Firefox 33.0(Linux)
 HTTPプロキシ:なし
 変数:なし
 ヘッダー:なし
 
2.ステップ
 名前:Login
 URL:サイトURL
 POST:memberNum=ログインID&inputPass=パスワード&enter=ログインボタン
 変数:なし
 ヘッダー:なし
 リダイレクトをたどる:チェックあり
 ヘッダーのみを取得:チェックなし
 タイムアウト:15
 要求文字列:メニュー(ログイン後の画面に出力される文字)
 要求ステータスコード:200

設定に誤りがあるのでしょうか?
設定は以下の情報を参考に設定しています。
https://www.zabbix.com/documentation/2.2/jp/manual/web_monitoring

よろしくお願いします。

-------------サーバー情報(zabbix共通)-------------
zabbixバージョン3.0
サーバーOSCentOS release 7.0
----------------------------------------------------

コメント表示オプション

お好みのコメント表示方法を選び「設定の保存」をクリックすると変更が反映されます。
ユーザー heya の写真

POST で指定するデータに日本語が含まれていませんか?
含まれる場合、自動でURLエンコードされるわけではないので、日本語をそのまま書いてもうまくいかないと思います。
#3.4 ではこの問題が解消されているようです。

ユーザー fsk の写真

heya様

早々のご回答ありがとうございます。
ログインボタンは「ログイン」と設定しています。
POST:memberNum=ログインID&inputPass=パスワード&enter=ログインボタン

日本語で設定する方法はありますでしょうか?
「”ログイン”」と設定しても状況変わらずでした。

よろしくお願いします。

ユーザー heya の写真

半角カタカナということですかね?
なんにせよ、URLエンコードした結果を書けばいいとは思います(実際のログイン時(成功時)に送っている POST データを見れば分かります)。

実際に送っている POST を見る方法は、ブラウザによって名称は違いますが、「開発者ツール」みたいな機能を使うと見られると思います。私が普段使っている Firefox なら ツール→ウェブ開発→ネットワークで、POSTの行で右クリック→編集して再送信、で、「要求ボディ」の欄に表示されるみたいです。
参考
https://private.hibou-web.com/archives/5390
https://gist.github.com/honda0510/4160295

ユーザー fsk の写真

heya様

引き続き回答いただきありがとうございます。
以下2点を試し一応解決したと思われます。

①POST設定誤り
 POSTデータを確認した結果、ログインボタン部分は「submit:ログイン」でした。
 そのためPOST設定を「memberNum=ログインID&inputPass=パスワード&submit:ログイン」と設定しました。
 「enter」は参考情報をそのまま使用していました。

②要求文字列の変更
 要求文字列を日本語から数字「1.」に変更しました。
 監視対象サイトにローマ字が見当たらないためです。
 
②まで行い正常に監視ができるようになりました。

要求文字列に日本語は使用できないのでしょうか?

ユーザー heya の写真

>要求文字列に日本語は使用できないのでしょうか?

これを見て思い出しました。文字コードの問題がありましたね。
日本語も使えますが、UTF-8 の場合だけです。それ以外だと日本語は使えません。
#マニュアルに明記してあるといいんですけどね・・・。
うまくいかなかったのはこれが原因のような気がします。

念のため確認ですが、1. というのはログイン成功時の画面に含まれて失敗時には含まれない文字列ですか?
失敗時にも 1. が含まれるなら、ログインが成功かどうかに関係なく Web 監視の結果は OK になってしまいます。なので、ログイン後のページが UTF-8 でないなら、成功時だけに含まれる「アスキー文字だけの文字列」を要求文字列にするといいです。

以下、一応書いておきます。

memberNum や inputPass は、日本語でないにしても、記号を含んでいたりしませんか?
一部の記号はそのままではなく URL エンコードした値を指定する必要があります。
#どの文字を URL エンコードするかは実は結構ややこしいので、
#実際にブラウザが送信しているデータを見るのが一番楽。

> POSTデータを確認した結果、ログインボタン部分は「submit:ログイン」でした。
submit:ログイン と表示されたのは、たぶん開発者ツールの中で、見ている場所が違うんでしょう。
実際に送った文字列(※1)を表示しているところではなく、POST でどんな内容を送ったか(※2)を表示しているところを見たのだと思います。

違いを説明するのが難しいですが、
※1は「実際に送信したのは memberNum=xxx&inputPass=yyy&submit=%zz%zz%zz%zzという文字列だよ」
※2は「memberNum の値として xxx を、inputPass の値として yyy を、submit の値として ログイン(をエンコードしたもの)を送ったよ」
という感じです。

ただ、submit の値は、関係なさそうな気もするので、忘れてしまってもいいです。

ログインページの仕様が分からないのであくまで一般論ですが・・・
・ログイン処理に必要なのは基本的に名前とパスワードだけ。
・ログインボタンの文字列も送信されるのは、フォームに入っているからついでに送信される、というだけのこと。
・ログイン処理をするプログラムでは、普通、ログインボタンの文字列は無視する。
もちろんログインボタンの文字列を読んでそれに応じて処理を変える、といった処理も可能ですが、そのようにしたくなる場面はそうそう無いと思います。

まとめると、
・たぶんパラメーター指定は今のままで大丈夫(なんなら 最後の & 以降は消してもいい)。
 ただし memberNum や inputPass が記号を含むなら URL エンコードする必要があるかもしれない。
・ログイン後のページが UTF-8 でないなら要求文字列に日本語は使えない。
 日本語以外で、ログイン成功時にのみ含まれる文字列を指定する。

ユーザー heya の写真

すいません、もう一つ。

> 監視対象サイトにローマ字が見当たらないためです。
これについてですが、要求文字列に指定できるのは、画面に表示される文字列に限定されません。
ページのソースに含まれる文字列なら何でもいいのです。HTML のタグでも、コメントでも。

例えば成功時のページのタイトルが xxx page で失敗時のタイトルが login failure であれば、成功時のページのソースには <title>xxx page</title> といった文字列がある(かつ、失敗時には含まれない)でしょうから、要求文字列にそれを指定すればいいのです。

ユーザー fsk の写真

heya様

詳細な回答ありがとうございます。

>念のため確認ですが、1. というのはログイン成功時の画面に含まれて失敗時には含まれない文字列ですか?
再度ログイン後画面に表示されている文字列で検証したところ、文字列が見つからないとエラーが発生します。
「1.」はログイン前画面にはないと思うのですが...
ログイン前の画面上にある文字列なら日本語でもステータスが正常になっているので監視できてるようです。

文字コードは問題ないと思いますのでPOSTデータを確認いたします。

ユーザー fsk の写真

確認遅くなり申し訳ございません。

現状として状況は変わっていません。

【実施内容】
POSTデータをChromeで以下URLを参考に確認し設定しました。
https://gist.github.com/honda0510/4160295

確認した結果を「POST」欄に張りつけ設定しましたが変化なし。
submitの設定有無も試しましたがどちらも要求文字列が見つからないとエラーが発生します。(日本語・ローマ字どちらでも)
要求文字列にログイン前画面の文字列を入力すると正常となります。(日本語・ローマ字どちらでも)

文字コードは以下の設定があるのでUTF-8です。
 encoding="UTF-8"

ほかに原因となる設定はありますでしょうか?
問題としてはPOSTにログイン情報を設定しているがログイン後の画面に遷移していないことだと思います。

テストとしてzabbixWEB画面の監視はログイン後の監視までできました。

ご教示よろしくお願いいたします。

ユーザー heya の写真

うーん、ちょっと分からないですね・・・。

curl -L -i -d POSTデータ ログイン情報送信先のURL
だとどうなりますか?ログイン後のページのHTMLが出力されますか?
#Zabbix が curl に実際どういう引数をつけているのかは調べていませんが、
#たぶんこんな感じかなと思います。

>リダイレクトをたどる:チェックあり
これは、おそらく curl の -L オプションを付けるということなんだろうと思いますが、-L オプションは Location: ヘッダーと 3xx の応答を見てリダイレクトの判断をするようなので、meta タグや JavaScript でリダイレクトするときは対応してなさそうな気がします。
その場合、リダイレクト前のページ(=ログイン情報送信先のURL)を見るステップの他に、その次にリダイレクト先のページ(URL)を見るステップが必要となるのかもしれません。

また、サイトの作り次第ですが、例えばログイン情報入力ページで cookie などを設定してからログインページに移らないとログインできないようにしてある場合は、最初のステップで入力ページ、次のステップでログイン情報送信先ページをチェックする必要があるでしょうね。

ユーザー fsk の写真

heya様

ご回答いただきありがとうございます。

返答遅くなり申し訳ございません。

>curl -L -i -d POSTデータ ログイン情報送信先のURLだとどうなりますか?
結果はログイン前の画面が表示され、遷移されません。

Web画面遷移はログインボタンに設定してある「onclick」コードで「名前(this)」と命令が行き、
命令先で「action」が設定されておりログイン後画面に遷移する流れのようです。

POSTデータに「onclick」等も追加で設定してみましたが結果は同じです。

このような設定でもログイン後の画面を監視できますでしょうか?

よろしくお願いします。

ユーザー heya の写真

まだよく分かりませんね。
もしかして、ログイン情報送信先もログイン情報入力ページも同じで、パラメーター(か、Cookie など)で動作が変わる、ということ?

どうも分かりにくい(&話がしにくい)ので、一部を伏せてでもいいので、以下の URL((1)(2) はブラウザのアドレスバーに表示されるもの)を書いてみてもらえませんか。
(1) ログイン情報を入力するページ
(2) ログイン後に表示されるページ(ログインボタンを押して移動した先)
(3) onclick で設定されている action 先
(4) curl で試した URL

>Web画面遷移はログインボタンに設定してある「onclick」コードで「名前(this)」と命令が行き、
>命令先で「action」が設定されておりログイン後画面に遷移する流れのようです。
これは、想像するに、フォームの機能を無効にした上で、ログインボタンを押したら通常のフォームの動作を JavaScript が代わりに行う、ということなんでしょう(値の送信前に何か処理(入力値のチェックなど)を挟みたいときに、こんなふうにすることがあります)。

curl を使うと、その action 先に遷移したときに、なぜかログイン情報入力画面(に相当するHTML)が取得される、ということで合ってますか?

ユーザー fsk の写真

heya様

返答遅く成り申し訳ございません。

原因は分かっていませんが自己解決しました。

URLの指定にログイン画面(ログイン前)を設定していたのですが、
ログイン後のURLを設定する必要があったようです。

ZabbixのWeb画面はログイン前の画面を設定すると監視できると思いますが、
サイトの構成が違うということでしょうか。

POSTや要求文字列はそのままの設定で解決できました。

以上、ご対応いただきありがとうございました。

ユーザー heya の写真

無事解決したようで、安心しました。

>ZabbixのWeb画面はログイン前の画面を設定すると監視できると思いますが、

https://www.zabbix.com/documentation/2.2/jp/manual/web_monitoring/example
ここの例だと、ステップ1(ログイン前の画面)、ステップ2(ログイン情報送信)、ステップ3(ログイン後の画面)は、どれも URL は同じで index.php です。
#パラメーターや要求文字列は違います。
なので、ログイン前の画面と言ってもちょっと言葉が曖昧です。

>サイトの構成が違うということでしょうか。

まあ、サイト構成については、世界で共通のものがあるわけでなく、結局はそのサイトがどう作られたかによって変わってくるので、一般論で語るのは難しいですよね。