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사용자 이름이 포함되면 '어떻게 될까요 ?

관련 정보