Linux

시스템 분석

laughcryrepeat 2020. 9. 12. 23:31

시스템 로그 개요 및 분석

 

1) 시스템 로그의 개요

 

  • 리눅스 시스템은 동작하는 동안 실행하는 어플리케이션과 이벤트를 위한 로그정보가 시간순으로 파일에 저장됨.
  • 대부분 /var/log 디렉터리 아래에 텍스트 형식 파일로 저장.
  • syslogd 나 rsyslogd 와 같은 시스템 데몬에 의해 로그파일이 생성됨.

로그 확인

  • /var/log 디렉터리로 이동해 로그파일 확인 가능
  • 레드행 대표적 로그파일 /var/log/messages, 데비안 /var/log/syslog
  • less 명령어로 로그파일 확인
  • 시스템 로그의 마지막 5줄만 확인
    $sudo tail -f -n 5 /var/log/messages

2) 주요 시스템 로그파일

  •  어플리케이션 로그, 이벤트 로그, 서비스 로그, 시스템 로그
/var/log/messages 전체 시스템의 모든 동작 사항과 정보 메시지와 이벤트가 로그로 남겨짐
(데비안 계열은 /var/log/syslog)
/var/log/secure 시스템 로그인에 대한 성공, 실패, 인증과정에 대한 로그 기록.
(데비안 계열은 /var/log/secure)
/var/log/boot.log 부팅시 발생하는 메시지와 부팅 정보가 로그로 기록
/var/log/mail.log 메일 서버에서 발생하는 로그를 기록.
sendmail, dovecot 등의 메일 서비스와 smtpd와 같은 데몬이 로그를 기록.
/var/log/kern 커널에서 발생하는 각종 에러 및 경고 로그와 정보 로그가 기록
사용자 커널 개발 시 문제점을 해결할 때 도움이 된다.
/var/log/dmesg 디바이스 드라이버가 남기는 로그가 저장되는 파일
보통 dmesg 명령어를 통해 로그를 확인할 수 있음.
/var/log/faillog 로그인 실패 시 로그가 기록
무차별 대입공격과 같은 해킹에 대해 간단히 점검
/var/log/cron cron 데몬이 예약 작업 수행시 발생하는 로그가 기록
/var/log/yum.log yum 명령어를 통해 패키지 설치, 삭제 등 명령 수행시 로그가 기록
/var/log/httpd/ 웹 서버 아파치의 httpd 데몬이 기록하는 로그 파일
/var/log/mysql.log 데이터베이스 mysql 데몬이 기록하는 로그 파일
/var/log/xferlog FTP 접속과 연관된 로그파일
/var/log/lastlog 각 사용자의 마지막 로그인 기록을 보관
바이너리 형식으로 lastlog 명령어로 로그를 확인
/var/log/wtmp 각 사용자의 매 로그인과 로그아웃 기록을 보관
last 명령어로 확인
/var/log/btmp 모든 로그인 실패 기록을 보관
바이너리 형식 lastb 명령어로 확인
/var/log/utmp 사용자의 현재 로그인 상태를 보관

 

3) 시스템 로그 파일 명령어

 

1. dmesg

커널 링 버퍼 kernel ring buffer를 제어하거나 출력하는 명령

 

2. lastlog

/var/log/lastlog 파일의 마지막 로그 정보인 로그인 이름, 포트, 로그인 시간이 출력

 

3. last

/var/log/wtmp 파일이 생성된 이후로 모든 사용자의 로그인, 로그아웃 기록을 출력.

옵션을 설정하여 특정 사용자의 기록만 열람 가능.

 

4. lastb

last 명령어와 유사.

/var/log/btmp 로그 파일의 내용을 바탕으로 시스템의 모든 로그인 기록을 출력.

명령어의 형식, 옵션, 예제는 last와 동일

 


 

시스템 로그 관리

 

1) 시스템 로그 관리 개요

 

1. 시스템 로그의 생성 및 관리

리눅스 초기에는 syslog 패키지를 통해 로그를 수집하였으나

최근엔 원격 로깅기능이 있는 rsyslog 패키지를 씀.

 

2. syslog

로그파일에 로그를 출력하는 기능을 수행하는 syslogd 데몬이 필요

/etc/syslog.conf 설정 파일 기반 /var/log 디렉터리에 로그를 생성

 

3. rsyslog

the rocket-fast system for log processing

IP통신을 통한 로그 기능 구현을 목적으로 함

/sbin/rsyslogd 데몬을 통해 로그 기능을 수행하며 로컬에서는 초당 1만개의 메시지 전달

/etc/rc.d/init.d/syslogd 스크립트를 통해 부팅시 데몬이 시작

/etc/rsyslog.conf 설정 파일 기반 /var/log 디렉터리에 로그를 생성.

멀티쓰레드를 지원하고 TCP, SSL, TLS, RELP 프로토콜을 지원. 

데이터베이스도 지원. 로그목록 제한, 로그 필터링, 다양한 출력 포맷 기능 제공.

 

2) rsyslog를 통한 로그관리

 

1. 설정 및 시작

  1. rsyslog 가 설치되어 있는지 확인하고 없다면 설치
    $sudo rpm -qv rsyslog
    $sudo yum install rsyslog
  2. /etc/rsyslog.conf 파일을 통해 로그 생성 규칙을 설정.
    설정을 찾아서 주석 #을 해제
    $vi /etc/rsyslog.conf
  3. 바로 아래 로그 생성 템플릿을 지정.
    /var/log/rsyslog 디렉터리 이하에 IP 주소, 로그 메시지, 년, 월, 일 형식으로 로그 파일을 생성
    $template FILENAME,"/var/log/rsyslog/%fromhost-ip%_messages_%$YEAR%-%$MONTH%-%DAY%.log" *.*?FILENAME
  4. rsyslogd 를 재시작
    $sudo /etc/init.d/rsyslog restart

 

2. rsyslog 관련 파일

/etc/rc.d/init.d/rsyslog 시스템이 시작될 때 rsyslogd 데몬을 실행하는 스크립트
start, stop, restart 옵션을 사용해 스크립트 시작, 중지, 재시작
/etc/sysconfig/rsyslog rsyslog 데몬을 실행할 때 옵션을 설정
rsyslog v3 부터는 옵션을 사용하지않고 rsyslog.conf 설정파일을 사용
이전버전 호환성을 위해 -c 옵션을 통해 버전을 v3보다 낮게 지정해 옵션을 사용
/sbin/rsyslogd rsyslog 데몬의 파일 경로

 

3. /etc/rsyslog.conf 파일

rsyslog 데몬의 환경설정 파일

Gloval directives rsyslog 데몬의 전역 설정
메시지 큐 크기 $MainMessageQueueSize 를 성정하거나 외부모듈$MoLoad 로드
Templates 로그 메시지의 형식을 템플릿으로 보관
Rules 섹션에서 이 템플릿을 사용
Output channels 템플릿처럼 출력 채널에 대한 세부 설정을 저장해 놓고 Rule 섹션에서 규칙마다 다른 출력 채널을 지정.
형식은 '$출력채널이름, 파일이름, 최대크기, 최대크기 시 실행할 명령어'
Rules(selector + action) 로그 출력 규칙을 설정
한줄에 하나의 규칙을 지정, 형식은 selector 와 action 필드로 구성
selector는 다시 facility와 priority로 구성.

 

하나의 priority에 대해 facility는 ',' 를 통해 여러개 설정이 가능.

Rules 섹션 구성요소 설명
facility 로그 메시지를 발생하는 프로그램을 지칭.
','를 통해 여러개의 facility를 지정.
종류는 auth, authpriv, cron, daemon, kern, lpr, mail, mark, news, security, syslog, user, uucp, local0 ~ local7
priority 로그 메시지의 수준
지정한 수준보다 높은 수준의 메시지만을 출력
수준이 높을수록 priority 값은 작음.
수준이 높을수록 =을 지정하면 해당 수준만 출력하고 ! 을 지정하면 지정한 수준 외의 로그만 출력
action selector에 선택된 로그에 대한 액션을 지정
보통은 로그 파일을 지정.

priority가 가질수 있는 수준

8 none 지정 우선순위 없음.
facility는 로그 메시지를 출력하지 않음.
7 debug 디버깅 메시지
6 info 정보 메시지
5 notice 알림 메시지
4 warning.warn 경고 메시지
3 error, err 에러 메시지
2 crit 중요 메시지
1 alert 시스템을 사용할 수 있지만 위험이 발생했다는 메시지
0 emerg, panic 시스템을 더 이상 운용할 수 없는 상태를 알리는 메시지

 

action은 보통 로그 파일을 지정하지만 네트워크로 메시지를 전달하는 등 그외의 설정이 가능

file 지정한 파일에 로그를 기록
@host 지정한 호스트로 메시지를 전달
user 지정한 사용자가 로그인한 터미널로 전달
* 현재 로그인되어 있는 모든 사용자의 터미널로 전달
콘솔 또는 터미널 지정한 터미널로 메시지를 전달

 

예제

;를 통해 2개의 셀렉터가 설정.

하나는 모든 facility의 crit 수준의 메시지만 /var/log/critical 파일에 로그를 기록.

또 다른 하나는 user 서비스의 경우 로그 메시지를 출력하지 않음.

*.=crit;user.none          /var/log/critical

auth 와 authpriv 가 발생하는 로그 메시지 중 alert 이상 메시지만 192.168.0.1 호스트에게 전달. 기본포트는 514

auth,authpriv.alert         @192.168.0.1

 

3) 로테이션을 통한 로그 용량 관리

 

1. logrotate 명령어 설명

 

- 로그파일로 인해 시스템의 저장소가 차는것을 막고 디스크 공간을 효율적으로 사용할 수 있도록 설계한 시스템 관리자를 위한 유틸리티.

로그를 위한 하드디스크를 추가하거나 파티션을 마련하여 /var 지점으로 마운트하여 사용하는 방법도 있으나

logrotate는 좀 더 간편하게 로그의 범람을 관리. 

 

- 기본적으로 cron에 의해 하루에 한번 등록된 스크립트를 실행.

/etc/logrotate.conf 환경설정을 읽어 /usr/sbin/logrotate 명령을 실행.

실행이 실패하면 /usr/sbin/logrotate를 통해 오류 메시지를 로그로 남김

$sudo cat /etc/cron.daily/logrotate
#!/bin/sh
/usr/sbin/logrotate /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
    /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0

 

2. logrotate 환경설정하기

 

- /etc/logrotate.conf를 통해 시스템 전체에 대한 환경설정을 하거나 개별 서비스를 위해 /etc/logrotate.d에 환경설정.

 

- logrotate.conf의 기본 구성

#매주 로그파일을 로테이트
# daily, weekly, yearly를 사용
weekly

#최대 4번의 로테이트를 수행
#logfile, logfile.1, logfile.2, logfile.3, logfile.4 와 같이 로그 파일이 생성
rotate 4

#각 로테이션을 마치고 빈 로그 파일을 생성
create

#각 로그 파일의 마지막에 날짜를 붙임.
dateext

#로그 파일을 압출한다.
compress

#지정한 경로의 환경설정 파일도 읽어서 로테이트를 적용한다.
include /etc/logrotate.d

#특정 로그에 대해서만 설정 가능. 아래는 /var/log/wtmp 로그 파일에 대한 설정.
#매달 로테이트를 최대 1회 실시. 로그파일은 0664 퍼미션, root 사용자, utmp 그룹 속성을 가짐. 용량이 1M 넘으면 로테이트.
/var/log/wtmp {
    monthly
    create 0664 root utmp
minsize 1M
    rotate 1
}

#/var/log/btmp는 매월 로테이트를 1회 수행하고 생성된 로그 파일은 0600 퍼미션, root 사용자, utmp 그룹의 속성을 가짐. 로그파일이 없으면 에러를 출력하지 않고 다음 파일로 넘어감.
/var/log/btmp {
    missingok
    monthly
    create 0600 root utmp
    rotate 1
}

#system-specific logs may be alse be confidured here.

 

3. 로테이션 이력 확인하기

/var/lib/logrotate.status 파일에 각 로그 파일별 로테이션이 이루어진 날짜를 확인.

$cat /var/lib/logrotate.status

 

logrotate state -- version2
"/var/log/ConsoleKit/history" 2019-9-2
...