![SFTP 사용자 로그인 정보 실시간 필터링](https://linux55.com/image/221728/SFTP%20%EC%82%AC%EC%9A%A9%EC%9E%90%20%EB%A1%9C%EA%B7%B8%EC%9D%B8%20%EC%A0%95%EB%B3%B4%20%EC%8B%A4%EC%8B%9C%EA%B0%84%20%ED%95%84%ED%84%B0%EB%A7%81.png)
기본 로그 파일에 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
사용자 이름이 포함되면 '
어떻게 될까요 ?