/엔지니어/보안 설정/Linux 시스템 보안 감사 — Lynis · au
보안 설정고급CentOSRHELUbuntuDebianSELinuxauditdLynis

Linux 시스템 보안 감사 — Lynis · auditd · SELinux 실전

Lynis 자동 감사, auditd 이벤트 추적, SELinux 정책 적용까지 — 프로덕션 서버의 보안 수준을 측정하고 강화하는 심화 가이드.

보안 감사의 3단계 전략

프로덕션 서버 보안은 단일 도구로 해결되지 않습니다. 측정(Lynis) → 추적(auditd) → 강제(SELinux/AppArmor) 세 단계를 조합해야 합니다.


1단계 — Lynis 자동 보안 감사

Lynis는 시스템 전체를 스캔해 보안 점수(Hardening Index)를 산출하고 취약 항목을 보고합니다.

설치

Bash
# RHEL/CentOS
sudo yum install -y lynis

# Ubuntu/Debian
sudo apt install -y lynis

# 최신 버전 (패키지 저장소보다 항상 최신)
git clone https://github.com/CISOfy/lynis /usr/local/lynis

전체 시스템 감사 실행

Bash
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

보고서 해석

Bash
# 하드닝 인덱스 확인 (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점 이상을 목표로 초기 설정하는 것이 좋습니다.

핵심 취약 항목 수동 수정

Bash
# 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.conf

2단계 — auditd 이벤트 추적

auditd는 커널 레벨에서 파일 접근, 시스템 콜, 권한 변경을 실시간으로 기록합니다.

설치 및 활성화

Bash
sudo apt install -y auditd audispd-plugins
sudo systemctl enable --now auditd

핵심 감사 규칙 설정

Bash
# /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
Bash
# 규칙 로드
sudo augenrules --load
sudo systemctl restart auditd

# 현재 규칙 확인
sudo auditctl -l

auditd 로그 분석

Bash
# 특정 키로 이벤트 검색
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는 프로세스가 접근할 수 있는 파일·포트를 커널 레벨에서 강제합니다. 잘못 설정하면 서비스가 중단되므로 단계적으로 적용합니다.

모드 이해

Bash
# 현재 모드 확인
getenforce          # Enforcing / Permissive / Disabled

# 상세 상태
sestatus

# 임시로 Permissive 전환 (테스트용, 재부팅 시 원복)
sudo setenforce 0

# 영구 설정 (/etc/selinux/config)
SELINUX=enforcing   # 권장 (프로덕션)
SELINUX=permissive  # 로깅만, 차단 없음 (마이그레이션 단계)
SELINUX=disabled    # 비권장

거부 로그 분석 및 정책 생성

Bash
# 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 설정

Bash
# 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/www

AppArmor (Ubuntu 대안)

Bash
# 프로파일 상태 확인
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

자동화 — 정기 보안 감사 스크립트

Bash
#!/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"
Bash
# 매일 새벽 2시 실행
echo "0 2 * * * root /usr/local/bin/security-audit.sh" > /etc/cron.d/security-audit
chmod 644 /etc/cron.d/security-audit
#SELinux#auditd#Lynis#보안감사#리눅스보안#시스템보안
편집 안내 · Editorial Note

이 가이드는 AI 도구를 활용해 초안을 구성하고 사람이 명령어·문맥을 검토해 발행했습니다. 운영체제와 도구 버전에 따라 결과가 달라질 수 있으므로 적용 전 공식 문서를 함께 확인하세요. 오류를 발견하시면 이메일로 제보해 주세요.

질문 & 답변 (Q&A)

이 가이드에 대해 궁금한 점을 질문해보세요. 확인 후 답변드립니다.