RHEL 고급 #5 보안 강화 — auditd, OpenSCAP, FIPS
#4 SELinux 고급에서 한 도메인을 어떻게 묶는지를 봤습니다. 이번 글은 그 위, 머신 전체를 컴플라이언스/감사 관점에서 강화하는 영역입니다. 시스템에 일어난 모든 변화를 빠짐없이 기록하는 auditd, 산업 표준에 맞춰 시스템을 자동 점검하고 자동 수정하는 OpenSCAP, 정부,금융 인증에서 요구되는 FIPS 모드를 한 사이클로 다루겠습니다.
RHEL 고급 시리즈에서 이번 글의 위치:
- #1 부팅 프로세스 — GRUB2, dracut, 복구 모드
- #2 커널 튜닝 — sysctl, tuned, kdump
- #3 성능 분석 — sar, top/htop, iostat, vmstat, perf
- #4 SELinux 고급 — 정책 직접 작성과 audit2allow
- #5 보안 강화 — auditd, OpenSCAP, FIPS ← 이번 글
- #6 Subscription / Satellite / Insights
- #7 Cockpit으로 GUI 관리와 web console
세 도구의 쓰임 #
| 도구 | 역할 | 언제 쓰나 |
|---|---|---|
auditd | 시스템에 일어난 변화 기록 | 사후 추적, 컴플라이언스 증빙 |
OpenSCAP | 보안 표준 자동 점검 + 수정 | 인증 준비, 정기 감사 |
FIPS mode | 인증된 암호 모듈만 사용 | 정부/금융 계약 요구 시 |
auditd는 일이 일어난 뒤 누가 무엇을 했는지 묻는 도구, OpenSCAP은 시스템이 표준에 맞게 잡혀 있는지 묻는 도구, FIPS는 사용 가능한 암호 알고리즘 자체를 제약하는 모드입니다. 셋이 같이 가야 컴플라이언스 요구를 한 사이클로 충족할 수 있습니다.
auditd — 모든 변화의 로그 #
리눅스 커널의 audit subsystem 위에 올라가는 사용자 공간 데몬. RHEL 9에 기본 설치돼 있고 부팅 시점에 자동으로 시작합니다.
$ sudo systemctl status auditd
$ sudo auditctl -s
enabled 1
failure 1
pid 1234
rate_limit 0
backlog_limit 8192
lost 0
backlog 0enabled 1이면 켜진 상태. SELinux 거부(#4)도 결국 auditd로 떨어지는 이벤트입니다.
기본 로그 위치 #
$ sudo tail /var/log/audit/audit.log
type=USER_LOGIN msg=audit(1714435200.123:1234): pid=2345 uid=0 ...
type=SYSCALL msg=audit(1714435201.456:1235): arch=c000003e syscall=2 success=yes ...직접 읽기는 어렵습니다. ausearch와 aureport가 표준 조회 도구.
규칙 작성 — /etc/audit/rules.d/ #
런타임 한정으로 auditctl 한 줄, 영구 적용은 /etc/audit/rules.d/*.rules.
# 첫 줄에 보통 적는 자동 항목 정리
-D
-b 8192
-f 1| 옵션 | 의미 |
|---|---|
-D | 기존 룰 모두 제거 (재시작 시 깔끔하게) |
-b 8192 | 백로그 한계 |
-f 1 | 실패 시 동작 (0=조용, 1=printk, 2=panic) |
# /etc/passwd, /etc/shadow 변경 감시
-w /etc/passwd -p wa -k identity
-w /etc/shadow -p wa -k identity
-w /etc/group -p wa -k identity
-w /etc/sudoers -p wa -k actions
-w /etc/sudoers.d/ -p wa -k actions
# SSH 설정 변경 감시
-w /etc/ssh/sshd_config -p wa -k sshd_config| 옵션 | 의미 |
|---|---|
-w <path> | watch — 이 경로의 변경을 추적 |
-p wa | 추적할 권한 (w=write, a=attribute change, r=read, x=execute) |
-k <key> | 이벤트에 붙일 태그 — 나중에 ausearch -k로 조회 |
syscall 단위 규칙 #
특정 시스템 콜이 호출될 때마다 기록.
# 모든 사용자/그룹 변경 시도
-a always,exit -F arch=b64 -S setuid -S setgid -S setresuid -S setresgid -k privilege
# /sbin/insmod, /sbin/modprobe 실행 시 모듈 로딩 추적
-a always,exit -F path=/sbin/insmod -F perm=x -k modules
-a always,exit -F path=/sbin/modprobe -F perm=x -k modules| 부분 | 의미 |
|---|---|
-a always,exit | always (필터 통과 시 항상 기록), exit (syscall 종료 시점에) |
-F arch=b64 | 아키텍처 필터 (64-bit) |
-S <syscall> | 추적할 syscall |
-F path=... | 경로 필터 |
-k <key> | 태그 |
규칙 적용 #
# 룰 파일을 모아서 /etc/audit/audit.rules로 컴파일
$ sudo augenrules --load
# 또는 재시작
$ sudo systemctl restart auditd
# 적용된 룰 확인
$ sudo auditctl -laugenrules --load가 /etc/audit/rules.d/의 파일들을 알파벳 순으로 합쳐 적용합니다.
변경 불가 모드 — -e 2 #
룰을 잠가서 재부팅 전까지 못 바꾸게 만드는 옵션. 컴플라이언스 환경에서 필수.
-e 2-e 2가 적용되면 그다음에 추가하는 룰은 모두 거부됩니다. 반드시 룰 파일들의 마지막에.
조회 — ausearch #
# 키로 조회
$ sudo ausearch -k identity
# 시간 한정
$ sudo ausearch -k identity -ts today
$ sudo ausearch -k identity -ts 04/30/2026 09:00:00
# 사용자 한정
$ sudo ausearch -ua curtis -ts today
# 실패한 syscall만
$ sudo ausearch -sv no -ts today
# 더 친절한 출력
$ sudo ausearch -k identity -i-i (interpret)가 UID, syscall 번호 같은 숫자를 사람이 읽을 수 있는 이름으로 풀어줍니다.
요약 — aureport #
$ sudo aureport --summary
$ sudo aureport -au # 인증 시도
$ sudo aureport -l # 로그인 이벤트
$ sudo aureport -f -i # 파일 이벤트 (해석 모드)
$ sudo aureport --failed # 실패 이벤트만정기 보고에 자주 쓰는 한 묶음입니다.
로그 보존과 회전 #
/etc/audit/auditd.conf의 핵심 키:
log_file = /var/log/audit/audit.log
max_log_file = 100 # MB
num_logs = 10
max_log_file_action = ROTATE # KEEP_LOGS / ROTATE / SUSPEND
space_left = 200 # MB — 이 값 아래로 떨어지면 알림
space_left_action = SYSLOG
admin_space_left = 50 # MB — 더 떨어지면
admin_space_left_action = SUSPEND
disk_full_action = HALT # 가득 차면컴플라이언스 환경에서는 max_log_file_action = KEEP_LOGS로 설정해서 로그를 절대 잃지 않게 하고, 별도 수집 시스템(SIEM)으로 보내는 게 표준입니다.
OpenSCAP — 보안 표준 자동 검사 #
SCAP (Security Content Automation Protocol)은 NIST가 정의한 보안 자동화 표준. 그 위에서 동작하는 도구가 oscap입니다. RHEL은 표준화된 보안 콘텐츠를 SCAP Security Guide 패키지로 제공합니다.
$ sudo dnf install -y openscap-scanner scap-security-guide사용 가능한 프로파일 #
$ ls /usr/share/xml/scap/ssg/content/
ssg-rhel9-ds.xml
...
$ sudo oscap info /usr/share/xml/scap/ssg/content/ssg-rhel9-ds.xml | grep -E '^(Profile|Description)'
Profile: xccdf_org.ssgproject.content_profile_cis
Profile: xccdf_org.ssgproject.content_profile_cis_server_l1
Profile: xccdf_org.ssgproject.content_profile_pci-dss
Profile: xccdf_org.ssgproject.content_profile_stig
Profile: xccdf_org.ssgproject.content_profile_hipaa
Profile: xccdf_org.ssgproject.content_profile_cui
Profile: xccdf_org.ssgproject.content_profile_anssi_bp28_high
...| 프로파일 | 누가 요구하나 |
|---|---|
cis / cis_server_l1 | CIS Benchmark — 가장 일반적 |
pci-dss | 카드 결제 (PCI-DSS) |
stig | 미 국방부 — DISA STIG |
hipaa | 미 의료 |
cui | 미 정부 비분류 통제 정보 |
anssi_bp28_high | 프랑스 ANSSI |
점검 실행 #
$ sudo oscap xccdf eval \
--profile xccdf_org.ssgproject.content_profile_cis \
--results-arf arf.xml \
--report report.html \
/usr/share/xml/scap/ssg/content/ssg-rhel9-ds.xmlreport.html을 브라우저에서 열면 사람이 읽기 쉬운 리포트가 보입니다. 통과/실패한 룰, 각 룰의 설명, 수정 방법, 그리고 bash 또는 ansible 형식의 자동 수정 스크립트까지 들어 있습니다.
결과 보기 #
| 결과 | 의미 |
|---|---|
pass | 통과 |
fail | 실패 — 표준 미준수 |
notapplicable | 이 시스템에 해당 안 됨 |
notchecked | 자동 점검 불가 (수동 확인 필요) |
자동 수정 — remediation #
스캔 시 --remediate 옵션을 주면 실패한 룰을 자동으로 수정합니다.
$ sudo oscap xccdf eval \
--profile xccdf_org.ssgproject.content_profile_cis \
--remediate \
/usr/share/xml/scap/ssg/content/ssg-rhel9-ds.xml운영 머신에서 한 번에 --remediate를 도는 건 위험합니다. 실패 룰 중에 sshd_config의 PermitRootLogin no 같이 작업자 본인이 root SSH로 들어와 있는 경우 즉시 차단되는 패턴이 있습니다. 표준 흐름:
- dry-run —
--results-arf arf.xml --report report.html만 (수정 없이) - 리포트 검토, 영향 평가
- remediation 스크립트 추출 —
oscap xccdf generate fix --result-id ... arf.xml > fix.sh - 스크립트 검토 후 단계적 적용
Ansible playbook으로 추출 #
$ sudo oscap xccdf generate fix \
--profile xccdf_org.ssgproject.content_profile_cis \
--fix-type ansible \
/usr/share/xml/scap/ssg/content/ssg-rhel9-ds.xml \
> cis-remediate.yml생성된 cis-remediate.yml을 Ansible로 실행하면 동일한 수정을 여러 머신에 일관되게 적용 가능. RHCE 트랙에서 다시 만나는 흐름.
설치 시점에 적용 — Kickstart #
서버를 새로 띄울 때부터 표준에 맞게 설치하려면 Kickstart의 %addon org_fedora_oscap 섹션에 프로파일을 지정합니다.
%addon org_fedora_oscap
content-type = scap-security-guide
profile = xccdf_org.ssgproject.content_profile_cis
%end설치 마지막 단계에서 OpenSCAP이 자동으로 도는 흐름. RHEL Image Builder로 통합 이미지를 만들 때도 같은 방식.
FIPS — 인증된 암호 모듈만 #
FIPS (Federal Information Processing Standards) 140-2/140-3은 미 정부가 인정하는 암호 모듈의 요구사항. 정부,금융,의료 계약에서 요구되는 경우가 많습니다. RHEL 9는 인증된 OpenSSL/NSS/libgcrypt를 제공합니다.
활성화 #
$ sudo fips-mode-setup --enable
$ sudo reboot
# 확인
$ sudo fips-mode-setup --check
FIPS mode is enabled.
$ cat /proc/sys/crypto/fips_enabled
1fips-mode-setup --enable이 내부적으로 다음을 합니다:
dracut설정에 fips 모듈 포함initramfs재생성- GRUB 인자
fips=1추가 - SSH host key가 FIPS 비호환이면 백업 후 재생성
재부팅 후에 적용됩니다.
무엇이 달라지는가 #
- MD5, RC4, DES, 3DES, Blowfish 등 약한 알고리즘 사용 거부
- SHA-1의 디지털 서명 용도 거부 (해시 단순 비교는 일부 허용)
- SSH가 약한 키 교환/암호 거부 — 일부 클라이언트 호환성 영향
- Java가 BC-FIPS provider로 동작 — 일부 라이브러리 영향
- TLS 1.0/1.1 거부, TLS 1.2/1.3만
- 자체 컴파일 OpenSSL 등 우회 경로 차단
운영에 미치는 영향이 크기 때문에 활성화 전 반드시 호환성 테스트를 먼저.
FIPS와 컨테이너 #
호스트가 FIPS 모드면 컨테이너 안에서도 호스트 커널의 crypto API를 거치는 호출은 모두 FIPS 제약 하에 동작합니다. 컨테이너 안 OpenSSL이 자체 알고리즘을 쓰는 경우는 별개. RHEL UBI의 FIPS 빌드 (ubi9/ubi-minimal + FIPS 모듈)가 표준.
비활성화 #
$ sudo fips-mode-setup --disable
$ sudo reboot운영 중 활성/비활성을 자주 바꾸면 키와 인증서가 깨질 위험이 있으니 한 번 결정하면 유지하는 게 표준입니다.
셋을 묶은 운영 흐름 #
| 단계 | 도구 | 결과물 |
|---|---|---|
| 1. 머신 설치 | Kickstart + OpenSCAP CIS profile | 표준에 맞춘 초기 상태 |
| 2. 운영 시작 | auditd 룰 적용 + -e 2 잠금 | 모든 변화 기록 |
| 3. 정기 감사 | OpenSCAP 매주 자동 실행 → 리포트 | 표준 이탈 알림 |
| 4. 변경 추적 | ausearch / aureport | 누가 무엇을 했는지 |
| 5. 인증 요구 | FIPS 모드 활성화 | 약한 알고리즘 차단 |
각 단계가 다음 단계를 보강합니다. OpenSCAP으로 잡힌 약점을 auditd로 추적하고, FIPS로 알고리즘 자체를 묶고, 변화를 감사 로그로 증빙.
흔한 함정 #
- auditd 룰 파일에
-e 2누락 — 운영 환경에서 룰 임의 변경 가능. 컴플라이언스 환경의 단골 지적사항. auditd디스크 가득 차서 시스템 정지 —disk_full_action = HALT가 기본일 수 있음. SIEM 연동 또는 별도 디스크/파티션 권장.- OpenSCAP
--remediate를 운영에 직접 — sshd가 끊기거나 사용자 잠금 가능. dry-run → 검토 → 단계적. - FIPS 활성화 후 갑자기 빌드 실패 — Java 빌드, Python
hashlib.md5(usedforsecurity=False)같이 호출 사이트 수정이 필요한 경우 있음. CI 환경에서 먼저 검증. - 호스트만 FIPS, 컨테이너는 비-FIPS 이미지 — 컨테이너 안 OpenSSL이 자체 알고리즘으로 약한 암호 사용 가능. UBI FIPS 빌드 사용.
- SCAP 리포트의
notchecked무시 — 자동 점검 불가일 뿐 수동 확인 필요한 항목. 인증 시 반드시 별도 증빙. - auditd 룰을 너무 많이 — 모든 syscall을 추적하면 성능 저하 + 디스크 폭증. 컴플라이언스 표준이 요구하는 최소 집합만.
기억해 둘 명령 #
| 작업 | 명령 |
|---|---|
| auditd 상태 | sudo auditctl -s |
| 룰 적용 | sudo augenrules --load |
| 룰 확인 | sudo auditctl -l |
| 키로 조회 | sudo ausearch -k <key> -ts today -i |
| 요약 리포트 | sudo aureport --summary |
| OpenSCAP 점검 | sudo oscap xccdf eval --profile <id> --report report.html <ds.xml> |
| 자동 수정 | sudo oscap xccdf eval --profile <id> --remediate <ds.xml> |
| Ansible 추출 | sudo oscap xccdf generate fix --fix-type ansible --profile <id> <ds.xml> |
| FIPS 활성화 | sudo fips-mode-setup --enable && sudo reboot |
| FIPS 확인 | sudo fips-mode-setup --check / cat /proc/sys/crypto/fips_enabled |
정리 #
- auditd — 시스템 변화의 기록 장치.
/etc/audit/rules.d/에 watch (-w) + syscall (-a) 룰을 두고augenrules --load. 마지막에-e 2로 잠금. 조회는ausearch -k, 요약은aureport. - OpenSCAP — 표준 (CIS, STIG, PCI-DSS, HIPAA 등) 자동 점검 + 자동 수정.
oscap xccdf eval로 HTML 리포트, Ansible playbook 추출 후 단계적 적용 권장. - FIPS 모드 — 인증된 암호 모듈만 사용.
fips-mode-setup --enable후 재부팅. 약한 알고리즘 거부, TLS 1.2/1.3만 허용, SSH/Java 호환성 영향 주의. - 셋을 묶어 — 설치(OpenSCAP) → 변화 기록(auditd) → 정기 감사(OpenSCAP) → 인증 요구(FIPS) 사이클.
- 운영 함정의 핵심 —
-e 2잠금, 디스크 가득 처리, OpenSCAP--remediate직접 적용 금지.
다음 글은 보안에서 한 발 떨어진 영역, RHEL의 구독과 운영 도구 입니다. Subscription Manager와 Satellite, 그리고 클라우드 매니지먼트 SaaS Insights를 한 사이클로 다루겠습니다.