시스템 분석
시스템 로그 개요 및 분석
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. 설정 및 시작
- rsyslog 가 설치되어 있는지 확인하고 없다면 설치
$sudo rpm -qv rsyslog
$sudo yum install rsyslog - /etc/rsyslog.conf 파일을 통해 로그 생성 규칙을 설정.
설정을 찾아서 주석 #을 해제
$vi /etc/rsyslog.conf - 바로 아래 로그 생성 템플릿을 지정.
/var/log/rsyslog 디렉터리 이하에 IP 주소, 로그 메시지, 년, 월, 일 형식으로 로그 파일을 생성
$template FILENAME,"/var/log/rsyslog/%fromhost-ip%_messages_%$YEAR%-%$MONTH%-%DAY%.log" *.*?FILENAME - 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 |