SFTPユーザーログイン情報リアルタイムフィルタリング

SFTPユーザーログイン情報リアルタイムフィルタリング

デフォルトのログファイルでSFTPログインログインを有効に/var/log/syslogし、各ユーザーのログイン時間をフィルタリングしてデータベースに挿入しました。

ただし、フィルタリングは期待どおりに機能しません。

サンプルログファイル:

Jun 23 15:47:03 ip-172-16-0-62 systemd[24938]: Reached target Shutdown.
Jun 23 15:47:03 ip-172-16-0-62 systemd[24938]: Starting Exit the Session..c.
Jun 23 15:47:03 ip-172-16-0-62 systemd[24938]: Received SIGRTMIN+24 from PID 24980 (kill).
Jun 23 15:47:03 ip-172-16-0-62 systemd[1]: Stopped User Manager for UID 1051.
Jun 23 15:47:03 ip-172-16-0-62 systemd[1]: Removed slice User Slice of nidasu.
Jun 23 15:47:13 ip-172-16-0-62 systemd[1]: Created slice User Slice of ftpuser1.
Jun 23 15:47:13 ip-172-16-0-62 systemd[1]: Starting User Manager for UID 1069...
Jun 23 15:47:13 ip-172-16-0-62 systemd[1]: Started Session 11907571 of user ftpuser1.
Jun 23 15:47:13 ip-172-16-0-62 systemd[24987]: Listening on REST API socket for snapd user session agent.
Jun 23 15:47:13 ip-172-16-0-62 systemd[24987]: Reached target Paths.
Jun 23 15:47:13 ip-172-16-0-62 systemd[24987]: Reached target Timers.
Jun 23 15:47:13 ip-172-16-0-62 systemd[24987]: Reached target Sockets.
Jun 23 15:47:13 ip-172-16-0-62 systemd[24987]: Reached target Basic System.
Jun 23 15:47:13 ip-172-16-0-62 systemd[24987]: Reached target Default.
Jun 23 15:47:13 ip-172-16-0-62 systemd[24987]: Startup finished in 15ms.

ユーザーログインメッセージは、次のようにフィルタリングする必要があります。

Jun 23 15:47:13 ip-172-16-0-62 systemd[1]: Started Session 11907571 of user ftpuser1.

11907571「Started Session of user」文字列を一致させてftpuser1これを把握する必要があります。

セッション番号11907571は任意の数字でユーザー名も異なるため、grepは番号とユーザー名を無視して次の文字列のみを確認できます。** "Started Session *** of user ***

行とgrepユーザー名を解析しdate + timeてMySQLデータベースに挿入する必要があります。

実行するデーモンプロセスを作成し、詳細をデータベースに挿入するオプションがある場合は、これが役に立ちます。

答え1

ソリューションスケッチTXR不明瞭な音声

(defvarl db-user "user")
(defvarl db-pw "password")

(defun mysql-insert (db-name table-name . values)
  (let* ((alist (plist-to-alist values))
         (columns [mapcar car alist])
         (values [mapcar cdr alist]))
    ;; fix as necessary, remove echo
    (sh `echo mysql -u @{db-user} -p@{db-pw} -e \ \
         "INSERT INTO @{db-name}.${table-name} (@{columns ", "}) \ \
          VALUES ('@{values "', '"}')"`)))

;; (daemon nil nil) ;; uncomment to daemonize

(let ((log (open-tail "syslog")))
  (whilet ((line (get-line log)))
    (if-match `@mon @day @hh:@mm:@ss @nil systemd[@pid]: Started Session @num of user @user.` line
      (mysql-insert "log-db" "sftp-table"
                    'date `@mon @day @hh:@mm:@ss`
                    'user user))))                                                                                                   

データに対してこのコマンドを実行すると、ログをスキャンしてMySQLコマンドを印刷します。

$ txr daemon.tl
mysql -u user -ppassword -e INSERT INTO log-db.name (date, user)  VALUES ('Jun 23 15:47:13', 'ftpuser1')

次に、より多くのデータがログに追加されるのを待ちます。オープンストリームはログファイルopen-tailのように機能します。tail -fファイルが回転すると自動的に検出され、名前が変更され、ファイルが回転しても機能します。新しいファイルsyslogの名前を変更して書き込みを開始すると、そのsyslog.1ままになります。syslog

言い換えればsyslog、日付を目的の形式に調整し、実際のデータベース、テーブル、列名を使用するなどの他の編集に加えて、実際のファイルを指す必要があります。

データベースパスワードは、環境変数またはコマンドラインパラメータを介して入力できます。ただし、これがデーモンとして実行されている場合は記録する必要があります。どこかに

データベース挿入コマンドは正しくエスケープする必要があります。何らかの理由でvaluesユーザー名が含まれると'どうなりますか?

関連情報