[리눅스마스터 1급] 이기적 이론서 9회차 정리 - 시스템 분석

🏁 이기적 이론서 학습 범위

  • PART 01 리눅스 시스템 관리
    • CHAPTER 03 시스템 보안 및 관리 (SECTION 01 시스템 분석)

시스템 분석

☑️ 시스템 로그 개요 및 분석

시스템 로그

  • 설명
    • 리눅스 시스템은 부팅 후 시스템이 동작하는 동안 실행하는 애플리케이션과 각종 이벤트를 위한 로그 정보가 시간 순으로 파일에 저장된다.
    • 리눅스 로그는 /var/log 디렉터리 아래에 텍스트 파일 형식으로 저장된다.
    • syslogdrsylogd 와 같은 시스템 데몬에 의해 생성된다.
    • 레드햇 7 계열 이후에서는 systemd-journaldrsyslogd 데몬에 의해 로그가 관리된다.
      • 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.confrsyslogd 데몬의 환경설정 파일
    /etc/sysconfig/rsyslog- rsyslogd 데몬 실행 시 옵션을 설정한다.
    - rsyslog v3부터는 옵션을 사용하지 않고 rsyslog.conf 설정 파일을 사용한다.
    - 이전 버전 호환성을 위해 rsyslogd-c 옵션을 통해 v3보다 낮게 지정하면 옵션을 사용할 수 있다.
    /sbin/rsyslogdrsyslogd 데몬의 파일 경로
  • /etc/rsyslog.conf 파일

    • 기본구조

      섹션설명
      Global directives- rsyslog 데몬의 전역 설정을 할 수 있다.
      - ex. 메시지 큐 크기를 설정하거나 외부 모듈을 로드
      Templates- 로그 메시지의 형식을 템플릿으로 보관한다.
      - Rules 섹션에서 이 템플릿은 사용 가능하다.
      Output channels- 출력 채널에 대한 세부 설정을 저장해놓고 Rule 섹션에서 규칙마다 다른 출력 채널을 지정한다.
      - 형식은 ‘$출력채널이름. 파일이름. 최대크기. 최대크기 시 실행할 명령어’
      Rules(selector + action)- 로그 출력 규칙 설정
      - 한 줄에 하나의 규칙을 지정하고, 형식은 selector와 action 필드로 구성된다.
    • Rules 섹션의 각 Ruleselectoraction으로 구성되고, selector는 다시 facilitypriority로 구성된다.

        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가 가질 수 있는 수준은 아래와 같다.
    • 값이 작을수록 우선순위가 높다.

      levelpriority설명
      8none- 지정한 우선순위가 없음 - facility.none을 설정하면 해당 facility는 로그메시지를 출력하지 않는다.
      7debug디버깅 메시지
      6info정보 메시지
      5notice알림 메시지
      4warning, warn경고 메시지
      3error, err에러 메시지
      2crit중요 메시지
      1alert시스템을 사용할 수 있지만 위험이 발생했다는 메시지
      0emerg, panic시스템을 더 이상 운용할 수 없다는 상태를 알리는 메시지
    • action은 보통 로그파일을 지정하지만 네트워크로 메시지를 전달하는 등의 설정이 가능하다.

      action설명
      file지정한 파일에 로그를 기록한다.
      @hostUDP 프로토콜을 사용하여 지정한 호스트로 메시지를 전달한다.
      @@hostTCP 프로토콜을 사용하여 지정한 호스트로 메시지를 전달한다.
      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
    

© 2021. All rights reserved.

yaejinkong의 블로그