[리눅스마스터 1급] 이기적 이론서 9회차 정리 - 시스템 분석
🏁 이기적 이론서 학습 범위
- PART 01 리눅스 시스템 관리
- CHAPTER 03 시스템 보안 및 관리 (SECTION 01 시스템 분석)
시스템 분석
☑️ 시스템 로그 개요 및 분석
시스템 로그
- 설명
- 리눅스 시스템은 부팅 후 시스템이 동작하는 동안 실행하는 애플리케이션과 각종 이벤트를 위한 로그 정보가 시간 순으로 파일에 저장된다.
- 리눅스 로그는
/var/log
디렉터리 아래에 텍스트 파일 형식으로 저장된다. syslogd
나rsylogd
와 같은 시스템 데몬에 의해 생성된다.- 레드햇 7 계열 이후에서는
systemd-journald
와rsyslogd
데몬에 의해 로그가 관리된다.systemd-journald
는 부팅 시점부터 각 유닛에서 발생하는 모든 로그를 바이너리 타입으로 저널에 저장하며, 이 데이터는 시스템이 리부팅하면 사라진다.rsyslogd
는 수집된 로그를 설정된 규칙에 따라 각 로그 파일에 저장한다.
- 로그 확인하기
/var/log
로 이동하여ls
명령어로 어떤 로그 파일이 있는지 확인한다.- 레드햇 계열의 대표적 시스템 로그 파일은
/var/log/messages
, 데비안 계열은/var/log/syslog
이다.
- 레드햇 계열의 대표적 시스템 로그 파일은
$ ls /var/log
less
명령어로 로그 파일 확인을 위해 루트 권한이 필요하다.- 로그는 날짜 및 시간, 호스트명, 프로세스명, PID, 메시지 순으로 기록된다.
$ sudo less /var/log/messages
- 시스템 로그의 마지막 5줄만 확인한다.
$ sudo tail -f -n 5 /var/log/messages
주요 시스템 로그 파일
로그파일 | 설명 |
---|---|
/var/log/messages | - 전체 시스템의 모든 동작 사항과 정보 메시지와 이벤트가 로그로 남겨진다. - 데비안 계열은 /var/log/syslog 이다. |
/var/log/secure | - 시스템의 로그인 행위에 대해 성공, 실패, 인증 과정 로그가 기록된다. - 데비안 계열은 /var/log/auth.log 이다. |
/var/log/boot.log | 부팅 시 발생하는 메시지와 부팅 정보가 로그로 기록된다. |
- 이하 생략
시스템 로그 파일 명령어
- dmesg
- 커널 링 버퍼를 제어하거나 출력한다.
- 옵션없이 사용하면 기본으로 커널 링 버퍼의 모든 메시지를 출력한다.
형식
dmesg [options]
옵션
옵션 설명 -c, —read-clear 커널 링 버퍼의 내용을 출력 후 지운다. -l, —level - 주어진 레벨만 출력한다.
- alert, crit, err, warn, sgfault 레벨이 존재한다.-T, —ctime 사람이 읽을 수 있는 형식, 즉 시간 및 날짜 형식으로 타임스탬프를 출력한다. 예제
$ dmesg # 커널 링 버퍼의 모든 메시지 출력 $ dmesg -level=err. warn # 에러 레벨이 에러와 경고인 메시지만 출력 $ dmesg -T # 로그 메시지 중 타임스탬프 정보를 시간, 날짜 형식으로 변환하여 보여줌 $ dmesg -c # 커널 링 버퍼를 모두 출력하고 비움
- lastlog
/var/log/lastlog
파일의 마지막 로그 정보인 로그인 이름, 포트, 로그인 시간을 출력한다.형식
lastlog [optons]
옵션
옵션 설명 -b, —before 지정 날짜보다 오래된 로그인을 출력한다. -t, —time 지정 날짜보다 최근 로그인을 출력한다. -u, —user 지정 사용자의 로그만 출력한다. 예제
$ lastlog # 로그 확인 $ lastlog -u francis # 지정한 francis라는 사용자의 로그만 출력 $ lastlog -t 1 # 최근 1일 이내의 로그만 출력 $ lastlog -b 1 # 하루가 지난 로그만 출력
- last
/var/log/wtmp
파일 생성 후 모든 사용자의 로그인, 로그아웃 기록을 출력한다.- 옵션을 설정하여 특정 사용자의 기록만 열람 가능하다.
형식
last [options][username ...]
옵션
옵션 설명 -n num - 몇 줄을 출력할지 지정한다.
--num
옵션을 사용해도 동일한 기능을 수행한다.-R 호스트명은 출력하지 않는다. -a - 출력 결과의 마지막 컬럼에 호스트명 필드를 추가하여 출력한다.
--d
옵션과 함께 사용하면 유용하다.-d - 외부 로그인에 한하여 원격 컴퓨터의 IP 주소뿐 아니라 호스트명도 저장한다.
- 가능하면 IP 주소를 호스트명으로 바꿔 출력한다.-x 시스템의 shutdown
로그와 실행 레벨 변화를 출력한다.-f file /var/log/wtmp
대신 지정한 파일을 보여준다.-t YYYYMMDDHHMMSS - 지정한 시간의 로그인 기록을 출력한다.
- 특정 시간의 로그인 기록을 확인하는데 유용하다.-F 로그인과 로그아웃의 시간, 날짜 등 모든 정보를 출력한다. -i -d
옵션과 같이 원격 컴퓨터의 호스트명 대신 IP 주소를 출력한다.-w 사용자의 전체 이름과 전체 도메인 이름을 출력한다. 예제
$ last # /var/log/wtmp가 생성된 이후 로그 출력 $ last reboot | less # 시스템이 reboot한 시간 출력 $ last -x | less # 시스템이 shutdown한 시간 출력 $ last francis # 특정 사용자의 마지막 로그인 로그 출력 $ last -5 # 최근 기준 5줄만 출력 $ last -f /var/log/wtmp.1 # 지정한 파일인 /var/log/wtmp.1을 출력
- lastb
last
와 유사하지만,/var/log/btmp
로그 파일의 내용을 바탕으로 시스템의 모든 로그인 실패 기록을 출력한다.- 명령어의 형식, 옵션, 예제는
last
와 동일하다.
☑️ 시스템 로그 관리
시스템 로그 관리
- 시스템 로그의 생성 및 관리
- 리눅스 초기에는
syslog
패키지를 통해 로그를 수집했으나, 최근에는 원격 로깅 기능이 있는rsyslog
패키지가 인기가 더 많다. - 레드햇 계열 6.5부터는
syslogd
가 기본 탑재되었다.
- 리눅스 초기에는
- syslog
- 1980년대 sendmail 프로젝트 일부로 에릭 알만이 개발했다.
- 로그 파일에 로그를 출력하는 기능을 수행하는
syslogd
데몬이 필요하다. /etc/syslog.conf
설정 파일 기반/var/log
디렉터리에 로그를 생성한다.
- rsyslog
- 2004년 레이너 게르하드를 주축으로 한 오픈소스 프로젝트로 시작되었고, IP 통신을 통한 로그 기능 구현을 목적으로 했다.
/sbin/rsylogd
데몬을 통해 로그 기능을 수행하며 로컬에서는 초당 1만 개의 메시지를 전달할 수 있다./etc/rc.d/init.d/syslogd
스크립트를 통해 부팅 시 데몬이 시작된다.
/etc/rsylog.conf
설정 파일 기반/var/log
에 로그를 생성한다.- 멀티스레드를 지원하고, TCP, SSL, TLS, RELP 프로토콜을 지원한다.
- MySQL, PostgreSQL, Oracle과 같은 데이터 베이스도 지원한다.
- 로그 목록 제한, 로그 필터링, 다양한 출력 포맷 기능을 제공한다.
rsylog를 통한 로그 관리
rsyslog(the rocket-fast system for log processing) 설정 및 시작
$ sudo rpm -qv rsyslog # rsylog가 설치되어 있는지 확인 $ sudo yum install rsyslog # 없다면 설치 $ vi /etc/rsyslog.conf # /etc/rsyslog.conf 파일을 통해 로그 생성 규칙 설정 (아래 설정을 찾아서 주석 해제하기) # Provides UDP syslog reception $ModLoad imudp $UDPServerRun 514 # 바로 아래 로그 생성 템플릿을 지정 # /var/log/rsylog 디렉터리 이하에 IP 주소, 로그메시지, 년, 월, 일 형식으로 로그파일 생성 $ template FILENAME."/var/log/rsyslog/%fromhost-ip%_messages_%$YEAR%-%$MONTH%-%$DAY%.log" *,*?FILENAME $ sudo /etc/init.d/rsylog restart # rsylogd 재시작
rsyslog 관련 파일
파일명 설명 /etc/rc.d/init.d/rsyslog - 시스템 시작될 때 rsyslogd 데몬을 실행하는 스크립트
- start, stop, restart 옵션을 사용하여 스크립트를 시작, 중지, 재시작할 수 있다./etc/rsyslog.conf rsyslogd 데몬의 환경설정 파일 /etc/sysconfig/rsyslog - rsyslogd
데몬 실행 시 옵션을 설정한다.
-rsyslog v3
부터는 옵션을 사용하지 않고rsyslog.conf
설정 파일을 사용한다.
- 이전 버전 호환성을 위해rsyslogd
의-c
옵션을 통해v3
보다 낮게 지정하면 옵션을 사용할 수 있다./sbin/rsyslogd rsyslogd
데몬의 파일 경로/etc/rsyslog.conf 파일
기본구조
섹션 설명 Global directives - rsyslog 데몬의 전역 설정을 할 수 있다.
- ex. 메시지 큐 크기를 설정하거나 외부 모듈을 로드Templates - 로그 메시지의 형식을 템플릿으로 보관한다.
- Rules 섹션에서 이 템플릿은 사용 가능하다.Output channels - 출력 채널에 대한 세부 설정을 저장해놓고 Rule 섹션에서 규칙마다 다른 출력 채널을 지정한다.
- 형식은‘$출력채널이름. 파일이름. 최대크기. 최대크기 시 실행할 명령어’
Rules(selector + action) - 로그 출력 규칙 설정
- 한 줄에 하나의 규칙을 지정하고, 형식은 selector와 action 필드로 구성된다.Rules 섹션의 각 Rule은 selector와 action으로 구성되고, selector는 다시 facility와 priority로 구성된다.
facility.priority action
- 하나의 priority에 대해 facility는
.
를 통해 여러 개 설정이 가능하다. selector는
,
를 통해 여러 개 지정이 가능하다.Rules 섹션 구성요소 설명 facility - 로그 메시지를 발생하는 프로그램
-.
**를 통해 여러 개의 facility를 지정할 수 있다.
- facility 종류: auth, authpriv, cron, daemon, kern, lpr, mail, mark, news, security(auth와 동일), syslog, user, uucp, local0 ~ local7 중 하나이다.priority - 로그 메시지의 수준 - 지정한 수준보다 높은 수준의 메시지만 출력
- 수준이 높을수록 priority 값은 작다.
- priority 값 앞에=
를 지정하면 해당 수준만 출력하고!
를 지정하면 지정한 수준 외의 로그만 출력한다.action - selector에 선택된 로그에 대한 액션을 지정
- 보통은 로그 파일을 지정- priority가 가질 수 있는 수준은 아래와 같다.
값이 작을수록 우선순위가 높다.
level priority 설명 8 none - 지정한 우선순위가 없음 - facility에 .none
을 설정하면 해당 facility는 로그메시지를 출력하지 않는다.7 debug 디버깅 메시지 6 info 정보 메시지 5 notice 알림 메시지 4 warning, warn 경고 메시지 3 error, err 에러 메시지 2 crit 중요 메시지 1 alert 시스템을 사용할 수 있지만 위험이 발생했다는 메시지 0 emerg, panic 시스템을 더 이상 운용할 수 없다는 상태를 알리는 메시지 action은 보통 로그파일을 지정하지만 네트워크로 메시지를 전달하는 등의 설정이 가능하다.
action 설명 file 지정한 파일에 로그를 기록한다. @host UDP 프로토콜을 사용하여 지정한 호스트로 메시지를 전달한다. @@host TCP 프로토콜을 사용하여 지정한 호스트로 메시지를 전달한다. omusmsg:user 지정한 사용자가 로그인한 터미널로 전달한다. omusrmsg:* 현재 로그인되어 있는 모든 사용자의 터미널로 전달한다. 콘솔 또는 터미널 지정한 터미널로 메시지를 전달한다. 예제
# ;를 통해 2개의 셀렉터 설정되어 있음 # 하나는 모든 facility의 crit 수준의 메시지만 /var/log/critical 파일에 로그를 기록 # 또 다른 하나는 user 서비스의 경우 로그 메시지를 출력하지 않음 *.=crit;user.none /var/log/critical # 모든 facility에 대해 alert 이상 메시지 발생 시 모든 사용자에게 로그 전달 *.alert omusrmsg:* # facility가 cron이 발생하는 모든 로그를 root 및 francis 사용자의 터미널로 전송 cron.* omusrmsg:root.francis # authpriv가 발생한느 모든 로그를 /dev/tty1 터미널로 전송 authpriv.* /dev/tty1 # mail이 발생하는 로그 중 debug를 제외한 모든 로그 메시지를 /var/log/mail-messages에 기록 mail.*;,mail.!=debug /var/log/mail-messages # auth와 authpriv가 발생하는 로그 메시지 중 alert 이상 메시지만 192.168.0.1 호스트에게 UDP 프로토콜을 사용하여 전달 # 기본 포트는 514이다. auth.authpriv.alert @192.168.0.1
로테이션을 통한 로그 용량 관리
- logrotate
- 로그파일로 인해 시스템의 저장소가 꼭 차는 것을 막고 디스크 공간을 효율적으로 사용할 수 있도록 설계한 시스템 관리자를 위한 유틸리티
- cron에 의해 하루에 한 번 등록된 스크립트를 실행한다.
/etc/logrotate.conf
환경설정을 읽어서/usr/sbin/logrotate
명령을 실행하고 있고, 실행이 실패하면/usr/sbin/logrotate
를 통해 오류 메시지를 로그로 남긴다.
- logrotate 환경설정하기
/etc/logrotate.conf
를 통해 시스템 전체에 대한 환경설정을 하거나 개별 서비스를 위해/etc/logrotate.d
에 환경설정을 할 수 있다.logrotate.conf
의 기본 구성# 매주 로그 파일을 로테이트한다. # daily, weekly, monthly, 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 그룹 속성을 갖는다. 단, 1달이 경과되지 않았더라도 용량이 1M가 넘으면 로테이트함 /var/log/wtmp { monthly create 0664 root utmp maxsize 1M rotate 1 } # /var/log/btmp는 매월 로테이트를 1회 수행하고 생성된 로그 파일은 0600 퍼미션, root 사용자, utmp 그룹의 속성을 갖는다. # 로그 파일이 없으면 에러를 출력하지 않고 다음 파일로 넘어간다. /var/log/btmp { missingok monthly create 0600 root utmp rotate 1 }
로테이션 이력 확인하기
# /var/lib/logrotate.status 파일에 각 로그파일별 로테이션이 이루어진 날짜 확인 가능 $ cat /var/lib/logrotate/logrotate.status
journalctl을 통한 로그 관리
- systemd에서 제공하는 커널 및 저널 로그를 관리하기 위한 명령어이다.
형식
journalctl [OPTIONS]
예제
$ journalctl # 모든 로그 출력 $ journalctl -r # 모든 로그를 역순으로 출력 $ journalctl -n 3 # 지정한 수만큼 로그 출력 $ journalctl -p warning # 지정한 우선순위 이상의 모든 로그 출력 $ journalctl -b # 시스템 부팅 이후의 로그 출력 # 특정 날짜 이후 로그 출력 # today, yesterday, tomorrow와 같은 단어 및 "YYYY-MM-DD HH:MM:SS" 형식의 날짜 및 시간을 직접 입력 가능 $ journalctl - since=today # 특정 기간의 로그 출력 $ journalctl --since=2021-01-01 --until=2021-01-31