こんにちは、同僚。 ユーザーが企業ネットワークにアクセスしがちになるIPSECトンネルサーバーが構成されたCisco ASA 5512があります。 タスクが受信されました-監視中のアクティブなユーザーのリストを表示するだけでなく、誰が、いつ、どのアドレスから、どのプロファイルで使用したかを記録します。
インターネットに登って、自分の仕事にふさわしいものを見つけられなかった(もちろん、見た目がひどかった)ので、SNMP出力を解析してテーブルに入れるスクリプトを書くことにしました。
MySQLテーブル構造:
CREATE DATABASE `vpn_log` ; CREATE TABLE `logins` ( `id_l` int(10) unsigned NOT NULL AUTO_INCREMENT, `login` varchar(90) NOT NULL, `id_s` int(10) unsigned DEFAULT NULL, PRIMARY KEY (`id_l`), UNIQUE KEY `id_l_UNIQUE` (`id_l`), UNIQUE KEY `login_UNIQUE` (`login`) ) ENGINE=InnoDB AUTO_INCREMENT=121 DEFAULT CHARSET=latin1; CREATE TABLE `sessions` ( `id_s` int(10) unsigned NOT NULL AUTO_INCREMENT, `id_l` int(10) unsigned NOT NULL, `time_start` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `time_end` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', `ip_source` varchar(45) NOT NULL, `ip_lan` varchar(45) NOT NULL, `s_index` int(10) unsigned NOT NULL, `profile` varchar(255) NOT NULL, PRIMARY KEY (`id_s`), UNIQUE KEY `id_s_UNIQUE` (`id_s`) ) ENGINE=InnoDB AUTO_INCREMENT=2923 DEFAULT CHARSET=latin1;
処理スクリプト自体:
仕事の論理:
このスクリプトは、30秒ごとにクローンを介して実行され、SNMP機器をポーリングします。 シスコはユーザーログインを明確な形式で保存しないため、動的に生成されたSNMP OIDからログインを抽出する必要があります。 各ログイン文字は、SNMP OID部分のASCIIコードを使用して保存されます(これは
ここから取得さ
れます )。
get_user()関数を実行した後、変数$ xは次の形式の値を取ります。
[login] => Array ( [s_index] => Array ( [0] => profile_name ............................. [34] => 0 ) )
値の説明は
ここにあります 。
次に、スクリプトはLoginsテーブルにログインがあるかどうかを確認します。 そのようなログインが存在しない場合-そこに追加し、存在する場合-id_lを取得します。 次に、このログインに終了日が未定義のセッションが開いているかどうかを確認します。 そうでない場合は、セッションテーブルに新しいレコードを作成します。
次に、スクリプトはデータベースから、不完全なセッションを持つユーザーのリストを受け取ります。 そして、調査でログインをチェックします。 ログインが調査に含まれていない場合、またはセッション番号がデータベース内の番号(s_index)と一致しない場合、セッション終了時刻がスタンプされます。
コメント/修正/改善/質問の準備ができています。
UPD:ログイン解析機能およびアクティブセッションでのログインの存在の確認にstrtolower()が追加されました(ほぼ最後に)。 それ以外の場合、ログインに大文字が含まれていると、すべてが正しく機能しません。