시스템 보안 · 취약점 › A. Linux 서버 보안 설정 · 42/50편 (전체 042/450)
학습 단계: 4단계 · 자동 점검·로그 분석
실습 표기: 이 글의 명령어·출력·로그는 로컬 VMware 테스트 VM(Rocky Linux 9 / Ubuntu 22.04) 기준의 「실습 예시」이며, IP·계정·호스트명은 가상의 값입니다.
OpenSCAP 은 SCAP(보안 설정 자동화 표준) 형식의 점검 정책을 실행하는 도구입니다. 정책 내용은 SCAP Security Guide(SSG, ComplianceAsCode 프로젝트) 가 배포판별로 제공하며, 그 안에 CIS·PCI-DSS 등 여러 프로파일이 들어 있습니다.
scap-security-guide 패키지
└─ 데이터스트림 파일 (*.ds.xml / *-ds.xml)
├─ 프로파일: cis_server_l1, cis_server_l2, pci-dss, ...
└─ 규칙(rule) 수백 개: 각 규칙 = 점검 로직(OVAL) + 조치 스크립트
↓
oscap xccdf eval --profile ... 데이터스트림
↓
결과: results.xml (기계용) + report.html (사람용)
RHEL 계열(Rocky)은 패키지로 바로 쓸 수 있고, Ubuntu는 Ubuntu Security Guide(USG, Ubuntu Pro 필요) 또는 ComplianceAsCode에서 빌드한 콘텐츠를 사용합니다.
| 명령 | 용도 |
|---|---|
sudo dnf install -y openscap-scanner scap-security-guide | 설치(Rocky) |
ls /usr/share/xml/scap/ssg/content/ | 데이터스트림 파일명 확인(배포판별 상이) |
oscap info 데이터스트림 | 포함된 프로파일 ID 목록 |
oscap xccdf eval --profile ID --results r.xml --report r.html 데이터스트림 | 점검 실행 |
oscap xccdf generate fix --profile ID --fix-type bash ... | 조치 스크립트 생성(검토용) |
# Rocky 9 테스트 VM
sudo dnf install -y openscap-scanner scap-security-guide
ls /usr/share/xml/scap/ssg/content/
DS=$(ls /usr/share/xml/scap/ssg/content/*-ds.xml | head -1); echo "$DS"
# 프로파일 ID 확인
oscap info "$DS" | grep -A1 -i 'cis' | head
# CIS Server Level 1 점검 (프로파일 ID는 위 출력으로 확인한 값 사용)
sudo oscap xccdf eval \
--profile xccdf_org.ssgproject.content_profile_cis_server_l1 \
--results /root/oscap-results.xml \
--report /root/oscap-report.html \
"$DS" | tail -20
# 결과 요약
grep -o 'result>[a-z]*<' /root/oscap-results.xml | sort | uniq -c
oscap xccdf eval은 FAIL 항목이 있으면 종료 코드 2를 반환하므로, 자동화 스크립트에서 오류(1)와 구분해 처리합니다.
Title Set SSH Daemon LogLevel to VERBOSE
Rule xccdf_org.ssgproject.content_rule_sshd_set_loglevel_verbose
Result pass
Title Disable SSH Root Login
Rule xccdf_org.ssgproject.content_rule_sshd_disable_root_login
Result pass
...
312 result>pass<
9 result>fail<
41 result>notapplicable<
결과 수치는 예시입니다. FAIL이 소수이고 모두 승인된 예외 목록에 있는 상태가 운영상 정상입니다.
Title Disable SSH Root Login
Result fail
Title Ensure SELinux State is Enforcing
Result fail
Title Make the auditd Configuration Immutable
Result fail
지난 점검에서 PASS였던 핵심 항목(SSH root, SELinux, auditd 불변)이 FAIL로 바뀌었다면 039편의 하드닝 해제 징후와 같은 의미입니다. 자동 점검 결과도 변화(diff) 로 봐야 합니다.
| 결과값 | 의미 |
|---|---|
pass / fail | 기준 충족 / 미충족 |
notapplicable | 해당 환경에 적용 안 됨(패키지 미설치 등) |
notchecked | 자동 점검 불가(수동 확인 필요) |
error | 점검 실행 오류 → 결과를 신뢰할 수 없음 |
OpenSCAP 결과는 XML이므로, 핵심만 뽑아 로그·SIEM으로 보내는 방식이 실용적입니다(분석 방법 예시).
# FAIL 규칙 ID만 추출해 이전 결과와 비교
xmllint --xpath '//*[local-name()="rule-result"][*[local-name()="result"]="fail"]/@idref' \
/root/oscap-results.xml 2>/dev/null | tr ' ' '\n' | sed 's/idref=//; s/"//g' | sort > /root/oscap-fail-$(date +%F).txt
diff /root/oscap-fail-2026-09-15.txt /root/oscap-fail-2026-10-01.txt
> xccdf_org.ssgproject.content_rule_audit_rules_immutable
> xccdf_org.ssgproject.content_rule_selinux_state
> xccdf_org.ssgproject.content_rule_sshd_disable_root_login
새로 FAIL이 된 규칙 ID 목록이 곧 조사 대상 목록입니다. 각 규칙 ID로 보고서(report.html)의 Audit·Remediation 설명을 바로 찾아볼 수 있습니다.
error, notchecked 비율이 높으면 점검 결과 자체의 신뢰성을 먼저 확인합니다.<!-- 신규 FAIL 목록을 syslog로 보낸 경우 (logger -t oscap-diff "new_fail=규칙ID") -->
<rule id="100470" level="9">
<match>oscap-diff</match>
<regex>new_fail=\S+</regex>
<description>OpenSCAP 신규 FAIL 규칙 발생</description>
</rule>
여러 서버를 운영한다면 결과 XML을 중앙에 모아 비교하거나, 같은 정책을 에이전트 기반으로 상시 점검하는 Wazuh SCA(045편)로 역할을 나누는 구성이 일반적입니다.
| 구분 | 핵심 내용 |
|---|---|
| 구성 | oscap(실행기) + SSG 데이터스트림(정책·프로파일) |
| 실행 | oscap xccdf eval --profile ID --results --report |
| 결과값 | pass · fail · notapplicable · notchecked · error |
| 운영 원칙 | 점검과 조치 분리, 신규 FAIL만 Alert |
| 면접 포인트 | "자동 점검 결과도 diff로 봐야 이상 징후가 된다" |
다음 편 043. Linux 서버 보안 — Lynis 하드닝 점검 결과 해석 에서는 에이전트 없이 빠르게 전체 상태를 훑는 Lynis 하드닝 점검 결과 해석을 다룹니다.
이전 편: 041. Linux 서버 보안 — CIS Benchmark 관점의 점검 구조
📚 시리즈 전체 보기: 시스템 보안 · 취약점