서버를 운영하다 보면 초기 보안 설정이 느슨해지거나 새로운 취약점이 발생합니다. 이 체크리스트로 정기적으로 서버 보안 상태를 점검하세요.

1. 시스템 업데이트

# 보안 업데이트 가능 패키지 확인
apt list --upgradeable 2>/dev/null | grep -i security
apt list --upgradeable 2>/dev/null | wc -l

# 마지막 업데이트 날짜 확인
ls -la /var/log/apt/history.log
tail -5 /var/log/apt/history.log
✅ 모든 보안 패키지 최신 상태
✅ 자동 보안 업데이트 활성화 (unattended-upgrades)
✅ 재부팅 필요 여부 확인 (/var/run/reboot-required)

2. SSH 보안

# SSH 설정 확인
sshd -T | grep -E "permitrootlogin|passwordauthentication|port|maxauthtries|logingracetime"

# 허용된 키 목록 확인
cat /root/.ssh/authorized_keys
for home in /home/*/; do
    echo "=== $home ===" && cat ${home}.ssh/authorized_keys 2>/dev/null
done
✅ PermitRootLogin no
✅ PasswordAuthentication no
✅ 기본 포트(22) 변경 또는 fail2ban 적용
✅ MaxAuthTries 3 이하
✅ authorized_keys에 불필요한 키 없음

3. 방화벽

# UFW 상태
sudo ufw status numbered

# 열려 있는 포트 확인 (모든 인터페이스)
sudo ss -tlnp
sudo nmap -sV localhost
✅ 방화벽 활성화
✅ 필요한 포트만 허용 (최소 권한 원칙)
✅ 관리 포트(SSH, MySQL 등)는 특정 IP에서만 허용
✅ 0.0.0.0 바인딩 서비스가 의도한 것만 존재

4. 사용자 계정

# 전체 계정 목록 (로그인 가능한 계정)
cat /etc/passwd | grep -vE "nologin|false|sync|halt|shutdown"

# 최근 로그인 기록
last | head -20
lastb | head -20

# sudo 권한 보유 계정
grep -E 'sudo|wheel' /etc/group

# 비밀번호 정책
chage -l username
✅ 불필요한 계정 없음
✅ 비밀번호 만료 정책 설정
✅ sudo 권한 계정 최소화
✅ 시스템 계정에 로그인 불가 설정

5. 파일 시스템

# SUID/SGID 파일 목록
find / -perm -4000 -o -perm -2000 -type f 2>/dev/null

# 기타 사용자 쓰기 가능한 파일 (보안 위험)
find /etc /var/www -perm -o+w -type f 2>/dev/null

# 소유자 없는 파일
find / -nouser -o -nogroup 2>/dev/null | head -20

# 웹 디렉터리 권한 확인
ls -la /var/www/html/
✅ 비정상 SUID 파일 없음
✅ 웹 디렉터리 권한 755(디렉터리)/644(파일)
✅ 업로드 디렉터리 PHP 실행 불가
✅ 설정 파일 (DB 비밀번호 등) 권한 600 이하

6. 네트워크 서비스

# 모든 리슨 서비스
sudo ss -tlnp
sudo ss -ulnp   # UDP

# 외부로 나가는 연결 확인
sudo ss -tnp state established

# 포트 매핑 (어떤 프로세스가 어떤 포트)
sudo lsof -i -n -P | grep LISTEN
✅ 불필요한 서비스 비활성화
✅ Redis/Memcached 로컬 바인딩 확인 (0.0.0.0 노출 금지)
✅ MySQL/PostgreSQL 로컬 바인딩 확인
✅ 의심스러운 아웃바운드 연결 없음

7. 프로세스 및 크론

# 실행 중인 프로세스
ps auxf

# 시스템 크론탭 확인
cat /etc/crontab
ls /etc/cron.d/
ls /etc/cron.daily/ /etc/cron.weekly/ /etc/cron.monthly/

# 모든 사용자 크론탭
for user in $(cut -d: -f1 /etc/passwd); do
    cron=$(crontab -u $user -l 2>/dev/null)
    [ -n "$cron" ] && echo "=== $user ===" && echo "$cron"
done
✅ 알 수 없는 프로세스 없음
✅ 크론탭에 악성 명령 없음
✅ /tmp, /var/tmp에 수상한 실행 파일 없음

8. 로그 모니터링

# 최근 인증 실패
grep "Failed password" /var/log/auth.log | tail -20

# 성공한 로그인
grep "Accepted" /var/log/auth.log | tail -20

# sudo 사용 기록
grep "sudo" /var/log/auth.log | tail -20

# 웹 서버 에러
sudo tail -50 /var/log/nginx/error.log
✅ 비정상적인 로그인 시도 없음 (또는 fail2ban 차단 중)
✅ 알 수 없는 sudo 사용 기록 없음
✅ 웹 서버 에러 로그 주기적 확인
✅ 로그 파일 정상 rotation 중

9. SSL 인증서

# Let's Encrypt 인증서 만료일 확인
sudo certbot certificates

# 수동 SSL 만료일 확인
echo | openssl s_client -connect example.com:443 2>/dev/null | \
    openssl x509 -noout -dates
✅ 인증서 만료 30일 이상 남음
✅ 자동 갱신 타이머 활성화
✅ HSTS 헤더 적용
✅ TLS 1.2 이상만 허용

10. 보안 스캐너 실행

# Lynis (종합 보안 감사)
sudo apt install -y lynis
sudo lynis audit system

# chkrootkit (루트킷 탐지)
sudo apt install -y chkrootkit
sudo chkrootkit

# rkhunter (루트킷 탐지)
sudo apt install -y rkhunter
sudo rkhunter --update
sudo rkhunter --checkall

점검 주기 권장

항목 권장 주기
시스템 업데이트 자동 (또는 매주)
로그인 기록 확인 매일
방화벽 규칙 검토 월 1회
사용자 계정 감사 월 1회
전체 보안 스캔 분기 1회
SSL 인증서 확인 월 1회

서버 보안은 한 번 설정하고 끝나는 것이 아닙니다. 이 체크리스트를 기반으로 정기적인 보안 감사를 실시하면 취약점을 조기에 발견할 수 있습니다.