[Rocky 9]logrotate가 어떻게 작동하는지 알아봅시다
log관리는 Linux서버 취약점 분석 항목 중의 하나로, 주로 rsyslog 및 logrotate 패키지를 통해 관리되고 있습니다. CentOS 8에서는 cron에서 logrotate를 관리했었는데(/etc/cron.daily/logrotate), Rock 9 Linux에서는 systemd를 통해서 관리하는 것으로 변경되었네요. logrotate가 systemd를 통해 어떻게 작동하는지 알아보겠습니다.
- 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 ▶ 각 로그 파일별 로테이션이 이루어진 마지막 날짜 확인 - logrotate.service 및 logrotate.timer의 상태 확인
– logrotate.service는 비활성화되어 있지만, 활성화된 logrotate.timer에 의한 트리거되고 있는 것을 확인할 수 있습니다.
– systemd는 timer와 service 파일 이름에서 관계를 유추하여 이들을 연결합니다. 명시적인 참조가 없어도 파일 이름과 위치에 따라 적절한 서비스를 실행하게 됩니다.[root@rocky9u2 ~]# systemctl status logrotate.servicelogrotate.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. - 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 ..... - 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 - 마지막으로 로그 로테이션 환경 설정 파일(/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 }