RHEL 고급 #5 보안 강화 — auditd, OpenSCAP, FIPS

8 분 소요

#4 SELinux 고급에서 한 도메인을 어떻게 묶는지를 봤습니다. 이번 글은 그 위, 머신 전체를 컴플라이언스/감사 관점에서 강화하는 영역입니다. 시스템에 일어난 모든 변화를 빠짐없이 기록하는 auditd, 산업 표준에 맞춰 시스템을 자동 점검하고 자동 수정하는 OpenSCAP, 정부,금융 인증에서 요구되는 FIPS 모드를 한 사이클로 다루겠습니다.

RHEL 고급 시리즈에서 이번 글의 위치:

세 도구의 쓰임 #

도구역할언제 쓰나
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 0

enabled 1이면 켜진 상태. SELinux 거부(#4)도 결국 auditd로 떨어지는 이벤트입니다.

기본 로그 위치 #

/var/log/audit/audit.log
$ 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 ...

직접 읽기는 어렵습니다. ausearchaureport가 표준 조회 도구.

규칙 작성 — /etc/audit/rules.d/ #

런타임 한정으로 auditctl 한 줄, 영구 적용은 /etc/audit/rules.d/*.rules.

/etc/audit/rules.d/00-defaults.rules
# 첫 줄에 보통 적는 자동 항목 정리
-D
-b 8192
-f 1
옵션의미
-D기존 룰 모두 제거 (재시작 시 깔끔하게)
-b 8192백로그 한계
-f 1실패 시 동작 (0=조용, 1=printk, 2=panic)
/etc/audit/rules.d/10-watch.rules
# /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 단위 규칙 #

특정 시스템 콜이 호출될 때마다 기록.

/etc/audit/rules.d/20-actions.rules
# 모든 사용자/그룹 변경 시도
-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,exitalways (필터 통과 시 항상 기록), 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 -l

augenrules --load/etc/audit/rules.d/의 파일들을 알파벳 순으로 합쳐 적용합니다.

변경 불가 모드 — -e 2 #

룰을 잠가서 재부팅 전까지 못 바꾸게 만드는 옵션. 컴플라이언스 환경에서 필수.

/etc/audit/rules.d/99-finalize.rules
-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의 핵심 키:

/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_l1CIS Benchmark — 가장 일반적
pci-dss카드 결제 (PCI-DSS)
stig미 국방부 — DISA STIG
hipaa미 의료
cui미 정부 비분류 통제 정보
anssi_bp28_high프랑스 ANSSI

점검 실행 #

CIS 프로파일로 점검
$ 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.xml

report.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로 들어와 있는 경우 즉시 차단되는 패턴이 있습니다. 표준 흐름:

  1. dry-run--results-arf arf.xml --report report.html만 (수정 없이)
  2. 리포트 검토, 영향 평가
  3. remediation 스크립트 추출oscap xccdf generate fix --result-id ... arf.xml > fix.sh
  4. 스크립트 검토 후 단계적 적용

Ansible playbook으로 추출 #

ansible 형식
$ 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 섹션에 프로파일을 지정합니다.

Kickstart 안 발췌
%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를 제공합니다.

활성화 #

FIPS 모드 켜기
$ sudo fips-mode-setup --enable
$ sudo reboot

# 확인
$ sudo fips-mode-setup --check
FIPS mode is enabled.

$ cat /proc/sys/crypto/fips_enabled
1

fips-mode-setup --enable이 내부적으로 다음을 합니다:

  1. dracut 설정에 fips 모듈 포함
  2. initramfs 재생성
  3. GRUB 인자 fips=1 추가
  4. 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를 한 사이클로 다루겠습니다.

X