[Centos 7] Linux Log 관리 (who, last, lastb, lastlog, tail, Psacct Tool, logrotate)

2022. 12. 4. 18:35리눅스(Linux)

$ Linux Log의 특징
   - 리눅스 로그의 특징은 일반적인 텍스트 형식의 로그와 바이너리 형식의 로그 2가지의 형태의 로그가 존재한다.
   - 이러한 특징에 의해 분석하는 로그의 종류에 따라 사용하는 명령어가 다르다.
   - 리눅스 로그분석은 로그파일의 위치와 해당 로그파일을 분석할 때 사용하는 명령어를 연결하여 학습하는 것이 중요하다.
   - 일반적으로 리눅스에서는 서비스관련 로그기록은 해당 서비스를 구성할때 같이 정의하게 된다

 

$ 로그의 종류

   - 텍스트 형식의 로그분석 명령어 [ "vi , cat , tail , head" 등 ]
   - 바이너리 형식의 로그분석 명령어 [ "last , w , who" 등 ]

 

Linux 주요 Log 분석
$ UTMP 로그 파일

# who
root tty1 2019-01-30 08:57 (:0)
root pts/0 2019-01-30 08:57 (:0.0)
   - 로그인 계정, 터미널 장치명, Login 시간, Login 위치
   - 현재 로그인 한 사용자의 정보를 담고있는 로그 파일이며, 원본 위치는 "/var/log/utmp" 파일이다.
   - 바이너리 형식이며, 내용 확인을 위해서는 "who" 명령어를 사용


$ WTMP 로그 파일

# last root
root pts/0 :0.0 Sat Feb 9 17:03 still logged in 
root tty1 :0 Sat Feb 9 17:03 still logged in 
root pts/0 :0.0 Wed Jan 30 08:57 - down (10+08:03) 
root tty1 :0 Wed Jan 30 08:57 - down (10+08:04) 

# last whitehacker
whitehac tty7 :1 Sat Feb 9 16:59 - down (00:01)
   - 로그인 계정, 터미널 장치명, Login 위치, Login 시간
   - 사용자의 성공한 로그인/로그아웃 정보를 담고 있는 로그파일이며, 원본 위치는 "/var/log/wtmp" 파일이다.
   - 바이너리 형식이며, 내용 확인을 위해서는 "last" 명령어를 사용
   - 접속시간 및 접속 한 곳의 IP정보등을 표시한다.
   - 사용자별 정보 확인이 가능하다, 그냥 last 명령어만 사용 한 경우 전체정보가 표시


$ BTMP 로그 파일

# lastb
whitehac tty7 :1 Sat Feb 9 16:59 - 16:59 (00:00) 
   - 실패 한 로그인 정보를 담고있으며, 원본 위치는 "/var/log/btmp" 파일이다.
   - 바이너리 형식이며, 내용 확인을 위해서는 "lastb" 명령어를 사용
   - 접속시간 및 접속 한 곳의 IP정보등을 표시한다.
   - 사용자별 정보 확인이 가능하다.


$ LAST 로그 파일

# lastlog -t 5
사용자이름 	 	 포트 	 어디서 		최근정보
root 			 pts/1 	  192.168.1.1   토 2월 9 17:13:49 +0900 2019
whitehacker		 pts/2	  192.168.1.1 	토 2월 9 17:13:57 +0900 2019

# lastlog -u root
사용자이름 		포트 		어디서 		최근정보
root 			pts/1 	  192.168.1.1 	토 2월 9 17:13:49 +0900 2019
   - 가장 최근에 성공한 로그인 정보를 담고있으며, 원본 위치는 "/var/log/lastlog" 파일이다.
   - 바이너리 형식이며, 내용 확인을 위해서는 "lastlog" 명령어를 사용
   - 접속시간 및 접속 한 곳의 IP정보등을 표시한다.
   - 사용자별 정보 확인 및 날짜를 지정하여 최근 기록을 확인 할 수 있다

 

$ SECURE 로그 파일

# tail -5 /var/log/secure
Feb 9 17:13:49 localhost sshd[3168]: pam_unix(sshd:session): session opened for user root by (uid=0)
Feb 9 17:13:57 localhost sshd[3189]: Accepted password for whitehacker from 192.168.1.1 port 4299 ssh2
Feb 9 17:13:57 localhost sshd[3189]: pam_unix(sshd:session): session opened for user whitehacker by (uid=0)
Feb 9 17:14:39 localhost sshd[3189]: pam_unix(sshd:session): session closed for user whitehacker
Feb 9 17:14:40 localhost sshd[3168]: pam_unix(sshd:session): session closed for user root
   - 원격 로그인 정보를 담고있으며, 파일의 위치는 "/var/log/secure" 파일이다.
   - 일반 텍스트 형식이며, 내용 확인을 위해서는 "tail 혹은 tail -f"를 주로 사용.
   - tail 명령을 사용하는 이유는 가장 최신의 로그는 밑에 저장 되기때문이다.
   - tail -f를 이용하면, 실시간으로 생성되는 로그정보를 확인 할 수 있다.


$ MESSAGE 로그 파일

# tail -5 /var/log/messages
Feb 9 17:53:53 localhost dhclient: bound to 192.168.1.141 -- renewal in 786 seconds.
Feb 9 18:00:41 localhost ntpd[2148]: synchronized to 13.209.0.242, stratum 2
Feb 9 18:06:59 localhost dhclient: DHCPREQUEST on eth2 to 192.168.1.254 port 67
Feb 9 18:06:59 localhost dhclient: DHCPACK from 192.168.1.254
Feb 9 18:06:59 localhost dhclient: bound to 192.168.1.141 -- renewal in 711 seconds.
   - 시스템 운영에 대핚 전반적인 정보를 담고있으며, 파일의 위치는 "/var/log/message" 파일이다.
   - 시스템 데몬 실행 상황 및 내역등을 확인 할 수 있다.
   - 일반 텍스트 형식이며, 내용 확인을 위해서는 "tail 혹은 tail -f"를 주로 사용.


$ Psacct Tool 활용

# rpm -qa psacct
psacct-6.3.2-63.el6.i686

# service psacct start
프로세스 어카운팅 시작 중:		 [ OK ]

# chkconfig psacct on
   - Psacct Tool이 자동 실행 되도록 설정
   - Psacct Tool은 기본적으로 패키지는 설치가 되어있으며, 데몬 시작은 수동으로 진행 해주어야 핚다.
   - Psacct Tool은 사용자가 수행중인 작업, 실행중인 명령, 시스템에서 사용중인 리소스의 양, 
   시스템에서 얼마나 오랜 시간동안 사용자가 활성 상태인지를 모니터링하는데 효과적이다.
   - 또한 Apache, MySQL, FTP, SSH 등과 같은 서비스에 의해 소비되는 
   시스템의 리소스를 모니터링 하는데에도 사용된다. ( 우리는 "로그 정보"만 활용 )

# ac -d root
Nov 8 	 total	0.22
Jan 19	 total 	12.14
Jan 30	 total 	45.41
Today 	 total 	470.53

# ac -d whitehacker
Today	 total 	0.99
   - 사용자가 얼마나 오랜 시간 동안 활성 상태인지를 확인하기 위해서는 "ac" 명령어를 사용한다.
   - 기본 출력 값은 "시간 단위"로 출력이되며, "-d" 옵션은 일자별 출력을 의미한다. 
   - 사용자 이름을 입력하지 않을 경우 모든 사용자의 활성시간 정보가 합산되어 출력된다.
   
# lastcomm ls
ls 		 root 		pts/0 		0.00 secs Sat Feb 9 18:28
ls		 root		pts/0 		0.00 secs Sat Feb 9 18:28
ls 		 whitehac 	pts/1		0.00 secs Sat Feb 9 18:20
ls		 root 		pts/0		0.00 secs Sat Feb 9 18:19
ls		 root 		pts/0		0.00 secs Sat Feb 9 18:19

# lastcomm root
lastcomm 		 root pts/0 	0.00 secs Sat Feb 9 18:23
lastcomm		 root pts/0 	0.00 secs Sat Feb 9 18:22
lastcomm		 root pts/0 	0.00 secs Sat Feb 9 18:22

# lastcomm whitehacker
rm          whitehac pts/1      0.00 secs Sat Feb 9 18:22
mkdir       whitehac pts/1      0.00 secs Sat Feb 9 18:22
ls          whitehac pts/1      0.00 secs Sat Feb 9 18:20
   - 명령어 사용기록 확인을 위해서는 "lastcomm" 명령어를 사용한다.
   - 특정 명령어의 사용기록을 확인 할 수 있으며, 사용자 별 명령어 사용내역도 확인이 가능하다.
   - Psacct Tool의 기록은 "/var/account/pacct" 파일에서 저장 한다. ( 바이너리 형식 )
   
[ 참고 ]
# lastcomm whitehacker -f /var/account/pacct-20190210
   - logrotate에 의해 로그기록이 Rotate되어있을 경우 "-f" 옵션을 사용하여 
   이전 로그기록을 저장하는 파일을 지정하여 확인이 가능하다

Linux Log 관리 

   - 리눅스 운영체제에서는 로그관리를 "logrotate"로 관리한다.
   - logrotate는 로그관리를 자동으로 진행해주는 도구이며, 각종 설정에따라 관리방법을 다르게 설정 할 수 있다

 

$ "logrotate" 동작과정 정리

1. "/etc/cron.daily/logrotate" 에서 "/usr/sbin/logrotate" 호출 한다.
2. 호출 된 logrotate를 실행 시 "/etc/logrotate.conf" 설정파일을 참조하여 logrotate 설정값을 Load 한다.
   - "/etc/logrotate.conf" 설정 파일에 정의 된 "Include /etc/logrotate.d" 설정에 의해 "/etc/logroate.d/" 디렉터리를 호출
   - "/etc/logroate.d/" 디렉터리 속 정의되어있는 각 서비스 별 logrotate 설정정보도 함께 Load 한다.

 

# vi /etc/anacrontab
# /etc/anacrontab: configuration file for anacron
# See anacron(8) and anacrontab(5) for details.
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45 
  - Random으로 부여되는 지연시간 값 설정 
  - EX : 45로 설정 될 경우 0~45분 사이에 랜덤 한 지연값을 설정 한다.
  - 실제 설정라인에서 정의되는 Delay 값과 합산되어 최종적인 Delay값이 완성 된다.

# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22 
   - Anacrontab을 수행 한 시간을 범위 형태로 지정 ( default : "3시 ~ 22시" 사이 )
   
#period in days      delay in minutes     job-identifier         command
1                     5                     cron.daily          nice run-parts /etc/cron.daily
7                     25                    cron.weekly         nice run-parts /etc/cron.weekly
@monthly              45                    cron.monthly        nice run-parts /etc/cron.monthly
   - nice 명령어는 프로세스의 우선순위 확인을 위한 명령어
   - run-parts 명령어의 경우 특정 디렉터리내의 존재하는 스크립트 파일을 실행시킬때 사용하는 명령어
   - 시스템 활성화 후 "nice run-parts /etc/cron.daily" 명령어가 1일이상 실행되지 않았을 경우 
   ( "Random Delay(0~45) + 5분" ) 후에 해당 명령어의 프로세스 우선순위를 확인 후 실행
   
# ls -l /etc/cron.daily/
-rwxr-xr-x. 1 root root 118 2010-11-11 13:03 cups
-rwxr-xr-x. 1 root root 196 2010-11-12 05:46 logrotate
-rwxr-xr-x. 1 root root 905 2010-11-12 05:45 makewhatis.cron
-rwxr-xr-x. 1 root root 174 2009-05-20 15:03 mlocate.cron
-rwxr-xr-x. 1 root root 2126 2010-04-23 23:34 prelink
-rwxr-xr-x. 1 root root 563 2010-08-23 18:35 readahead.cron
-rwxr-xr-x. 1 root root 365 2009-10-16 14:52 tmpwatch
   - "/etc/cron.daily" 디렉터리는 anacrontab에 의해 실행되는 Shell Script 파일이 정의되어있다.
   - 이러한 설정들에 의해 "logrotate"는 주기적으로 실행된다
   
# vi /etc/cron.daily/logrotate
#!/bin/sh
/usr/sbin/logrotate /etc/logrotate.conf > /dev/null 2 > &1
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
 /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0
   - "logrotate"의 스크립트를 내용을 확인하면, "/usr/sbin/logrotate /etc/logrotate.conf"에 의해 logrotate를 실행하게 된다.
   - 나머지 부분의 스크립트의 내용은 "Cron" 실행 시 오류가 발생하게 될 경우 화면에 오류메시지를 띄어주기위한 코드이다.

# which logrotate 
/usr/sbin/logrotate
   - logrotate 데몬의 경로
   
# vi /etc/logrotate.conf 
# rotate log files weekly
weekly
   - Log Rotate의 기본 주기 값 정의 ( daily : 일 , weekly : 주 , monthly : 월 )

# keep 4 weeks worth of backlogs
rotate 4
   - Log Rotate의 기본 횟수 정의 ( 로그 파일이 4개 이상일 경우 가장 먼저 생성 된 파일부터 삭제 )

# create new (empty) log files after rotating old ones
create
   - Log Ratate 시 새로운 파일을 생성하여 로그 정보를 저장

# use date as a suffix of the rotated file
dateext
   - Log Ratate 시 기존 로그 파일명에 Rotate를 수행 할 날짜 값을 명시

# uncomment this if you want your log files compressed
# compress
   - Log 파일을 gzip으로 압축하여 저장 할 것인지 결정 (default : 사용 안함)

# RPM packages drop log rotation information into this directory
include /etc/logrotate.d
   - RPM에 의해 설치 된 Service에 대한 로그 관리 설정 정보는 
   /etc/logrotat.d/ 디렉터리에 별도로 저장

# no packages own wtmp and btmp -- we'll rotate them here
   - wtmp, btmp 등의 로그 기록은 해당 설정 파일에서 설정 값을 정의
/var/log/wtmp {
 monthly
 create 0664 root utmp
   minsize 1M
 rotate 1
}

/var/log/btmp {
 missingok
 monthly
   create 0600 root utmp
 rotate 1
}
   - logrotate 설정 파일
   - 그 외의 추가적인 로그관리 설정 값 또한 정의가 가능하다

$ logrotate 옵션 정리

rotate ("N") Rotate File이 "N"개 이상 일 경우 삭제
maxage ("N")  Rotate File의 "N"일 이상 경과되었을 경우 삭제
size ("N{K,M}")  Log File의 용량이 지정한 크기만큼 채워졌을 경우 Rotate를 진행 [ "EX : 10M, 100M, 20K" ]
create ("권한") : Rotate시 새로 만들어지는 파일의 권한을 허가권 소유권 순으로 정의 [ "EX : 0600 root : root" ]
copytruncate  임시파일을 생성하여, 기존의 Log 내용을 복사한 뒤 해당 임시파일의 이름을 Rotate 설정에 맞게 변경
notifempty  Log File의 내용이 비어있을 경우 Rotate를 진행하지 않는다.
ifempty  Log File의 내용이 비어있을 경우에도 Rotate를 진행.
missingok  오류가 발생하더라도 다음 작업을 이어서 수행
daily, weekly, monthly  "일, 주, 월" 단위로 Rotate를 진행 한다.
compress   Rotate 된 Log File을 gzip 압축하여 저장
delaycompress  compress와 같이 사용 되며, 즉시 압축하지 않고 일정기간이 지난 뒤 압축을 진행
prerotate-endscript  해당 범위안에 포함되어있는 명령어를 rotate 전에 수행한다.
postrotate-endscript  해당 범위안에 포함되어있는 명령어를 rotate 이후에 수행한다.
extension  Rotate 후 생성 되는 새로운 파일에 대한 확장자를 지정
mail admin@mail  Rotate 설정에 의해 보관 주기가 끝난 파일을 지정 한 메일로 발송.
mailfirst admin@mail  Rotate 진행 시 새로 만들어진 신규파일 이전의 Log File을 지정 한 메일로 발송한다.
errors admin@mail  Rotate 진행 시 에러가 발생하면 지정 한 메일로 통보한다.
sharedscripts  하나의 서비스에 로그의 종류가 여러 개 일때 logrotate의 스크립트를 공유하도록 한다.
[ "Apache의 경우 Error, Access 로그를 따로 관리, EX : /var/log/httpd/*log" ]

$ logrotate 사용 예제

# vi /var/lib/logrotate/logrotate.status
logrotate state -- version 2
"/var/log/yum.log"     2019-1-29
"/var/log/boot.log"    2019-2-10
"/var/log/sssd/*.log"  2019-1-29
"/var/log/httpd/*log"  2019-2-10
"/var/log/wtmp"        2019-1-29
"/var/log/spooler"     2019-2-10
   - logroate 작업 내역을 저장 한다.
   
# ls -l /etc/logrotate.d 
-rw-r--r--. 1 root root 71 2010-11-11 13:03 cups
-rw-r--r--. 1 root root 136 2010-08-23 08:21 ppp
-rw-r--r--. 1 root root 329 2010-08-24 21:09 psacct
-rw-r--r--. 1 root root 219 2010-11-12 19:00 sssd
-rw-r--r--. 1 root root 228 2009-05-20 19:49 syslog
-rw-r--r--. 1 root root 95 2011-06-25 18:43 vsftpd
-rw-r--r--. 1 root root 100 2010-08-25 23:34 wpa_supplicant
-rw-r--r--. 1 root root 100 2011-04-29 21:19 yum
   - 특정 데몬에의해 관리되는 로그에 관한 logrotate 설정 값을 저장하고있는 파일 목록
   - 일반적으로 리눅스 시스템에 설치되는 각 서비스( Apache , vsftpd 등)에 관한 
   logrotate 설정은 "/etc/logrotate.d"디렉터리에 자동으로 저장된다.
   
# vi /etc/logrotate.d/psacct
# Logrotate file for psacct RPM
/var/account/pacct {
 compress
    - rotate 된 로그파일은 gzip으로 압축하여 관리
    
 delaycompress
    - compree 옵션과 같이 사용, rotate시 즉시 압축이 아닌 
    일정 기간을 두고 압축을 진행하도록 설정한다.
    
 notifempty
    -  만약 로그파일이 비어있을경우 rotate를 사용하지 않도록한다.
    
 daily 
    - 일 단위로 rotate를 수행
    
 rotate 31 
    - 최대 31개의 rotate 파일을 유지 
    - 31개 이상부터는 가장 이전의 rotate 파일을 삭제
    
 create 0600 root root
    -  rotate 시 새로운 파일을 생성, 이때 허가권 600 과 소유권 root:root의 값을 지정하여 생성
    
 postrotate
    /usr/sbin/accton /var/account/pacct 
    - accton 명령어는 Psacct Tool의 활성화 명령어 ( 즉, Psacct Tool 재시작을 의미한다. )
    
 endscript
    - postrotate ~ endscript ( 해당 범위안에 포함되어있는 명령어를 rotate 이후에 수행한다. )
}
  - 위에서 작업 한 Psacct Tool의 logrotate 설정 값 분석
  - 지정 되지 않은 옵션의 경우에는 "/etc/logrotate.conf"에서 지정 한 설정값이 기본값으로 설정 된다.

$ logrotate Rotate 로그 파일 이름부여 방식

# logrotate -f /etc/logrotate.conf
# ls -l /var/log/yum.log*
-rw------- 1 root root 0 2019-02-10 16:04 /var/log/yum.log
-rw-------. 1 root root 2794 2019-02-10 10:38 /var/log/yum.log-20190210
   - "logrotate -f /etc/logrotate.conf" 명령을 이용하여 강제로 logrotate를 수행한다.
   - 위 명령어를 수행 후 "/var/log/yum.log" 로그의 목록을 확인 할 경우 해당 
   로그파일이 Rotate가 된 것을 확인 할 수 있다.
   - Rotate 시 지정 된 이름 부여규칙에 따라 Rotate 된 파일의 이름이 설정 되는 것을 확인.

   - 일반적인 Rotate 짂행 시 기존의 로그파일의 이름만 변경하여 Rotate 작업을 진행한다.

( "각 서비스와 연결정보는 그대로 유지한다 [ i-node ]" )
   - 만약 Rotate 된 로그 파일이 지속적으로 서비스와 연결 정보를 유지 할 경우 새로 생성 된 로그파일에는 로그기록이 남지 않게 된다. 
   - 이러한 문제를 해결하기 위해서는 "copytruncate" 옵션을 사용 하거나 "postrotate ~ endscript" 옵션을 사용하여 서비스를 재시작 하도록 한다.

 

$ Copytruncate를 이용 한 Rotate 이름부여

   - Copytruncate 옵션을 사용 할 경우 logrotate 작업이 시작 되면, 임시파일을 생성 후 생성 된 임시파일에 기존 로그정보를 저장한다.
   - 복사 완료 후 임시파일의 이름을 logrotate 설정에 맞게 이름을 변경 후 기존의 로그파일의 내용을 삭제 한다.
   - 이러한 방법을 사용 할 경우 서비스의 재 시작없이 로그기록을 정상적으로 저장 할 수 있게된다.
   - Copytruncate를 사용하는 것은 좋은방법이지만, 한번에 많은 양의 로그기록을 복사 할 경우 복사 되는 동안의 로그의 유실 문제가 발생 할 위험이 있다.
   - 해당 문제를 해결하기 위해서는 시스템의 성능에 맞추어 Rotate 주기를 적절하게 설정하고, 각 서비스에서 제공 되는 로그기록에 관한 추가 기능들을 사용하여 로그유실을 방지 할 수 있다.

 

$ 실습 예제

   - lograte를 이용하여 Apache Web 서버의 로그 관리방법을 정의
   - Apache Web Server를 설치 후 자동으로 생성되는 Apache 관련 logrotate 파일을 문제조건에 맞게 수정

 

조건

1. Rotate 주기 ( "10M" ), 최대 10개의 Rotate 로그파일 저장
2. Rotate 된 로그파일은 즉시 압축, 서비스 재시작 안 함 ( 로그기록은 정상적으로 작성 )
3. Rotate 시 로그 파일이 비어있어도 Rotate를 수행
4. Rotate 시 오류가 발생하더라도 계속 다음작업을 수행
5. Apache의 Access Log, Error Log는 스크립트를 서로 공유 
- logrotate -f logrotate.conf 명령어를 이용하여 logrotate를 강제로 실행 후 결과 확인

# yum -y install httpd-*
# service httpd restart
httpd 를 정지 중:             [ 실패 ]
httpd (을)를 시작 중:         [ OK ]

# ls /etc/logrotate.d
cups httpd ppp psacct sssd syslog vsftpd wpa_supplicant yum

# vi /etc/logrotate.d/httpd
/var/log/httpd/*log {
 size 10M
 rotate 10
 compress
 copytruncate
 missingok
 ifempty
 sharedscripts
}

# logrotate -f /etc/logrotate.conf
# ls -l /var/log/httpd/
-rw-r--r-- 1 root root 0 2019-02-10 17:36 access_log
-rw-r--r-- 1 root root 20 2019-02-10 17:36 access_log-20190210.gz
-rw-r--r-- 1 root root 0 2019-02-10 17:36 error_log
-rw-r--r-- 1 root root 20 2019-02-10 17:36 error_log-20190210.gz