보안 감사의 3단계 전략
프로덕션 서버 보안은 단일 도구로 해결되지 않습니다. 측정(Lynis) → 추적(auditd) → 강제(SELinux/AppArmor) 세 단계를 조합해야 합니다.
1단계 — Lynis 자동 보안 감사
Lynis는 시스템 전체를 스캔해 보안 점수(Hardening Index)를 산출하고 취약 항목을 보고합니다.
설치
# RHEL/CentOS
sudo yum install -y lynis
# Ubuntu/Debian
sudo apt install -y lynis
# 최신 버전 (패키지 저장소보다 항상 최신)
git clone https://github.com/CISOfy/lynis /usr/local/lynis전체 시스템 감사 실행
sudo lynis audit system
# 조용한 모드 (CI 파이프라인용)
sudo lynis audit system --quiet
# 결과를 파일로 저장
sudo lynis audit system --log-file /var/log/lynis.log --report-file /var/log/lynis-report.dat보고서 해석
# 하드닝 인덱스 확인 (100점 만점)
grep "hardening_index" /var/log/lynis-report.dat
# WARNING 항목만 추출
grep "^warning[]" /var/log/lynis-report.dat
# SUGGESTION 항목 추출
grep "^suggestion[]" /var/log/lynis-report.dat목표 점수: 프로덕션 서버는 최소 75점 이상을 유지하세요. 신규 서버는 90점 이상을 목표로 초기 설정하는 것이 좋습니다.
핵심 취약 항목 수동 수정
# AIDE 파일 무결성 모니터링 설치
sudo apt install -y aide
sudo aideinit
sudo mv /var/lib/aide/aide.db.new /var/lib/aide/aide.db
# 주간 무결성 검사 크론 등록
echo "0 3 * * 0 root /usr/bin/aide --check" >> /etc/cron.d/aide-check
# 불필요한 컴파일러 제거 (권장)
sudo apt purge -y gcc make
# USB 마운트 비활성화 (서버용)
echo "install usb-storage /bin/false" > /etc/modprobe.d/disable-usb-storage.conf2단계 — auditd 이벤트 추적
auditd는 커널 레벨에서 파일 접근, 시스템 콜, 권한 변경을 실시간으로 기록합니다.
설치 및 활성화
sudo apt install -y auditd audispd-plugins
sudo systemctl enable --now auditd핵심 감사 규칙 설정
# /etc/audit/rules.d/hardening.rules
# 감사 규칙 잠금 (재부팅 전까지 변경 불가)
-e 2
# 시스템 시간 변경 감시
-a always,exit -F arch=b64 -S adjtimex -S settimeofday -k time-change
-a always,exit -F arch=b64 -S clock_settime -k time-change
# 사용자·그룹 변경 감시
-w /etc/group -p wa -k identity
-w /etc/passwd -p wa -k identity
-w /etc/shadow -p wa -k identity
-w /etc/sudoers -p wa -k identity
-w /etc/sudoers.d/ -p wa -k identity
# 네트워크 설정 변경 감시
-a always,exit -F arch=b64 -S sethostname -S setdomainname -k system-locale
-w /etc/hosts -p wa -k system-locale
-w /etc/network/ -p wa -k system-locale
# 로그인·로그아웃 감시
-w /var/log/faillog -p wa -k logins
-w /var/log/lastlog -p wa -k logins
# 권한 상승 감시 (sudo, su)
-w /bin/su -p x -k priv-esc
-w /usr/bin/sudo -p x -k priv-esc
-w /etc/sudoers -p wa -k priv-esc
# 프로세스 실행 감시 (주요 경로)
-a always,exit -F arch=b64 -S execve -k exec# 규칙 로드
sudo augenrules --load
sudo systemctl restart auditd
# 현재 규칙 확인
sudo auditctl -lauditd 로그 분석
# 특정 키로 이벤트 검색
sudo ausearch -k identity --interpret
# 실패한 로그인 시도
sudo ausearch -m USER_LOGIN --success no
# 특정 사용자의 명령어 이력
sudo ausearch -ua 1001 -m EXECVE --interpret | grep -A2 "type=EXECVE"
# 지난 1시간 내 권한 상승 시도
sudo ausearch -k priv-esc --start recent --interpret
# 보고서 생성 (일별 요약)
sudo aureport --summary
sudo aureport --login --summary
sudo aureport --failed --summary알림 연동: audisp-remote 플러그인을 사용하면 중앙 SIEM(Splunk, Elastic)으로 이벤트를 실시간 전송할 수 있습니다.
3단계 — SELinux 정책 적용 (RHEL/CentOS)
SELinux는 프로세스가 접근할 수 있는 파일·포트를 커널 레벨에서 강제합니다. 잘못 설정하면 서비스가 중단되므로 단계적으로 적용합니다.
모드 이해
# 현재 모드 확인
getenforce # Enforcing / Permissive / Disabled
# 상세 상태
sestatus
# 임시로 Permissive 전환 (테스트용, 재부팅 시 원복)
sudo setenforce 0
# 영구 설정 (/etc/selinux/config)
SELINUX=enforcing # 권장 (프로덕션)
SELINUX=permissive # 로깅만, 차단 없음 (마이그레이션 단계)
SELINUX=disabled # 비권장거부 로그 분석 및 정책 생성
# SELinux 거부 메시지 확인
sudo ausearch -m AVC --interpret | tail -30
sudo grep "denied" /var/log/audit/audit.log | tail -20
# audit2why로 원인 설명
sudo ausearch -m AVC | audit2why
# audit2allow로 맞춤 정책 자동 생성
sudo ausearch -m AVC | audit2allow -M my_custom_policy
sudo semodule -i my_custom_policy.pp실전 — Nginx SELinux 설정
# Nginx가 비표준 포트(8080)를 Listen하도록 허용
sudo semanage port -a -t http_port_t -p tcp 8080
# 현재 http 허용 포트 목록
sudo semanage port -l | grep http_port_t
# Nginx가 upstream 네트워크에 연결하도록 허용
sudo setsebool -P httpd_can_network_connect 1
# Nginx가 NFS를 읽도록 허용
sudo setsebool -P httpd_use_nfs 1
# 커스텀 웹 루트 디렉터리에 컨텍스트 적용
sudo semanage fcontext -a -t httpd_sys_content_t "/data/www(/.*)?"
sudo restorecon -Rv /data/wwwAppArmor (Ubuntu 대안)
# 프로파일 상태 확인
sudo aa-status
# 특정 프로그램 프로파일 활성화
sudo aa-enforce /etc/apparmor.d/usr.sbin.nginx
# 위반 로그 모니터링
sudo journalctl -f | grep apparmor
# complain 모드로 전환 (차단 없이 로깅만)
sudo aa-complain /etc/apparmor.d/usr.sbin.nginx자동화 — 정기 보안 감사 스크립트
#!/bin/bash
# /usr/local/bin/security-audit.sh
REPORT_DIR="/var/log/security-audit"
DATE=$(date +%Y%m%d)
mkdir -p "$REPORT_DIR"
echo "=== Security Audit: $DATE ===" > "$REPORT_DIR/$DATE.txt"
# Lynis 스캔
lynis audit system --quiet >> "$REPORT_DIR/$DATE.txt" 2>&1
# 실패 로그인 요약
echo "--- Failed Logins ---" >> "$REPORT_DIR/$DATE.txt"
aureport --failed --login >> "$REPORT_DIR/$DATE.txt"
# SUID 파일 변경 감지
find / -perm /4000 -type f 2>/dev/null | sort > /tmp/suid_current.txt
if [ -f /tmp/suid_baseline.txt ]; then
diff /tmp/suid_baseline.txt /tmp/suid_current.txt | grep "^>" >> "$REPORT_DIR/$DATE.txt"
fi
cp /tmp/suid_current.txt /tmp/suid_baseline.txt
# 메일 발송 (필요 시)
# mail -s "Security Audit $DATE" [email protected] < "$REPORT_DIR/$DATE.txt"# 매일 새벽 2시 실행
echo "0 2 * * * root /usr/local/bin/security-audit.sh" > /etc/cron.d/security-audit
chmod 644 /etc/cron.d/security-audit이 가이드는 AI 도구를 활용해 초안을 구성하고 사람이 명령어·문맥을 검토해 발행했습니다. 운영체제와 도구 버전에 따라 결과가 달라질 수 있으므로 적용 전 공식 문서를 함께 확인하세요. 오류를 발견하시면 이메일로 제보해 주세요.
질문 & 답변 (Q&A)
이 가이드에 대해 궁금한 점을 질문해보세요. 확인 후 답변드립니다.