목차
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 파일을 위치하면 동작하는 구조이다.
- yaml 파일은 events, triggers, filters, actions 섹션으로 나뉘어져 있으며 각 섹션별로 사용 가능한 파라메터는 아래 document 페이지에서 확인 가능
https://github.com/sshlog/agent/blob/master/daemon/config_samples/readme.md
- yaml 파일은 events, triggers, filters, actions 섹션으로 나뉘어져 있으며 각 섹션별로 사용 가능한 파라메터는 아래 document 페이지에서 확인 가능
- samples의 yaml을 conf.d에 복사 후 내용을 적절히 수정하여 sshlog daemon을 restart 하면 config가 반영되고 조건에 맞는 이벤트 발생 시 로깅 등의 action이 수행된다.
- yaml 형태의 config 파일을 위치하면 동작하는 구조이다.
- 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