[Linux]audit 패키지로 시스템의 감사(audit)와 감사 이벤트 Logging
리눅스 로그 총정리의 두 번째 글로, 오늘은 audit 패키지로 시스템의 감사(audit)와 감사 이벤트를 로깅하는 방법에 대해 알아보겠습니다. audit 패키지를 사용하면 시스템에서 발생하는 중요한 이벤트와 활동을 로그로 기록하고 검토할 수 있습니다. 주로 보안 감사, 규정 준수 확인, 시스템 모니터링 등에 활용됩니다.
패키지를 잘 이해하는 방법 중의 하나는 패키지에 포함되어 있는 환경 설정 파일들, 주요 명령어들을 확인하는 것입니다.
- 환경 설정 파일: auditd.conf
- 룰 저장 파일: /etc/audit/rules.d/audit.rules
- 데몬 파일: auditd
- 주요 명령어: aulast, aulastlog, auditctl, ausearch, aureport 등
- Sample Rule 파일들: /usr/share/audit/sample-rules/ 디렉터리에 저장되어 있음
[root@centos8 /]# rpm -ql audit /etc/audit /etc/audit/audit-stop.rules /etc/audit/audit.rules /etc/audit/auditd.conf /etc/audit/plugins.d /etc/audit/plugins.d/af_unix.conf /etc/audit/rules.d /etc/audit/rules.d/audit.rules /usr/bin/aulast /usr/bin/aulastlog /usr/bin/ausyscall /usr/bin/auvirt /usr/lib/.build-id /usr/lib/.build-id/17 /usr/lib/.build-id/17/71be751a2cbf8196497b9dab4db3dd4ab85f53 /usr/lib/.build-id/19 /usr/lib/.build-id/19/f6b29a1d619c92c54b56ebd98db0ad644365a2 /usr/lib/.build-id/48 /usr/lib/.build-id/48/669f4c034291174e4360ab889f4db2c2a053d8 /usr/lib/.build-id/49 /usr/lib/.build-id/49/5ef30c2c964684e3807901fa0dececd65f89a6 /usr/lib/.build-id/57 /usr/lib/.build-id/57/b2985c60aa08edb1f5e2d47bc18cb4f2ea31a3 /usr/lib/.build-id/c3 /usr/lib/.build-id/c3/bfc7b55a89e93fcfac4353d1f9833bea6906ab /usr/lib/.build-id/d2 /usr/lib/.build-id/d2/4eee0ca24fe9dc8baa7340b280fd789059a716 /usr/lib/.build-id/d3 /usr/lib/.build-id/d3/fe9865811d002177beecd6349801943cb718a3 /usr/lib/.build-id/d7 /usr/lib/.build-id/d7/eff7e6c5e2945ce34ce5f6e6a0b346c84596cb /usr/lib/systemd/system/auditd.service /usr/libexec/audit-functions /usr/libexec/initscripts/legacy-actions/auditd /usr/libexec/initscripts/legacy-actions/auditd/condrestart /usr/libexec/initscripts/legacy-actions/auditd/reload /usr/libexec/initscripts/legacy-actions/auditd/restart /usr/libexec/initscripts/legacy-actions/auditd/resume /usr/libexec/initscripts/legacy-actions/auditd/rotate /usr/libexec/initscripts/legacy-actions/auditd/state /usr/libexec/initscripts/legacy-actions/auditd/stop /usr/sbin/auditctl /usr/sbin/auditd /usr/sbin/augenrules /usr/sbin/aureport /usr/sbin/ausearch /usr/sbin/autrace /usr/share/audit /usr/share/audit/sample-rules /usr/share/audit/sample-rules/10-base-config.rules /usr/share/audit/sample-rules/10-no-audit.rules /usr/share/audit/sample-rules/11-loginuid.rules /usr/share/audit/sample-rules/12-cont-fail.rules /usr/share/audit/sample-rules/12-ignore-error.rules /usr/share/audit/sample-rules/20-dont-audit.rules /usr/share/audit/sample-rules/21-no32bit.rules /usr/share/audit/sample-rules/22-ignore-chrony.rules /usr/share/audit/sample-rules/23-ignore-filesystems.rules /usr/share/audit/sample-rules/30-nispom.rules /usr/share/audit/sample-rules/30-ospp-v42-1-create-failed.rules /usr/share/audit/sample-rules/30-ospp-v42-1-create-success.rules /usr/share/audit/sample-rules/30-ospp-v42-2-modify-failed.rules /usr/share/audit/sample-rules/30-ospp-v42-2-modify-success.rules /usr/share/audit/sample-rules/30-ospp-v42-3-access-failed.rules /usr/share/audit/sample-rules/30-ospp-v42-3-access-success.rules /usr/share/audit/sample-rules/30-ospp-v42-4-delete-failed.rules /usr/share/audit/sample-rules/30-ospp-v42-4-delete-success.rules /usr/share/audit/sample-rules/30-ospp-v42-5-perm-change-failed.rules /usr/share/audit/sample-rules/30-ospp-v42-5-perm-change-success.rules /usr/share/audit/sample-rules/30-ospp-v42-6-owner-change-failed.rules /usr/share/audit/sample-rules/30-ospp-v42-6-owner-change-success.rules /usr/share/audit/sample-rules/30-ospp-v42.rules /usr/share/audit/sample-rules/30-pci-dss-v31.rules /usr/share/audit/sample-rules/30-stig.rules /usr/share/audit/sample-rules/31-privileged.rules /usr/share/audit/sample-rules/32-power-abuse.rules /usr/share/audit/sample-rules/40-local.rules /usr/share/audit/sample-rules/41-containers.rules /usr/share/audit/sample-rules/42-injection.rules /usr/share/audit/sample-rules/43-module-load.rules /usr/share/audit/sample-rules/44-installers.rules /usr/share/audit/sample-rules/70-einval.rules /usr/share/audit/sample-rules/71-networking.rules /usr/share/audit/sample-rules/99-finalize.rules /usr/share/audit/sample-rules/README-rules /usr/share/doc/audit /usr/share/doc/audit/ChangeLog /usr/share/doc/audit/README /usr/share/doc/audit/auditd.cron /usr/share/licenses/audit /usr/share/licenses/audit/COPYING /usr/share/man/man5/auditd-plugins.5.gz /usr/share/man/man5/auditd.conf.5.gz /usr/share/man/man5/ausearch-expression.5.gz /usr/share/man/man7/audit.rules.7.gz /usr/share/man/man8/auditctl.8.gz /usr/share/man/man8/auditd.8.gz /usr/share/man/man8/augenrules.8.gz /usr/share/man/man8/aulast.8.gz /usr/share/man/man8/aulastlog.8.gz /usr/share/man/man8/aureport.8.gz /usr/share/man/man8/ausearch.8.gz /usr/share/man/man8/ausyscall.8.gz /usr/share/man/man8/autrace.8.gz /usr/share/man/man8/auvirt.8.gz /var/log/audit /var/run/auditd.state
먼저 audit 패키지의 환경설정 파일(/etc/audit/auditd.conf)에 설정되어 있는 주요 지시자들에 대해 알아보겠습니다.
- log_file: 로그 파일의 경로를 지정합니다.
–log_file = /var/log/audit/audit.log
- log_format: 로그 파일에 저장되는 방법을 지정합니다.
– RAW: kernel에서 보낸 정보와 동일한 형식으로 저장합니다.
– ENRICHED : 로그 파일에는 더 많은 메타데이터와 구조화된 정보가 추가됩니다.
–log_format = ENRICHED
- num_logs : “max_log_file_action = ROTATE”로 설정되어 있을 때 로그 파일의 최대 수를 지정합니다.
–num_logs = 5
- max_log_file : 로그 파일의 최대 크기를 설정합니다.(단위: MB)
–max_log_file = 8
- max_log_file_action : 로그 파일이 최대 크기에 도달했을 때의 동작을 설정합니다.
– IGNORE: audit 데몬이 아무것도 하지 않습니다.
– SYSLOG: syslog에 warn 이벤트를 발생시킵니다.
– SUSPEND: audit 데몬이 로그 기록을 멈추지만, 여전히 alive 상태입니다.
– ROTATE: audit 데몬이 로그 로테이션을 합니다.
– KEEP_LOGS: “num_logs” 지시자의 설정값을 사용하지 않고 로그 로테이션을 합니다.
–max_log_file_action = ROTATE
- space_left : 로그 파일이 저장된 파일 시스템에서 남은 공간이 얼마나 되어야 하는지 설정합니다.
– 숫자: MB단위로 남아 있어야 하는 저장 공간를 지정
– 숫자%: 남아 있어야 하는 저장 공간을 %로 지정
–space_left = 10%
- space_left_action : 로그 파일이 저장된 파일 시스템의 남은 공간이 부족할 때의 동작을 설정합니다.
– 가능한 옵션: ignore, syslog, rotate, email, exec, suspend, single, and halt
– exec /path/to/script.sh: 지정한 스크립트 파일을 실행
– half: audit 데몬이 컴퓨터 시스템을 shutdown시킴
–space_left_action = SYSLOG
- use_libwrap : TCP Wrapper 라이브러리(libwrap)를 사용하여 auditd 데몬의 액세스를 제어할지 여부를 결정합니다.
– /etc/hosts.allow 및 /etc/hosts.deny 파일을 통해 액세스를 허용 또는 거부
–use_libwrap = yes
시스템의 감사 Rule를 등록하고 감사 로그를 조회하는 명령어들에 대해 알아보겠습니다.
▣ aulast : last, lastb와 유사한 기능을 제공
- 옵션 :
--bad : 실패 로그인 이력 출력, lastb 명령어와 유사 -f /path/to/log_file : 지정한 로그 파일로부터 기록 조회 --stdin : 파이프 라인으로부터 들어온 입력(raw format, --raw) 사용하여 출력 --tty tty : 지정된 tty의 활동으로 제한, tty없이 숫자로만 지정 가능 --user name : 지정된 사용자로 제한
- 사용 예제 :
[root@centos8 ~]# ausearch --start this-month --raw | aulast --stdin root pts/1 192.168.56.100 Thu Feb 1 11:35 - 16:51 (05:15) root pts/1 192.168.56.101 Fri Feb 2 13:17 - 14:34 (01:16) root pts/2 192.168.56.101 Fri Feb 2 13:28 - 14:34 (01:05) root pts/1 192.168.56.100 Mon Feb 5 08:24 still logged in root pts/2 192.168.56.101 Mon Feb 5 13:11 still logged in root pts/3 192.168.56.101 Mon Feb 5 14:09 still logged in
▣ aulastlog : lastlog와 유사한 기능을 제공
- 옵션 :
--stdin : 파이프 라인으로부터 들어온 입력(raw format, --raw) 사용하여 출력 --user name : 지정된 사용자로 제한
- 사용 예제 :
[root@cent0s8 ~]# aulastlog | head -10 Username Port From Latest root /dev/pts/3 ? 02/05/2024 14:09:11 bin **Never logged in** daemon **Never logged in** adm **Never logged in** lp **Never logged in** sync **Never logged in** shutdown **Never logged in** halt **Never logged in** mail **Never logged in**
▣ auditctl : 감사 이벤트 규칙을 관리하는데 사용되는 명령어
- 감사 Rule 조회: auditctl -l (등록된 감사 Rule이 없으면 “No rules” 출력)
[root@centos8 ~]# auditctl -l No rules
- 파일 및 디렉터리의 감사 Rule 등록: auditctl -w [/path/to/file | /path/to/] -p [r|w|x|a] -k filter_key
-w [/path/to/file | /path/to/]: 감사 대상이 되는 파일 또는 디렉터리 지정
-p [r|w|x|a] : r=read, w=write, x=execute, a=attributes
-k filter_key: 감사 로그를 검색할 때 사용하는 Key
– 등록된 감사 Rule을 삭제하려면 -w 대신 -W 옵션으로 등록[root@centos8 ~]# auditctl -w /etc/hosts -p wa -k hosts_change [root@centos8 ~]# auditctl -w /etc/ssh/sshd_config -p wa -k sshd_change [root@centos8 ~]# auditctl -w /etc/passwd -p wa -k user_change [root@centos8 ~]# auditctl -w /root/confidential/ -p r -k conf_access [root@centos8 ~]# auditctl -l -w /etc/hosts -p wa -k hosts_change -w /etc/ssh/sshd_config -p wa -k sshd_change -w /etc/passwd -p wa -k user_change -w /root/confidential -p r -k conf_access [root@centos8 ~]# auditctl -l >> /etc/audit/rules.d/user.rules
- 파일 삭제 감사 Rule 등록 : auditctl -a always,exit -F arch=b64 -S unlink,unlinkat -F ‘auid=UID’ -F ‘auid!=-1’ -F key=filter_key
– 등록된 감사 Rule을 삭제하려면 -a 대신 -d 옵션으로 등록[root@centos8 ~]# auditctl -a always,exit -F arch=b64 -S unlink,unlinkat -F 'auid=0' -F 'auid!=-1' -F key=del_files_by_root [root@centos8 ~]# auditctl -a always,exit -F arch=b64 -S unlink,unlinkat -F 'auid>=1000' -F 'auid!=-1' -F key=del_files_by_users
- 명령어 실행 감사 Rule 등록: auditctl -a always,exit -F exe=/path/to/command -F arch=b64 -S execve -k filter_key
[root@centos8 ~]# auditctl -a always,exit -F exe=/sbin/useradd -F arch=b64 -S execve -k user_add
▣ ausearch: 감사 로그에서 이벤트를 검색하고 필터링하는 데 사용
- 주요 옵션 :
-a, --event event-id: 특정 이벤트 ID를 기준으로 메시지를 필터링 -c, --comm comm_name: 특정 프로세스 명령어로 필터링 -i, --interpret: uid 처럼 숫자로 표시된 객체를 텍스트(사용자명)으로 메시지 변환 -if, --input [file-name | directory]: 특정 파일 또는 소켓에 대한 이벤트를 필터링 -k, --key filter_key: 특정 필터 키를 기준으로 메세지를 필터링 -m, --message [message-type | comma-sep-message-type-list] : 특정 이벤트 메시지로 필터링 -p, --pid process-id : 특정 프로세스 ID를 기준으로 메시지를 필터링 -ui, --uid user-id: 특정 사용자 ID로 필터링 -x, --executable executable_name: 특정 실행 파일로 필터링 -ts, --start [end-date] [end-time]: 특정 시작 시간으로 필터링(mm/dd/yyy hh24:mi:ss) -te, --end [end-date] [end-time]: 특정 종료 시간으로 필터링(mm/dd/yyy hh24:mi:ss)
- /etc/hosts 파일을 변경한 감사 로그 찾기
[root@centos8 ~]# ausearch -k hosts_change -m CONFIG_CHANGE ---- time->Fri Nov 24 19:16:16 2023 type=PROCTITLE msg=audit(1700820976.492:633): proctitle=617564697463746C002D77002F6574632F686F737473002D70007761002D6B00686F7374735F6368616E6765 type=SYSCALL msg=audit(1700820976.492:633): arch=c000003e syscall=44 success=yes exit=1080 a0=4 a1=7ffefbd3dce0 a2=438 a3=0 items=0 ppid=93829 pid=93941 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts1 ses=12 comm="auditctl" exe="/usr/sbin/auditctl" subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 key=(null) type=CONFIG_CHANGE msg=audit(1700820976.492:633): auid=0 ses=12 subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 op=add_rule key="hosts_change" list=4 res=1
▣ aureport: 감사 로그에서 생성된 리포트를 생성하는 데 사용
- 주요 옵션 :
-au, --auth: 인증 시도에 대한 리포트 생성 --comm: 명령어 실행에 대한 리포트 생성 -c, --config: 환경 설정 변경 사항에 대한 리포트 생성 -e 또는 --exec: 실행 이벤트에 대한 리포트 생성 -f, --file: 파일 이벤트에 대한 리포트 생성 -i, --interpret: uid 처럼 숫자로 표시된 객체를 텍스트(사용자명)으로 메시지 변환 -k, --key: 감사 Rule의 키에 대한 리포터 생성 -l, --login: 로그인 이벤트에 대한 리포트 생성 -u, --user: 사용자별 리포트 생성 -t, --time: 시간대별 리포트 생성 -x, --executable: 실행 이벤트에 대한 리포트 생성 -ts, --start [end-date] [end-time]: 특정 시작 시간으로 필터링(mm/dd/yyy hh24:mi:ss) -te, --end [end-date] [end-time]: 특정 종료 시간으로 필터링(mm/dd/yyy hh24:mi:ss)
- /etc/hosts 파일을 변경한 감사 로그의 리포트 생성
[root@centos8 ~]# ausearch -k hosts_change | aureport -c Config Change Report =================================== # date time type auid success event =================================== 1. 11/24/2023 19:16:16 SYSCALL 0 yes 633
Auditing the system of RHEL8에서 좀 더 자세한 내용을 확인할 수 있습니다.