서버를 운영하다 보면 초기 보안 설정이 느슨해지거나 새로운 취약점이 발생합니다. 이 체크리스트로 정기적으로 서버 보안 상태를 점검하세요.
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회 |
서버 보안은 한 번 설정하고 끝나는 것이 아닙니다. 이 체크리스트를 기반으로 정기적인 보안 감사를 실시하면 취약점을 조기에 발견할 수 있습니다.