ASP.NETで作成されているWebページへのログイン監視について
いつもお世話になっております。
掲題の件で質問させていただきます。ご存じの方がいらしたらご教授願います。
Zabbix環境
Zabbix 2.2.10
CentOS 7.1.1503
監視対象
IIS 6
ASP.NET 2.0.50727
上記の監視対象の環境でWebシステムが稼働しており、Zabbixにて
ログイン~メニュー表示まで遷移のWeb監視を行おうとしています。
ログイン画面を表示するだけの監視は要求文字列等も使用し確認できました。
しかしながらログインを行おうとするとどうしても正常に監視が行えません。
以下の2つのステップにて監視設定を行っております。
【ステップ1】
URL:ログイン画面URL
POST:なし
変数:ASP.NETで自動生成される値を以下のように変数に格納しています。
{VIEWSTATE}=regex:<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="(.*)" />
{EVENTVALIDATION}=regex:<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="(.*)" />
要求文字列:ログイン画面 (文字コードはutf-8です)
要求ステータスコード:200
【ステップ2】
URL:ログイン画面URL (自身にPOSTし認証が正常ならメニュー画面へリダイレクトする処理になっています)
POST:__LASTFOCUS=""
&__EVENTTARGET=""
&__EVENTARGUMENT=""
&__VIEWSTATE={VIEWSTATE}
&UcLogin1$txtID=hogehohe
&UcLogin1$txtPassword=fugafuga
&UcLogin1$btnLogin=%83%8d%83O%83C%83%93
&__EVENTVALIDATION={EVENTVALIDATION}
(実際は改行せずに1行でつながっています)
変数:なし
要求文字列:トップメニュー画面
要求ステータスコード:200
上記を実行すると、httpステータス500が返ってきます。
そこで監視対象のWebサーバーのイベントビューアーを確認すると
イベントの種類: 情報
イベント ソース: ASP.NET 2.0.50727.0
イベント カテゴリ: Web Event
イベント ID: 1316
Event code: 4009
Event message: Viewstate verification failed. Reason: Viewstate was invalid.
以下略
が返ってきます。
Zabbixでは(2.2.10では?)ASP.NETの上記のようなWebシナリオ監視は不可能なのでしょうか。
それとも私が根本的な間違い(勘違い)をしているでしょうか。
アドバイスをいただけますと幸いです。
KAZ - 投稿数: 1085
使用しているブラウザは何ですか?ブラウザ絡みの問題と勘違いしましたすいません。
「Viewstate verification failed. Reason: Viewstate was invalid.」とでてますから、Viewstateがおかしいのでは?
KAZ - 投稿数: 1085
Nkjmさん
ChromeにAdvanced REST clientと言うplug-inがあってポスト投げることができます。
なので、取得したVIEWSTATEとEVENTVALIDATIONを設定したPOST要求を
実行して上手くいくか確認してみてはどうでしょう?
Nkjm - 投稿数: 50
KAZさん
アドバイス有難うございます。
Chrome+Advanced REST clientの環境を用意し確認をしてみました。
(大変便利なツールですね^^cURLで四苦八苦していた自分が悲しい・・・)
結果Advanced REST clientで実行するとうまくメニュー画面まで遷移しました。
Advanced REST clientで不要な変数等を確認し、Zabbixのシナリオ設定を
余計な変数等減らしてみましたがやはりうまくいきません。(同じエラー)
Advanced REST clientでもVIEWSTATEのセットが正常ではないとZabbix同様に
500のエラーになりましたので、KAZさんのおっしゃる通りVIEWSTATEが正常に
引き渡しできていないと想定し、以下の様な仮ステップをステップ1の後ろに挿入
したところ、Zabbixでステータスコードが400と認識しエラーになりました。
しかしながらIIS側のログを見ても、URLの後ろに何も表示されていないステータス
コード200の行しか出力されておらず、400の行は見当たりませんでした。
URL:ログイン画面URL?{VIEWSTATE} (URLの後ろにステップ1で取得したVIEWSTATE変数を追加)
POST:なし
変数: なし
要求文字列:なし
要求ステータスコード:200
色々試行錯誤しているのですが、ステップ1の{VIEWSTATE}への値の取得が
うまくいっていないのだと思うのですが、正規表現の(.*)以外はブラウザのソース
表示からコピーしておりますし、判別がつく限度まで固定文言を削減したりしましたが
結果は同じでした。
少々混乱しておりまして、引き続き試してみようと思いますが、何かアドバイスが
ございましたらよろしくお願いいたします。
KAZ - 投稿数: 1085
Nkjmさん
便利ですよね。
Content-Typeにapplication/json-rpcを追加するとZabbixAPIも投げられます。
下記で取得した{VIEWSTATE}の値確認されましたか?
{VIEWSTATE}=regex:
下記はZabbix2.2.9のソースですが、POSTする内容ログに出力するように見えます。
if ('\0' != *httpstep.posts)
zabbix_log(LOG_LEVEL_DEBUG, "%s() use post \"%s\"", __function_name, httpstep.posts);
Zabbixサーバのログをデバックレベルにして動かしてみるとログにでると思うのですが…
Nkjm - 投稿数: 50
KAZさん
度々アドバイス有難うございます。
デバッグレベルの変更で詳細ログを確認するのを失念しておりました。
やはり、かなり煮詰まっているようですw
以下、本文章内の「」は実際の値ではなく区切り文字とみなして下さい。
デバッグレベルを変えて確認したところ、regexに値を渡して正規表現部分を切り出した
内容をログで確認したところ、VIEWSTATEの値の後ろに固定出力される「" />」が余計に
付与されておりました。
その後、余計な文字が付いたままPOST処理を行ってエラーコード400になったという
ログでした。
しかしながら、やはりサーバー側のIISログには何も記載されません。
同箇所に「time:0.000588 speed:34013.000000」と出ており、あまりにもレスポンスが
早くないかな?とも思っています。
(最初のサーバアクセスが「time:0.231050 speed:28868.000000」です)
エラーコード400が出るのは、想像でしかありませんが、実際にサーバへは送信しておらず、
Zabbixから送信する際に「" />」がついているため送信できずにエラーとなり、その戻り値が
400で出力されているのかも、と思ってます。
本筋に戻りますが、上記「" />」が付かなければうまくいくと考え、正規表現の指定を
色々変えているのですが、今度はregexで切り出しが正常に処理できないとエラーに
なってしまいます。
以下ログから抜粋です。
In http_process_variables() variables:'{VIEWSTATE}=regex:id="__VIEWSTATE" value="[0-9A-Za-z]+" />
In httpmacro_append_pair() pkey:'{VIEWSTATE}' pvalue:'regex:id="__VIEWSTATE" value="[0-9A-Za-z]+" />'
httpmacro_append_pair() cannot extract the value of "{VIEWSTATE}" from response
End of httpmacro_append_pair():FAIL macro:'(null)'='(null)'
End of http_process_variables():FAIL
なお、正規表現の部分を[0-9A-Za-z]だけにしても同様のエラーになります。
現状、regexから正常に切り出しできたのは(.*)と(.*?)のみです。
Zabbixのマニュアルのサンプルからも、POSIX拡張正規表現にも従っているため[0-9A-Za-z]+のような指定は
問題無いと思っているのですが、何かおかしいでしょうか?
なお、本現象はZabbix2.2.10および2.2.9の両方で確認しております。
また、これが解決しても、VIEWSTATEの後ろに固定出力される「" />」を変数に格納しないような
指定はできるものでしょうか?
以上、恐れ入りますがアドバイスがございましたらよろしくお願いいたします。
KAZ - 投稿数: 1085
状況からして.*は以降全部となってしまうかもしれません。
で、()で括らないと値が記憶しないはずです。
これでダメですかね?
下記、マニュアルです。
5 Zabbix 2.2.0の新機能
https://www.zabbix.com/documentation/2.2/jp/manual/introduction/whatsnew220
すいません、タグ文字で上手く読めないようになっていたので書き直しました。
Nkjm - 投稿数: 50
KAZさん
何度も申し訳ございません。有難うございます。
その方法も試してみましたが、
「cannot process step "ステップ名" of web scenario "シナリオ名" on host "ホスト名": error in step variables "{VIEWSTATE}=regex: {EVENTVALIDATION}=regex:id="__EVENTVALIDATION" value="([0-9A-Za-z]+)" />": cannot extract the value of "{VIEWSTATE}" from response」
(上記はデバッグモード3の時のログです)
となり、やはり正規表現の指定がおかしい模様です。
まだ、粘っていろいろやってみるつもりですが、もし何か情報がございましたらお教えいただけると幸いです。
KAZ - 投稿数: 1085
Nkjmさん
regexから正常に切り出しできた(.*)を使った時の「" />」が付いた時のZabbixサーバのログ見せて頂けますか?
Nkjm - 投稿数: 50
KAZさん
有難うございます。
以下がデバッグモード4の時のログです。
ただ、勘違いしておりまして、うまくいった時の正規表現は「(.+)」でした。
「(.+?)」はエラーとなり「(.*)」は実行しておりませんでした。
現在他の条件でテストをする時間が無いのですが、改めて他のパターンも確認したいと思っています。
In http_process_variables() variables:'{VIEWSTATE}=regex:VIEWSTATE" value="(.+)"
In httpmacro_append_pair() pkey:'{VIEWSTATE}' pvalue:'regex:VIEWSTATE" value="(.+)"'
End of httpmacro_append_pair():SUCCEED macro:'{VIEWSTATE}'='/wEPD~中略~ywdmFg=" />
取り急ぎ用件だけで申し訳ございません。
すみません。追記です。
上記ログの1行目および3行目の最後にシングルクォーテーションの締めが無いのが少し気になっております。
KAZ - 投稿数: 1085
Nkjmさん
ログですができるだけ加工せずに張って貰った方が分かり良いかと…A(^^;
.*と.+ですが、あまり違いは無いかと…
「.(ピリオド)」は任意の1文字
「*(アスタリスク)」は0回以上の繰り返し
「+(+)」は1回以上の繰り返し
value="([0-9A-Za-z]+)"が上手くいかないのはVIEWSTATEに記号があるからかと。
以下はダメですかね?
{VIEWSTATE}=regex:<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="(?!")" />
Nkjm - 投稿数: 50
KAZさん
度々有難うございます。また返信遅くなり申し訳ございません。
あと、省略してお手数をおかけしました。
昨晩アドバイスいただきました正規表現でもエラーとなりました。
以下、試してみた正規表現です。(正規表現より行の最後までを表してます)
エラーとなるパターン
([0-9A-Za-z]+)" />
(?!")" />
(?!)" />
(.+)" />$
エラーにはならないが抜き出した値の最後に「" />」がついてしまうパターン
(.+)" />
(.+)
(.*)" />
(.*?)" />
上記の紆余曲折の試行錯誤(手当たり次第ですがw)の末、
([!-~]+)" />
と指定することで何とか目的の部分だけ抜き出し、次のステップでPOSTし正常に監視ができるようになりました。
自身、果たしてこの正規表現でVIEWSTATEの値に含まれる値を網羅しているのか確信がありませんし、
他の正規表現がエラーや後ろの値がついてしまうパターンと何が異なるのか全く消化できていませんが
別のシステムの監視も同様に行う予定ですので、引き続き確認していきたいと思います。
何度もアドバイスいただいたKAZさん、本当にありがとうございました。
本件一旦クローズとさせていただきます。
Nkjm - 投稿数: 50
一旦クローズ宣言したにも関わらず再投稿失礼します。
昨日、上記の通り正常に監視が行えた旨を投稿しましたが、その後確認したところエラーとなっておりました。
エラーはVIEWSTATEの値が不正となるエラーでした。
Advanced REST clientを使用しながらいろいろ試したところ、Zabbixは変数をそのままPOSTしますが
VIEWSTATEは一度クライアント側で取得した値をURLエンコードし直してPOSTしなければエラーに
なるようです。
ZabbixのWebシナリオのオリジナル機能では変数のエンコードは行われないことから、
ASP.NETで構成されVIEWSTATEを生成するページの監視は最初の画面の表示可否のみで、
ログイン機能のチェック(次の画面の表示まで)は不可能という結論に達しました。
申し上げるまでもなく、これはあくまで私が現在持っている少ない知識での結論なので
誤っている可能性があります。
また、今後のバージョンアップにより、変数のエンコード機能が付加される事を期待しています。
私のような要件を求められている方は他にもいらっしゃるかと思いますが、あくまでも本スレは
参考にとどめていただき、ご自身で別途解決方法が無いか検討いただくのがよろしいかと思います。
私は今回の対応として、cURLを利用したPHPスクリプトを作成し、その中でVIEWSTATEを
URLエンコードして対応する予定です。(Zabbix連携はこれからですが、スクリプト単独では確認済です)
以上、ご報告まで。
最後に、様々に時間をとっていただいたKAZさんと私の投稿に時間を割いてくださった皆様に
感謝いたします。有難うございました。
Nkjm