[SK shieldus Rookies 16기][클라우드기반 시스템 운영 및 구축] 리눅스 로그, syslog와 rsyslog, rsyslog 전송 및 수신 실습

Jina·2024년 1월 5일
0

SK shieldus Rookies 16기

목록 보기
50/59
post-custom-banner

1. 로그(Log)

1.1. 정의

  • 시스템의 모든 기록을 담고 있는 데이터
  • 성능, 오류, 경고 및 운영 정보 등의 중요 정보 기록

1.2. 특징

  • 특별한 형태의 기준에 따라 숫자와 기호 등으로 이루어짐
  • 로그를 분석하지 않고 그대로 활용하기는 어렵다. ⇒ 왜? 웹서버의 경우 하루 수백 메가에서 기가 단위의 로그가 쌓이기 때문에 대용량 로그를 일일이 살펴보기란 어렵다.

1.3. 로그 데이터의 중요성

  • 문제 원인 추적 및 예방
  • 오류, 보안 이슈 탐지
  • 시스템 예측 및 복구 지원
  • 침해 사고 근거 자료
  • 법적 의무 준수의 필수 요소

1.4. 로그 분석

  • 로그 데이터를 분석하여 필요로 하는 유용한 정보로 만드는 행위

1.5. 분석할 로그 종류

  1. 네트워크/보안 장비 로그
    • 방화벽
    • VPN
    • 라우터 / 스위치
    • IPS
    • IDS
  2. 서버/Endpoint/애플리케이션 로그
    • 서버
    • 이벤트
    • 애플리케이션

2. 리눅스 로그 종류

2.1. 텍스트 기반 로그

cat 으로 읽을 수 있다.

  • /var : 가변 데이터 저장소
  • /var/log : 로그 위치, 파일 유형(텍스트, 바이너리(설치파일) 형태)
  • /var/mailog : 시스템 상태 알림 로그
  • /var/log/secure : 인증 시스템 로그(PAM 등)
  • /var/log/boot.log : 시스템 부팅 로그
  • /var/log/cron : 작업 스케쥴링 로그
  • /var/log/httpd : 아파치 웹 서버 로그
  • /var/log/samba : 삼바 서버 로그
  • /var/log/maillog : 메일 서버 로그 (Sendmail, Postfix 등)
  • /var/log/xferlog : FTP 서버 로그 (VSFTP, Proftp 등)

💡 리눅스 로그는 분산 저장되어 있거나 중복 저장이 되어 있기 때문에 완벽하게 삭제가 어렵다.

✅ 바이너리 로그 명령어 반드시 숙지!!

2.3. 바이너리 로그

명령어를 이용해서 읽어야 한다.

/var/run/utmp

사용자의 현재 로그인 정보 기록

# 현재 시스템에 로그인한 모든 사용자 정보(사용자 이름, 로그인 시간, 로그인한 터미널 등)
$ who
webserver :0           2024-01-04 17:24 (:0)
webserver pts/0        2024-01-04 17:25 (:0)

# who의 정보 +@ 시스템 로드 정보, 시스템 가동시간
$ w
 21:41:56 up  4:18,  2 users,  load average: 0.25, 0.11, 0.10
USER     TTY        LOGIN@   IDLE   JCPU   PCPU WHAT
webserve :0        17:24   ?xdm?   6:49   0.32s gdm-session-worker [pam/gdm-password]
webserve pts/0     17:25    4.00s  4.81s  9.35s /usr/libexec/gnome-terminal-server

# user --- 실행안됨

# 특정 사용자의 정보
$ finger 사용자명

/var/log/wtmp

  1. 사용자 로그인/로그아웃, 시스템 종료, 부팅/재부팅, 정보 기록
  2. conole, telnet, ftp 통한 원격 로그인 정보
# 사용자 로그인 정보 확인(사용자 이름, 터미널, 시간과 날짜, 세션 지속시간)
$ last
webserve pts/0        :0               Thu Jan  4 17:25   still logged in   
webserve :0           :0               Thu Jan  4 17:24   still logged in   
(unknown :0           :0               Thu Jan  4 17:23 - 17:24  (00:01)    
reboot   system boot  3.10.0-123.el7.x Thu Jan  4 17:23 - 21:16  (03:53)    
webserve pts/0        :0               Thu Jan  4 15:37 - crash  (01:45)    
webserve pts/0        :0               Thu Jan  4 13:07 - 15:37  (02:29)    
webserve :0           :0               Thu Jan  4 13:07 - crash  (04:15)    
(unknown :0           :0               Thu Jan  4 13:06 - 13:07  (00:00)    
reboot   system boot  3.10.0-123.el7.x Thu Jan  4 13:06 - 21:16  (08:10)    
reboot   system boot  3.10.0-123.el7.x Thu Jan  4 12:29 - 13:06  (00:37) 

# 특정 사용자의 마지막 로그인 정보 확인
$ last 사용자이름
wtmp begins Thu Jan  4 12:29:15 2024

# 시스템이 재부팅한 날짜 확인
$ last reboot
reboot   system boot  3.10.0-123.el7.x Thu Jan  4 17:23 - 21:26  (04:03)    
reboot   system boot  3.10.0-123.el7.x Thu Jan  4 13:06 - 21:26  (08:20)    
reboot   system boot  3.10.0-123.el7.x Thu Jan  4 12:29 - 13:06  (00:37)    

wtmp begins Thu Jan  4 12:29:15 2024

# 마지막으로 재부팅된 시간 확인 -1 옵션은 last 명령어가 표시할 라인 수
$ last -1 reboot
reboot   system boot  3.10.0-123.el7.x Thu Jan  4 17:23 - 21:28  (04:05)

# 로그인/로그아웃 활동 이력 파일을 검색하여 해당 파일이 생성된 이후로 로그인한 모든 사용자의 목록 표시
# /var/log/wtmp 파일은 로테이션 파일이기 때문에 오래된 항목은 파일명 뒤에 .1처럼 숫자가 붙는다.
# last와 last -f /var/log/wtmp 명령어의 결과가 동일한 이유는 last가 /var/log/wtmp 파일을 검색하여 내용을 보여주기 때문에
$ last -f /var/log/wtmp.1

# 가장 최근에 로그인한 두 명의 사용자 정보 표시
$ last 2
wtmp begins Thu Jan  4 12:29:15 2024

/var/log/btmp

사용자의 로그인 실패 기록

$ lastb
btmp begins Thu Jan  4 17:23:09 2024

/var/log/lastlog

시스템 계정의 마지막 가장 최근 로그인 정보

$ lastlog
사용자이름       포트     어디서           최근정보
root             pts/0                     목  14 17:26:54 +0900 2024
bin                                        **한번도 로그인한 적이 없습니다**
daemon                                     **한번도 로그인한 적이 없습니다**
adm                                        **한번도 로그인한 적이 없습니다**
lp                                         **한번도 로그인한 적이 없습니다**
sync                                       **한번도 로그인한 적이 없습니다**
shutdown                                   **한번도 로그인한 적이 없습니다**
halt                                       **한번도 로그인한 적이 없습니다**
mail                                       **한번도 로그인한 적이 없습니다**
operator                                   **한번도 로그인한 적이 없습니다**
games                                      **한번도 로그인한 적이 없습니다**
ftp                                        **한번도 로그인한 적이 없습니다**
nobody                                     **한번도 로그인한 적이 없습니다**
dbus                                       **한번도 로그인한 적이 없습니다**
polkitd                                    **한번도 로그인한 적이 없습니다**
usbmuxd                                    **한번도 로그인한 적이 없습니다**
ntp                                        **한번도 로그인한 적이 없습니다**
saslauth                                   **한번도 로그인한 적이 없습니다**
libstoragemgmt                             **한번도 로그인한 적이 없습니다**
avahi                                      **한번도 로그인한 적이 없습니다**
avahi-autoipd                              **한번도 로그인한 적이 없습니다**
rpc                                        **한번도 로그인한 적이 없습니다**
rtkit                                      **한번도 로그인한 적이 없습니다**
chrony                                     **한번도 로그인한 적이 없습니다**
radvd                                      **한번도 로그인한 적이 없습니다**
colord                                     **한번도 로그인한 적이 없습니다**
apache                                     **한번도 로그인한 적이 없습니다**
rpcuser                                    **한번도 로그인한 적이 없습니다**
nfsnobody                                  **한번도 로그인한 적이 없습니다**
unbound                                    **한번도 로그인한 적이 없습니다**
qemu                                       **한번도 로그인한 적이 없습니다**
abrt                                       **한번도 로그인한 적이 없습니다**
pulse                                      **한번도 로그인한 적이 없습니다**
gdm              :0                        목  14 17:23:12 +0900 2024
gnome-initial-setup                           **한번도 로그인한 적이 없습니다**
pcp                                        **한번도 로그인한 적이 없습니다**
postfix                                    **한번도 로그인한 적이 없습니다**
sshd                                       **한번도 로그인한 적이 없습니다**
oprofile                                   **한번도 로그인한 적이 없습니다**
tcpdump                                    **한번도 로그인한 적이 없습니다**
webserver        :0                        목  14 17:24:40 +0900 2024

/usr/account/pacct

  1. 시스템에 로그인한 사용자가 실행한 프로그램 정보 기록
  2. 로그인해서 로그오프 할 때까지 입력 정보 등을 기록
    (※ 시스템 자원을 많이 소모하기 때문에 기본적으로 동작 X)
$ acctcom
$ lastcomm

💡 이 모든 로그들은 리눅스 로그 관리 패키지 syslogrsyslog 에 의해 저장되고 관리된다.

3. syslog와 rsyslog

3.1. 정의

  • 응용 프로그램 또는 커널에서 생성된 로그를 관리해주는 리눅스 로그 관리 패키지
  • 기존 syslog 를 확장시킨 버전이 rsyslog

3.2. 위치

/etc/syslog.conf
/etc/rsyslog.conf

$ ls /etc/syslog.*

3.3. /etc/rsyslog.conf 파일

규칙을 만들 때 고려해야하는 부분 - 어떤 문제가 생겼을 때 로그를 남길 것인가?

$ cat /var/log/secure
# 형식
[facility].[proiority]		   		[action]
  1. facility : 메세지를 발생시키는 프로그램 유형
    • 종류
      • cron : cron, at과 같은 스케줄링 프로그램이 발생한 메시지
      • auth, security : login과 같이 인증프로그램 유형이 발생한 메시지
      • authpriv : ssh와 같이 인증을 필요한 프로그램 유형이 발생한 메시지. 사용자 추가 시에도 메시지가 발생
      • daemon : telnet, ftp 등과 같이 여러 데몬이 발생한 메시지
      • kern : 커널이 발생한 메시지
      • lpr : 프린트 유형의 프로그램이 발생한 메시지
      • mail : mail 시스템이 발생한 메시지
      • mark : syslogd에 의해 만들어지는 날짜 유형
      • news : 유즈넷 뉴스 프로그램 유형이 발생한 메시지
      • syslog : syslog 프로그램이 유형이 발생한 메시지
      • user : 사용자 프로세스
      • uucp : UUCP(UNIX to UNIX Copy Protocol)시스템이 발생한 메시지. local0 ~ local7 여분으로 남겨둔 유형
      • * : 모든 facility를 의미
  2. proiority : 위험도
    • 종류
      • none : 로그로 기록 X
      • debug : 프로그램을 개발 또는 테스트 할 때 발생하는 메시지
      • info : 사용자가 알아둬야 할 기본정보 메시지
      • notice : 특별한 주의를 필요하나 에러는 아닌 메시지
      • warning, warn : 주의가 필요한 경고 메시지(무시해도 됨)
      • error, err : 처리가 필요한 에러 메세지. 소프트웨어 상에서 발생하는 오류 메시지
      • crit : 크게 급하지는 않지만 시스템에 문제가 생기는 단계의 메시지. 하드웨어 장치에 문제가 발생 시 생성
      • alert : 즉각적인 조정을 해야하는 상황에서 발생하는 에러 메세지. 시스템 DB에 손상 등 즉시 수정해야되는 상황
      • emerg, panic : 모든 사용자들에게 전달되는 패닉 상황. 블루스크린, 커널 패닉 등에서 발생
  3. action : 로그 기록 위치
    • 종류
      • file : 로그를 기록할 지정 파일
      • @host : 로그를 전달할 호스트
      • user : 지정한 사용자가 로그인한 경우 해당 사용자의 터미널로 전달
      • * : 현재 로그인되어 있는 모든 사용자의 화면으로 전달
      • 콘솔 또는 터미널 : 로그를 전달할 터미널

만약 kern.err 일 때 소프트웨어적인 이슈 뿐만 아니라 하드웨어 적인 부분도 기록한다. 왜? 일종의 계층이기 때문에 err 만 포함하지 않고 err 이후의 문제까지 모두 기록한다. `err, crit, alert, emerg 까지

💡 데몬이란? 백그라운드에서 돌아가는 프로세스

4. rsyslog 전송 및 수신 실습

실습환경구성(우분투, CentOS, Win10 설치)
NTP 서버와 클라이언트 동기화 실습

4.1. Server - SplunkServer

  1. rsyslog에 로그 규칙 설정
# rsyslog 설치 확인
$ dpkg -l *rsyslog*

# nano 편집기로 rsyslog 설정 파일 열기
$ nano /etc/rsyslog.conf

# 원격으로 오는 로그를 /var/log/192.168.10.0/client.log 에 기록
template remote-incoming-logs, "/var/log/192.168.10.0/client.log
*.*?remote-incoming-logs

# rsyslog.conf 에서 마지막 10줄 출력
$ tail /etc/rsyslog.conf

  1. 방화벽 설정하기
$ ufw allow 514/tcp

  1. rsyslog 재시작 후 상태확인
# rsyslog 재시작
$ systemctl restart rsyslog

# rsyslog 상태확인
$ systemctl status rsyslog

# rsyslog 자동실행 설정
$ systemctl enable rsyslog

  1. /var/log/192.168.10.0 디렉토리에 client.log 생성됐는지 확인

  1. TCP를 통해 로그 메세지를 수신하는 방법 부분 주석 제거

4.2. Client - ZeekIDS

  1. rsyslog.conf에 전송할 로그와 전송 방식 설정
    시스템에서 발생하는 모든 종류의 로그를 192.168.10.10:514로 TCP를 이용해 전송
$ nano /etc/rsyslog.conf

*.*@@192.168.10.10:514 # tcp 방식 전송하는 경우
*.*@192.168.10.10:514 # udp 방식 전송하는 경우

  1. rsyslog 재시작 후 상태확인
# rsyslog 재시작
$ systemctl restart rsyslog

# rsyslog 상태확인
$ systemctl status rsyslog

# rsyslog 자동실행 설정
$ systemctl enable rsyslog

4.3. Client - WebServer

  1. rsyslog.conf에 전송할 로그와 전송 방식 설정
    시스템에서 발생하는 모든 종류의 로그를 192.168.10.10:514로 TCP를 이용해 전송
$ gedit /etc/rsyslog.conf

*.*@@192.168.10.10:514 # tcp 방식 전송하는 경우
*.*@192.168.10.10:514 # udp 방식 전송하는 경우
  1. rsyslog 재시작 후 상태확인
# rsyslog 재시작
$ systemctl restart rsyslog

# rsyslog 상태확인
$ systemctl status rsyslog

# rsyslog 자동실행 설정
$ systemctl enable rsyslog

  1. rsyslog가 포함된 네트워크 연결 확인 및 514포트인 네트워크 연결 확인
$ netstat -natip | grep rsyslog
$ lsof -i tcp:514

4.4. Server에서 수신 확인

# 로그가 저장된 디렉토리로 이동
$ cd /var/log/192.168.10.0

# client.log에 저장된 기록 중 호스트명이 ZeekIDS인 것만 보기
$ cat client.log | gerp ZeekIDS

# client.log에 저장된 기록 중 호스트명이 WebServer 인 것만 보기
$ cat client.log | gerp WebServer

5. 과제

  1. /etc/rsyslog.conf 에 시스템 부팅되거나 종료되면 로그 작성하는 규칙 작성
# /etc/rsyslog.conf

daemon,mail.*;\
	news.=crit;news.=err;news.=notice;\
    *.=debug;*.=info;\
    *.=notice;*.=warn /var/log/boot.log
  1. rsyslog 재시작 및 상태 확인
# rsyslog 재시작
$ systemctl restart rsyslog

# rsyslog 상태확인
$ systemctl status rsyslog
  1. 작성된 로그 확인
$ cat /var/log/boot.log

profile
공부 기록
post-custom-banner

0개의 댓글