[Rocky 9]logrotate가 어떻게 작동하는지 알아봅시다

log관리는 Linux서버 취약점 분석 항목 중의 하나로, 주로 rsyslog 및 logrotate 패키지를 통해 관리되고 있습니다. CentOS 8에서는 cron에서 logrotate를 관리했었는데(/etc/cron.daily/logrotate), Rock 9 Linux에서는 systemd를 통해서 관리하는 것으로 변경되었네요. logrotate가 systemd를 통해 어떻게 작동하는지 알아보겠습니다.

  1. logrotate 패키지로부터 설치된 파일 및 디렉터리 확인
    – 패키지 분석을 하려면 먼저 설치된 파일 및 디렉터리를 확인하는 습관부터 가져야 합니다.
    – 아래 파란색으로 구분된 logrotate.service 및 logrotate.timer 파일이 systemd를 통해서 관리하기 위한 파일입니다.
    [root@rocky9u2 ~]# dnf repoquery -l logrotate
    /etc/logrotate.conf ▶ 로그 로테이션 환경 설정 파일 /etc/logrotate.d /etc/logrotate.d/btmp /etc/logrotate.d/wtmp /etc/rwtab.d/logrotate /usr/lib/.build-id /usr/lib/.build-id/27 /usr/lib/.build-id/27/36ee0e1572992ce3d94cd4bf9cbd463b09d158 /usr/lib/systemd/system/logrotate.service /usr/lib/systemd/system/logrotate.timer /usr/sbin/logrotate /usr/share/doc/logrotate /usr/share/doc/logrotate/ChangeLog.md /usr/share/licenses/logrotate /usr/share/licenses/logrotate/COPYING /usr/share/man/man5/logrotate.conf.5.gz /usr/share/man/man8/logrotate.8.gz /var/lib/logrotate /var/lib/logrotate/logrotate.status ▶ 각 로그 파일별 로테이션이 이루어진 마지막 날짜 확인
  2. logrotate.service 및 logrotate.timer의 상태 확인
    – logrotate.service는 비활성화되어 있지만, 활성화된 logrotate.timer에 의한 트리거되고 있는 것을 확인할 수 있습니다.
    – systemd는 timer와 service 파일 이름에서 관계를 유추하여 이들을 연결합니다. 명시적인 참조가 없어도 파일 이름과 위치에 따라 적절한 서비스를 실행하게 됩니다.
    [root@rocky9u2 ~]# systemctl status logrotate.service
    logrotate.service - Rotate log files Loaded: loaded (/usr/lib/systemd/system/logrotate.service; static) Active: inactive (dead) since Fri 2023-11-17 00:00:00 KST; 15h ago TriggeredBy: [0m logrotate.timer Docs: man:logrotate(8) man:logrotate.conf(5) Process: 8319 ExecStart=/usr/sbin/logrotate /etc/logrotate.conf (code=exited, status=0/SUCCESS) Main PID: 8319 (code=exited, status=0/SUCCESS) CPU: 17ms Nov 17 00:00:00 rocky9u2 systemd[1]: Starting Rotate log files... Nov 17 00:00:00 rocky9u2 systemd[1]: logrotate.service: Deactivated successfully. Nov 17 00:00:00 rocky9u2 systemd[1]: Finished Rotate log files.
    [root@rocky9u2 ~]# systemctl status logrotate.timer
    [0m logrotate.timer - Daily rotation of log files Loaded: loaded (/usr/lib/systemd/system/logrotate.timer; enabled; preset: enabled) Active: active (waiting) since Wed 2023-11-15 07:56:23 KST; 2 days ago Until: Wed 2023-11-15 07:56:23 KST; 2 days ago Trigger: Sat 2023-11-18 00:00:00 KST; 8h left Triggers: logrotate.service Docs: man:logrotate(8) man:logrotate.conf(5) Nov 15 07:56:23 rocky9u2 systemd[1]: Started Daily rotation of log files.
  3. logrotate.service의 설정 사항 확인
    – Type=oneshot: 한 번만 실행되고 완료되는 서비스
    – ExecStart: 서비스를 시작할 때 실행되는 명령어를 나타내는 지시자
    [root@rocky9u2 ~]# systemctl cat logrotate.service
    # /usr/lib/systemd/system/logrotate.service [Unit] Description=Rotate log files Documentation=man:logrotate(8) man:logrotate.conf(5) RequiresMountsFor=/var/log ConditionACPower=true [Service] Type=oneshot ExecStart=/usr/sbin/logrotate /etc/logrotate.conf ..... MORE .....
  4. logrotate.timer의 설정 사항 확인
    – OnCalendar=daily: 매일 한 번 실행
    – AccuracySec=1h: 시스템이 부팅된 후 1시간 이내에 실행
    – Persistent=true: 타이머가 예정된 시간에 실행되지 않았을 경우 시스템이 다시 부팅되면 그 다음에 실행
    [root@rocky9u2 ~]# systemctl cat logrotate.timer
    # /usr/lib/systemd/system/logrotate.timer [Unit] Description=Daily rotation of log files Documentation=man:logrotate(8) man:logrotate.conf(5) [Timer] OnCalendar=daily AccuracySec=1h Persistent=true [Install] WantedBy=timers.target
  5. 마지막으로 로그 로테이션 환경 설정 파일(/etc/logrotate.conf 및 /etc/logrotate.d
    / 디렉터리에 저장된 파일
    )에서 주로 사용하는 지시자에 대해 알아보겠습니다.

    /var/log/log_filename1
    /var/log/log_filename2
    /var/log/file_matching
    {
        missingok                          ▷ 로그 파일이 존재하지 않아도 오류를 발생시키지 않도록 하는 역할
        daily | weekly | monthly | yearly  ▷ 로그 회전 주기
        rotate 숫자                        ▷ 설정한 숫자의 로그 파일 유지
        size 크기                          ▷ 로그 파일이 설정한 크기(예, 100M)에 도달하면 로그 회전
        minsize 크기                       ▷ 로그 파일이 설정한 크기(예, 1M)보다 작으면 로그 회전을 하지 않음
        create 퍼미션 소유자 그룹           ▷ 새로운 로그 파일의 접근 권한, 소유자, 그룹 설정 
        compress | delaycompress | nocompress     ▷ 압축 여부 설정
        extension 확장자                   ▷ 로그 파일의 확장자 지정
        dateext                            ▷ 회전된 로그 파일의 이름에 날짜 추가(로그파일명-yyyymmdd)
        dateformat -%d%m%Y                 ▷ dateext의 디폴트 포맷(yyyymmdd)를 사용하지 않을 때 지정
        notifempty                         ▷ 파일 크기가 0이면 로그 회전하지 않음
        ifempty                            ▷ 파일 크기가 0이라도 로그 회전함(default)
        copytruncate                       ▷ 원본 로그 파일을 복사하고, 원본 로그 파일을 비우는 설정(zero size)
        mail email_address                 ▷ 로그 파일을 회전시킨 후에 특정 이메일 주소로 알림을 보내도록 설정
        maxage 숫자                         ▷ 특정 로그 파일을 유지할 최대 기간(일)을 설정
        olddir /path/to                    ▷ 회전된 로그 파일을 저장할 디렉터리 설정
        sharedscripts                      ▷ 모든 로그 회전이 완료된 이후 prerotate와 postrotate를 한 번만 실행
        prerotate                          ▷ 각 로그 파일의 회전 이전에 실행되는 스크립트 파일 설정
            /path/to/pre_script_file
        endscripts
        postrotate                         ▷ 각 로그 파일의 회전 이후에 실행되는 스크립트 파일 설정
            /path/to/post_script_file
        endscript
    }
    

You may also like...

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다