들어가며: 보안은 선택이 아닌 필수

서버 보안은 단일 솔루션이 아닌 다층 방어(Defense in Depth) 전략이 필요합니다. 이번 마지막 편에서는 Linux 서버 보안 강화의 핵심을 다룹니다.

1. 시스템 하드닝 기초

1.1 불필요한 서비스 비활성화

# 실행 중인 서비스 확인
systemctl list-units --type=service --state=running

# 불필요한 서비스 비활성화
sudo systemctl disable --now cups
sudo systemctl disable --now avahi-daemon
sudo systemctl disable --now bluetooth

# 부팅 시 시작 서비스 확인
systemctl list-unit-files --type=service --state=enabled

1.2 보안 업데이트

# Ubuntu/Debian
sudo apt update && sudo apt upgrade -y
sudo apt install unattended-upgrades
sudo dpkg-reconfigure unattended-upgrades

# RHEL/CentOS
sudo dnf update -y
sudo dnf install dnf-automatic
sudo systemctl enable --now dnf-automatic.timer

1.3 GRUB 보안

# GRUB 비밀번호 설정
sudo grub-mkpasswd-pbkdf2
# 해시값 복사

# /etc/grub.d/40_custom 편집
set superusers="admin"
password_pbkdf2 admin grub.pbkdf2.sha512...

# 설정 적용
sudo update-grub

2. 사용자 보안

2.1 비밀번호 정책

# /etc/login.defs
PASS_MAX_DAYS   90    # 최대 사용 기간
PASS_MIN_DAYS   7     # 최소 사용 기간
PASS_WARN_AGE   14    # 만료 경고

# PAM 비밀번호 복잡성 (/etc/pam.d/common-password)
password requisite pam_pwquality.so retry=3 minlen=12 dcredit=-1 ucredit=-1 ocredit=-1 lcredit=-1

# 기존 사용자에게 적용
sudo chage -M 90 -m 7 -W 14 username

2.2 sudo 설정

# /etc/sudoers (visudo 사용)
# 로그 기록
Defaults logfile=/var/log/sudo.log
Defaults log_input, log_output

# 타임아웃 설정
Defaults timestamp_timeout=5

# 특정 명령만 허용
username ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx

2.3 계정 잠금

# /etc/pam.d/common-auth
auth required pam_tally2.so deny=5 unlock_time=900

# 실패 횟수 확인
pam_tally2 --user=username

# 잠금 해제
pam_tally2 --user=username --reset

3. SSH 보안 강화

# /etc/ssh/sshd_config

# 기본 포트 변경
Port 2222

# root 로그인 금지
PermitRootLogin no

# 비밀번호 인증 비활성화
PasswordAuthentication no

# 키 인증만 허용
PubkeyAuthentication yes

# 빈 비밀번호 금지
PermitEmptyPasswords no

# 로그인 시도 제한
MaxAuthTries 3
LoginGraceTime 30

# 특정 사용자/그룹만 허용
AllowUsers admin deploy
AllowGroups sshusers

# 프로토콜 버전
Protocol 2

# 적용
sudo systemctl restart sshd

4. 방화벽 설정

4.1 UFW (Ubuntu)

# 기본 정책
sudo ufw default deny incoming
sudo ufw default allow outgoing

# 필요한 포트만 허용
sudo ufw allow 2222/tcp comment 'SSH'
sudo ufw allow 80/tcp comment 'HTTP'
sudo ufw allow 443/tcp comment 'HTTPS'

# IP 기반 제한
sudo ufw allow from 192.168.1.0/24 to any port 22

# 활성화
sudo ufw enable
sudo ufw status verbose

4.2 firewalld (RHEL/CentOS)

# 기본 존 확인
sudo firewall-cmd --get-default-zone

# 서비스 허용
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https

# 포트 허용
sudo firewall-cmd --permanent --add-port=2222/tcp

# 규칙 적용
sudo firewall-cmd --reload

5. 침입 탐지 시스템

5.1 Fail2Ban

# 설치
sudo apt install fail2ban

# /etc/fail2ban/jail.local
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 3

[sshd]
enabled = true
port = 2222
logpath = /var/log/auth.log

[nginx-http-auth]
enabled = true

# 상태 확인
sudo fail2ban-client status
sudo fail2ban-client status sshd

5.2 AIDE (무결성 검사)

# 설치
sudo apt install aide

# 데이터베이스 초기화
sudo aideinit

# 검사 실행
sudo aide --check

# 데이터베이스 업데이트
sudo aide --update

6. SELinux / AppArmor

6.1 SELinux (RHEL/CentOS)

# 상태 확인
getenforce
sestatus

# 모드 변경
sudo setenforce 0  # Permissive
sudo setenforce 1  # Enforcing

# 영구 설정 (/etc/selinux/config)
SELINUX=enforcing

# 문제 해결
sudo ausearch -m avc -ts recent
sudo sealert -a /var/log/audit/audit.log

6.2 AppArmor (Ubuntu)

# 상태 확인
sudo aa-status

# 프로파일 관리
sudo aa-enforce /etc/apparmor.d/usr.sbin.nginx
sudo aa-complain /etc/apparmor.d/usr.sbin.nginx

# 로그 확인
sudo journalctl -fx | grep apparmor

7. 취약점 스캔

7.1 Lynis

# 설치
sudo apt install lynis

# 시스템 감사
sudo lynis audit system

# 보고서 확인
sudo cat /var/log/lynis.log
sudo cat /var/log/lynis-report.dat

7.2 OpenVAS

# 설치 (Ubuntu)
sudo apt install openvas

# 초기 설정
sudo gvm-setup

# 스캔 실행
sudo gvm-start
# 웹 인터페이스: https://localhost:9392

8. 로그 모니터링

# 의심스러운 활동 모니터링
# 로그인 실패
grep "Failed password" /var/log/auth.log | tail -20

# sudo 사용 기록
grep "sudo" /var/log/auth.log

# 시스템 부팅/종료
last reboot
last shutdown

# 현재 접속 사용자
who
w

# 네트워크 연결
ss -tuln
netstat -tuln

9. 보안 체크리스트

#!/bin/bash
# security_audit.sh

echo "=== Linux 보안 감사 ==="

echo -e "\n[1] 시스템 업데이트 확인"
apt list --upgradable 2>/dev/null | head -10

echo -e "\n[2] root 로그인 가능 여부"
grep "^PermitRootLogin" /etc/ssh/sshd_config

echo -e "\n[3] 비밀번호 인증 여부"
grep "^PasswordAuthentication" /etc/ssh/sshd_config

echo -e "\n[4] 열린 포트"
ss -tuln | grep LISTEN

echo -e "\n[5] SUID 파일"
find / -perm -4000 -type f 2>/dev/null | head -10

echo -e "\n[6] 빈 비밀번호 계정"
awk -F: '($2 == "") {print $1}' /etc/shadow

echo -e "\n[7] 최근 로그인 실패"
grep "Failed password" /var/log/auth.log 2>/dev/null | tail -5

echo -e "\n[8] 방화벽 상태"
ufw status 2>/dev/null || firewall-cmd --state 2>/dev/null

echo -e "\n감사 완료"

10. 시리즈 마무리

Linux 서버 관리 완전 정복 시리즈를 마칩니다. 10편에 걸쳐 기초부터 보안까지 서버 관리의 핵심을 다루었습니다:

  • 1편: Linux 기초와 파일 시스템
  • 2편: 사용자와 권한 관리
  • 3편: 패키지 관리와 서비스 운영
  • 4편: 네트워크 설정과 방화벽
  • 5편: SSH와 원격 서버 관리
  • 6편: 쉘 스크립트 기초
  • 7편: 쉘 스크립트 고급
  • 8편: 로그 관리와 모니터링
  • 9편: 백업과 복구 전략
  • 10편: 보안 강화와 취약점 관리

이 시리즈가 Linux 서버 관리의 든든한 기초가 되기를 바랍니다.