Zabbix APIの認証キーに関して

お世話になります。
Zabbix APIの使用を検討しており、現在いろいろと動作検証を行っています。

メソッドuser.loginにて、認証キーを取得しますが、
この認証キーには認証の有効期限がありますでしょうか?

こちらで検証したところ、user.loginで認証キーを受け取ってから
2日近くは使用することができましたが、
あるときを境に使用することができなくなりました。
(きっと有効期限が切れたためと認識しております。)

本家のフォーラムの情報も確認しましたが、
情報を見つけることができませんでした。

よろしくお願いします。

コメント表示オプション

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

ソースを見る限り、セッションのタイムアウトによってAPIが呼び
出せなくなるのは、

 ・ユーザプロファイルの自動ログアウト設定
 ・ハウスキーピング処理による最終ログインから1年経過した
  セッション情報削除

の2つの場合が考えられます。

ユーザプロファイルで自動ログアウト時間が設定されている場合、
最後にアクセスした時刻から自動ログアウト時間以上経過していた
ら認証エラーとなるようです。
API呼び出しに利用されているユーザの自動ログアウト時間を設定
されていませんか?

自動ログアウトを設定されていないのであれば、セッション情報は
1年経たないと破棄されないはずなので、別の要因でAPIが呼び出せ
なかったのかもしれません。

例えば、同時刻にzabbix_serverのログに何か出力されていません
でしたか?
もしかしたら、ハウスキーピング処理によって負荷が上昇し、API
呼び出しのタイムアウトが発生したということも可能性としては考
えられると思います。

ユーザー tysw の写真

TNKさん、ご回答ありがとうございます。

>ユーザプロファイルで自動ログアウト時間が設定されている場合、
>最後にアクセスした時刻から自動ログアウト時間以上経過していた
>ら認証エラーとなるようです。
データベースのsessionsテーブルのデータをSQLで確認しながら、
自動ログアウト時間を設定している場合としていない場合の動作検証を行い、
以下の動作が確認できました。

■自動ログアウト時間を設定している場合(自動ログアウト時間を300秒として検証しました)
1.APIのuser.loginメソッドで認証キーを作成
→データベースのsessionsテーブルにsessionidが作成されたことを確認
2.「1」の後、300秒経過するのを待ち、sessionsテーブルを確認
→「1」で作成したsessionidは削除されずに残ったままだった。
この状態で「1」で作成した認証キーを使用してのAPIの実行は認証エラーとならずに実行できた。
3.再度APIのusre.loginメソッドで認証キーを作成
→sessionsテーブルを確認すると、「1」で作成されたsessionidが削除され、
新たなsessionidだけが残っていた。
この状態で「1」で作成した認証キーを使用してのAPIの実行は認証エラーとなった(sessionidがすでにないため)。
「3」で作成した認証キーを使用してのAPIの実行は認証エラーとならずに実行できた。

このことから自動ログアウト時間を設定している場合は、
・自動ログアウト時間経過後に認証キーを再作成するまでは、自動ログアウト時間を経過した後でも
認証キーを使用することができる。
・自動ログアウト時間経過後に認証キーを再作成すると、それまで作成した認証キーは使用できなくなる。
と言えそうです。

■自動ログアウト時間を設定しない場合
1.APIのuser.loginメソッドで認証キーを作成
→データベースのsessionsテーブルにsessionidが作成されたことを確認
2.再度APIのusre.loginメソッドで認証キーを作成
→sessionsテーブルを確認すると、「1」で作成されたsessionidも存在し、
新たなsessionidも存在していた。
「1」「2」で作成した認証キーのどちらを使用してもAPIの実行は認証エラーとならなかった。
3.さらにAPIのure.loginメソッドで認証キーを作成
→sessionsテーブルを確認すると、「1」「2」で作成されたsessionidも存在し、
新たなsessionidも存在していた。
「1」「2」「3」で作成した認証キーのどれを使用してもAPIの実行は認証エラーとならなかった。

このことから自動ログアウト時間を設定しない場合は、
・認証キーを何度作成しても作成した分だけ、sessionidテーブルにsessionidが残り、
sessonidテーブルにsessionidが存在する認証キーはAPIの実行時に認証エラーにはならない
と言えそうです。

自動ログアウト時間を設定した場合もしない場合も、sessionsテーブルにsessionidが残っている場合は、
その認証キーを認証エラーなく利用できるようです。
sessionsテーブルからsessionidが削除されるとその認証キーは認証エラーとなり使用できなくなりますが、
sessionsテーブルからsessionidが自動的に削除される時間が決められていると考えていますが、
こちらはもう少し検証してみようと思います。
(sessionsテーブルからsessionidが自動で削除される時間がどこかで定義されているか
ご存知でしょうか?)

>例えば、同時刻にzabbix_serverのログに何か出力されていませんでしたか?
ログを確認しましたが、特に問題ありそうなログは出力されていませんでした。
また、ログにハウスキーピング処理のログもありましたが、
deleteレコードは0件というログしかありませんでした。

ユーザー TNK の写真

ソースの確認した箇所がずれていたのかもしれません。
もう少し確認してみます。

ご参考までに、私がAPIを利用しているシステムでは、
API呼び出しの直前にuser.loginを呼び出して利用し
ています。

ユーザー kodai の写真

sessionsテーブルからsessionidが自動的に削除される時間が決められていると考えていますが、こちらはもう少し検証してみようと思います。
(sessionsテーブルからsessionidが自動で削除される時間がどこかで定義されているかご存知でしょうか?)

最初の投稿にあった2週間でログインができなくなった、という環境では自動ログアウトは設定されていなかったということでしょうか?

TNKさんの通り、生成されてから1年以上経過したsessionidはhousekeeperが削除しているように思います。

また、APIで利用されているユーザアカウントを、通常のWebインターフェースのアカウントでも利用されているということはないでしょうか?ソースまでは確認していないですが、Webインターフェース側でログアウトした場合の影響もあるんじゃないかと思っています。

ユーザー tysw の写真

TNKさん、kodaiさん

返信が遅れました。
sessionsテーブルからsessionidが自動的に削除される時間について
あれから検証をしてみました。

■APIで利用しているユーザに自動ログアウト時間を設定していない場合
user.logonメソッドを実行して1週間経過しても
sessionsテーブルからsessionidが自動的に削除されることはありませんでした。

■APIで利用しているユーザに自動ログアウト時間を設定している場合
user.logonメソッドを実行して1週間経過しても
この状態でさらにuser.loginメソッドを実行しない場合は、
sessionsテーブルからsessionidが自動的に削除されることはありませんでした。
(この状態でさらにuser.loginメソッドを実行した場合はsessionsテーブルからsessionidが削除され
新しいsessionidが作成されました。)

短期間でsessionidが削除されるのは、
自動ログアウト時間を設定していて、かつ自動ログアウト時間経過後に
user.logonメソッドを実行したときの場合のようです。
(この動作を私は「自動的に削除されていた」と勘違いしていたようです。)

自動ログアウト時間を設定していても、
user.logonメソッドを実行されるまではsessionidは削除されず、
自動ログアウト時間を設定していない場合は、sessionidは1週間ぐらいでは
削除されないようなので、
sessionsテーブルからsessionidが自動的に削除されるのは
お二人がおっしゃるように生成から1年以上経過し、housekeeperが
削除してくれないと削除されないようですね。

APIで利用しているユーザの自動ログアウト時間を設定しないと
1年間sessionidが溜まり続けるので、
自動ログアウト時間を設定して、API呼び出しの直前に毎回user.loginを呼び出して
認証キーを使用するようにしたいと思います。

ありがとうございました。

ユーザー kodai の写真

user.logoutメソッドを実行して明示的にログアウトしてはどうでしょうか?
ユーザがログアウトの操作をしなければ同じことになってはしまいますが...

ユーザー tysw の写真

kodaiさん

http://www.zabbix.com/documentation/1.8/api/user/logout
を参照しましたが、記載がなく、
user.logoutメソッドの記述方法が分かりませんでした。
(いろいろ想像してuser.logoutメソッドを記述してみましたが
動作しませんでした。)

user.logoutメソッドの記述方法をご存知のようでしたら
教えていただけますでしょうか?

ユーザー TNK の写真

user.logoutを呼び出してエラーとなってしまうのは、バグとして
報告されています。
2.0で対応予定のようです。
https://support.zabbix.com/browse/ZBX-3907

ユーザー tysw の写真

TNKさん

情報ありがとうございます。
承知しました。
2.0になるまでは、自動ログアウト時間を設定して、API呼び出しの直前に毎回user.loginを呼び出して
認証キーを使用するようにしたいと思います。