Intro

  • webpage
  • feature
    • 유저의 ssh 세션 활동(명령 및 출력)에 대해 로그 파일에 기록
    • 로그인된 유저에게 어드민이 ssh 세션을 공유 기능
    • ssh 세션의 특정 활동이 발생되면 Slack에 메시지를 보내거나 특정 명령을 수행할 수 있음
    • ssh 이벤트를 원격의 syslog 서버에 전달
    • 사용자 로그인, 연결 해제, 명령 활동 등을 추적하기 위해 statsd 측정 항목을 전송
    • ssh 활동에 의해 트리거되는 사용자 정의 작업을 실행하기 위한 Configure 및 확장 가능한 플러그인 지원
  • use
    • SSH 모니터링을 시작하려면 sshlog 패키지를 간단하게 설치하면 됨
    • 기존 OpenSSH 서버 프로세스와 함께 작동하며 별도의 SSH 데몬이 필요하지 않음
    • SSHLog는 모든 기능 조합을 활성화, 비활성화 또는 사용자 정의로 구성할 수 있음
  • requirements
    • Linux Kernel 5.4 or higher
    • OpenSSH server 1.8.1 or higher
      (Older versions of OpenSSH Server may work correctly, however it has not been tested)

Install

  • Test ENV
    • Type : VM (on KVM)
    • OS : Rocky 9.2
    • Kernel : 5.14.0-284.11.1.el9
    • OpenSSH : openssh-server-8.7p1-29.el9_2
    • Sshlog : sshlog-1.0-0
  • Install
    (아래 내용 복사 후 터미널에 붙여 넣기)
echo """
[sshlog-redhat]
name=sshlog-redhat
baseurl=https://repo.sshlog.com/sshlog-redhat
enabled=1
repo_gpgcheck=1
gpgkey=https://repo.sshlog.com/sshlog-redhat/public.gpg
""" > /etc/yum.repos.d/sshlog-redhat.repo
 
dnf install sshlog

Structure

config 디렉토리 구조

[root@rocky92 ~]# tree /etc/sshlog/
/etc/sshlog/
├── conf.d
│   ├── log_all_sessions.yaml
│   ├── log_events.yaml
│   └── motd_for_specific_user.yaml
├── plugins
└── samples
    ├── alert_slack_on_login.yaml
    ├── log_all_sessions.yaml
    ├── log_events.yaml
    ├── motd_for_specific_user.yaml
    ├── record_statistics.yaml
    ├── robot_voice_on_sudo.yaml
    └── send_to_syslog.yaml
 
3 directories, 10 files
  • conf.d
    • yaml 형태의 config 파일을 위치하면 동작하는 구조이다.
    • samples의 yaml을 conf.d에 복사 후 내용을 적절히 수정하여 sshlog daemon을 restart 하면 config가 반영되고 조건에 맞는 이벤트 발생 시 로깅 등의 action이 수행된다.
  • plugin
    • plugins 디렉토리에 파이썬 파일을 추가하여 사용자 정의하여 사용
    • filters, actions 두 가지 type의 사용자 정의 플러그인을 만들 수 있음
  • samples
    • conf.d에 적용 가능한 사전 정의된 sample yaml 파일들
  • eBPF는 특정한 이벤트가 트리거(ssh connect, fail, finish 등)될 때, 원하는 동작을 실행한다.
  • 프로세스가 특정한 eBPF Hook 지점을 지날 때, eBPF 프로그램이 동작한다.
  • eBPF Map에 실행 상태나 결과를 기록하고, 그 값을 user space에 공유할 수 있다.

Running

  • ssh 활동 event 로깅
- ssh 활동 event 기록 설정을 위한 yaml 파일
[root@rocky92 ~]# cat /etc/sshlog/conf.d/log_events.yaml | grep -v ^#
events:
  - event: log_general_activity
    triggers:
      - connection_established
      - connection_auth_failed
      - connection_close
      - command_start
      - command_finish
      - file_upload
    filters:
      ignore_existing_logins: True
    actions:
      - action: log_events
        plugin: eventlogfile_action
        log_file_path: /var/log/sshlog/event.log
        max_size_mb: 10
        number_of_log_files: 5
 
- 유저 접속 시 기록되는 event 로그 확인
특정 유저(mapoo)가 ssh 접속 시 발생되는 모든 event를 기록. bash 프로세스가 실행되고 profile 이 적용되는 과정들이 기록됨
[root@rocky92 ~]# cat /var/log/sshlog/event.log
2023-11-28 10:57:16 command_start          (1805) mapoo executed /bin/bash
2023-11-28 10:57:16 command_start          (1805) mapoo executed /usr/bin/id -un
2023-11-28 10:57:16 command_finish         (1805) mapoo execute complete (exit code: 0) /usr/bin/id -un
2023-11-28 10:57:16 command_start          (1805) mapoo executed /usr/bin/hostnamectl --transient
2023-11-28 10:57:17 command_finish         (1805) mapoo execute complete (exit code: 0) /usr/bin/hostnamectl --transient
2023-11-28 10:57:17 command_finish         (1805) mapoo execute complete (exit code: 0) /usr/libexec/grepconf.sh -c
2023-11-28 10:57:17 command_start          (1805) mapoo executed /usr/libexec/grepconf.sh -c
2023-11-28 10:57:17 command_finish         (1805) mapoo execute complete (exit code: 1) /usr/bin/grep -qsi ^COLOR.*none /etc/GREP_COLORS
2023-11-28 10:57:17 command_start          (1805) mapoo executed /usr/bin/grep -qsi ^COLOR.*none /etc/GREP_COLORS
2023-11-28 10:57:17 command_start          (1805) mapoo executed /usr/bin/dircolors --sh /etc/DIR_COLORS
2023-11-28 10:57:17 command_finish         (1805) mapoo execute complete (exit code: 0) /usr/bin/dircolors --sh /etc/DIR_COLORS
2023-11-28 10:57:17 command_start          (1805) mapoo executed /usr/bin/grep -qi ^COLOR.*none /etc/DIR_COLORS
2023-11-28 10:57:17 command_finish         (1805) mapoo execute complete (exit code: 1) /usr/bin/grep -qi ^COLOR.*none /etc/DIR_COLORS
2023-11-28 10:57:17 command_start          (1805) mapoo executed /usr/libexec/grepconf.sh -c
2023-11-28 10:57:17 command_start          (1805) mapoo executed /usr/bin/grep -qsi ^COLOR.*none /etc/GREP_COLORS
2023-11-28 10:57:17 command_finish         (1805) mapoo execute complete (exit code: 1) /usr/bin/grep -qsi ^COLOR.*none /etc/GREP_COLORS
2023-11-28 10:57:17 command_finish         (1805) mapoo execute complete (exit code: 0) /usr/libexec/grepconf.sh -c
2023-11-28 10:57:17 command_start          (1805) mapoo executed /usr/libexec/grepconf.sh -c
2023-11-28 10:57:17 command_start          (1805) mapoo executed /usr/bin/grep -qsi ^COLOR.*none /etc/GREP_COLORS
2023-11-28 10:57:17 command_finish         (1805) mapoo execute complete (exit code: 0) /usr/libexec/grepconf.sh -c
2023-11-28 10:57:17 command_finish         (1805) mapoo execute complete (exit code: 1) /usr/bin/grep -qsi ^COLOR.*none /etc/GREP_COLORS
2023-11-28 10:57:17 command_start          (1805) mapoo executed /usr/bin/locale
2023-11-28 10:57:17 command_finish         (1805) mapoo execute complete (exit code: 0) /usr/bin/locale
2023-11-28 10:57:17 command_start          (1805) mapoo executed /usr/bin/sed -r -e s/^[[:blank:]]*([[:upper:]_]+)=([[:print:][:digit:]\._-]+|"[[:print:][:digit:]\._-]+")/export \1=\2/;t;d /etc/locale.conf
2023-11-28 10:57:17 command_finish         (1805) mapoo execute complete (exit code: 0) /usr/bin/sed -r -e s/^[[:blank:]]*([[:upper:]_]+)=([[:print:][:digit:]\._-]+|"[[:print:][:digit:]\._-]+")/export \1=\2/;t;d /etc/locale.conf
2023-11-28 10:57:17 command_start          (1805) mapoo executed /usr/bin/readlink /proc/1817/exe
2023-11-28 10:57:17 command_finish         (1805) mapoo execute complete (exit code: 0) /usr/bin/readlink /proc/1817/exe
2023-11-28 10:57:17 command_start          (1805) mapoo executed /usr/bin/basename /usr/bin/bash
2023-11-28 10:57:17 command_finish         (1805) mapoo execute complete (exit code: 0) /usr/bin/basename /usr/bin/bash
2023-11-28 10:57:19 command_start          (1352) root executed /usr/bin/cat event.log
2023-11-28 10:57:20 command_finish         (1352) root execute complete (exit code: 0) /usr/bin/cat event.log
 
 
- 실시간 모니터링
[root@rocky92 ~]# sshlog watch
11:41:58 connection_established (2062) root from ip 211.249.71.117:52566 tty 4
11:41:58 command_start          (2062) root executed /bin/bash
11:41:58 command_start          (2062) root executed /usr/bin/id -un
~~ 이하 생략 ~~
  • → ssh event를 remote rsyslog 서버에 전달 가능 (send_to_syslog.yaml 사용)
    → 특정 ssh event 발생 시 slack webhook을 이용하여 메시지 알람 가능 (alert_slack_on_login.yaml 사용)

  • session 별 기록
- ssh 세션별 활동 기록 설정을 위한 yaml 파일
[root@rocky92 ~]# cat /etc/sshlog/conf.d/log_all_sessions.yaml | grep -v ^#
events:
  - event: stream_terminal
    triggers: ['connection_established', 'connection_close', 'terminal_update']
    filters:
      ignore_existing_logins: True
    actions:
      - action: log_all_sessions
        plugin: sessionlog_action
        log_directory: '/var/log/sshlog/sessions/'
        timestamp_frequency_seconds: 60
 
 
- 로그 파일들 확인 (ssh 세션별로 PID 파일명과 함께 기록)
[root@rocky92 ~]# ls -la /var/log/sshlog/sessions/
합계 14116
drwx------ 2 root root    4096 11월 29 10:57 .
drwx------ 3 root root      58 11월 29 10:54 ..
-rw-r--r-- 1 root root 1588011 11월 29 11:13 ssh_1352.log
-rw-r--r-- 1 root root 5801494 11월 28 15:56 ssh_30886.log
-rw-r--r-- 1 root root     168 11월 29 10:55 ssh_1767.log
 
- 특정 PID의 세션의 터미널로 발생된 모든 STDOUT을 기록
[root@rocky92 ~]# cat /var/log/sshlog/sessions/ssh_30886.log | more
 
[[ sshlog connection_established user: root at 2023-11-28T06:58:11.461000Z ]]
 
[[ sshlog time: 2023-11-28T06:58:12.046654Z ]]
Last login: Tue Nov 28 15:57:14 2023 from 211.249.71.117
root@rocky92:~[root@rocky92 ~]# [root@rocky92 ~]# sshlog attach 1
tput: symbol lookup error: tput: undefined symbol: _nc_tiparm
Attached to TTY 1.  Press CTRL+Q to exit
 
[root@rocky92~]# ps aux | gre[ [←][←]p attach
root       30930  0.4  0.0   2900  1000 pts/3    S+   15:58   0:00 sshlog attach 0
root       30931  1.1  1.5 209284 27900 pts/3    Sl+  15:58   0:00 sshlog attach 0
root       30940  1.0  0.0   2900  1000 pts/0    S+   15:58   0:00 sshlog attach 1
root       30941  2.2  1.5 209284 27904 pts/0    Sl+  15:58   0:00 sshlog attach 1
root       30950  0.0  0.1   4860  2204 pts/1    S+   15:58   0:00 grep --color=auto attach
root@rocky92:~[root@rocky92 ~]# [root@rocky92 ~]# [root@rocky92 ~]# ping yahoo.co.kr
PING yahoo.co.kr (54.161.105.65) 56(84) bytes of data.
 
--- yahoo.co.kr ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1010ms
 
root@rocky92:~[root@rocky92 ~]# [root@rocky92 ~]# pign[←][←]ng 1.1
PING 1.1 (1.0.0.1) 56(84) bytes of data.
64 bytes from 1.0.0.1: icmp_seq=1 ttl=50 time=4.39 ms
64 bytes from 1.0.0.1: icmp_seq=2 ttl=50 time=5.13 ms
64 bytes from 1.0.0.1: icmp_seq=3 ttl=50 time=5.08 ms
64 bytes from 1.0.0.1: icmp_seq=4 ttl=50 time=4.73 ms
64 bytes from 1.0.0.1: icmp_seq=5 ttl=50 time=4.76 ms
64 bytes from 1.0.0.1: icmp_seq=6 ttl=50 time=4.63 ms
64 bytes from 1.0.0.1: icmp_seq=7 ttl=50 time=4.46 ms
64 bytes from 1.0.0.1: icmp_seq=8 ttl=50 time=4.63 ms
64 bytes from 1.0.0.1: icmp_seq=9 ttl=50 time=4.45 ms
64 bytes from 1.0.0.1: icmp_seq=10 ttl=50 time=5.36 ms
 
- active session 확인
[root@rocky92 ~]# sshlog sessions
User        Last Activity            Last Command              Session Start                Client IP              TTY
root           just now          /usr/bin/tput reset        2023-11-28 22:58:54        211.249.71.117:30025         0
root           just now          /usr/bin/tput reset        2023-11-29 10:55:52        211.249.71.117:22240         1
root           just now          /usr/bin/tput reset        2023-11-29 11:32:35        211.249.71.117:10439         2
root           just now           /usr/bin/uname -p         2023-11-29 11:36:07        211.249.71.117:29332         3
  • ssh session attach
    다른 tty session을 현재의 tty에 attach 하여 sync 가능
    (별도의 설정은 필요 없음)

eBPF - sshlog
태그:     

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다