IT

🛡️ 리눅스 서버 하드닝 가이드: 공격자의 문을 완전히 닫아버리는 12가지 실천 방법

메타인지 월드 2026. 11. 10. 08:28
반응형

서버를 인터넷에 배포하는 순간, 전 세계의 자동화된 봇(Bot)들은 24시간 내내 22번 포트를 두드리며 열린 문을 찾습니다. 복잡하고 오래된 체크리스트 대신, 실전에서 바로 적용할 수 있는 12가지 핵심 리눅스 서버 하드닝(보안 강화) 방법을 살펴봅니다. 각 단계마다 실제로 설정이 제대로 적용되었는지 확인할 수 있는 검증 명령어가 포함되어 있습니다.


⚠️ 시작하기 전 주의사항 (두 가지 규칙)

  • 규칙 1: SSH로 작업할 때는 반드시 두 번째 SSH 세션을 열어둔 상태로 진행하세요. 설정 실수로 로그인이 막혔을 때 복구할 수 있는 생명줄이 됩니다.
  • 규칙 2: 무작정 설정을 붙여넣기 전에 현재 상태를 먼저 점검하세요. 운영체제가 이미 많은 부분을 기본적으로 보호하고 있을 수 있습니다.

1. 시스템 패치 후 반드시 재부팅하기

우분투 같은 시스템은 보안 업데이트를 자동으로 다운로드하지만, 재부팅을 자동으로 수행하지 않아 커널 패치가 적용되지 않은 채 수개월간 방치될 수 있습니다.

확인 및 점검 명령:

sudo apt update
apt list --upgradable
uname -r
ls /boot | grep vmlinuz

해결 방법: sudo apt full-upgrade -y 실행 후 서버를 재부팅합니다. 우분투 서버의 경우 ls /var/run/reboot-required 명령어로 재부팅 필요 여부를 확인할 수 있습니다.

2. 루트(Root) 권한을 가진 계정 확인하기

시스템에서 최고 권한(UID 0)을 가진 계정이 누구인지 점검해야 합니다.

확인 및 점검 명령:

id
sudo -l
awk -F: '$3 == 0 {print $1}' /etc/passwd

해결 방법: 마지막 명령어의 결과는 오직 root만 출력되어야 합니다. 다른 계정이 출력된다면 그 이유를 반드시 확인해야 합니다.

3. SSH 키 인증만 허용하고 Root 로그인 차단하기

비밀번호 기반의 로그인을 전면 금지하고, 무차별 대입 공격(Brute Force)을 원천 차단합니다.

설정 방법:

ssh-keygen -t ed25519
sudo tee /etc/ssh/sshd_config.d/10-hardening.conf > /dev/null << 'EOF'
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
MaxAuthTries 3
X11Forwarding no
EOF
sudo sshd -t && echo "config OK"

검증 명령: sudo sshd -T | grep -E '^(permitrootlogin|passwordauthentication|kbdinteractiveauthentication)'

4. 기본 암호화 알고리즘(Ciphers) 유지하기

오래된 블로그 글을 따라 불필요하게 암호화 방식을 수정하지 말고 현대적인 기본값을 유지하는 것이 안전합니다.

확인 명령:

sudo sshd -T | grep -E '^(ciphers|kexalgorithms)'
ssh -Q kex | grep mlkem
ssh -V

해결 방법: 최신 시스템의 강력한 기본값을 그대로 신뢰하고 유지합니다.

5. SSH 자체 기능으로 브루트포스 차단하기

최신 OpenSSH 버전은 로그인 실패 시 공격자 IP를 지속적으로 페널티를 주어 자체 차단하는 기능을 제공합니다.

확인 명령: ssh -V 및 sudo sshd -T | grep -i persource

해결 방법: 최신 OpenSSH 9.8 이상에서는 별도의 설정 없이 동작하며, 구버전의 경우 sudo apt install fail2ban을 활용할 수 있습니다.

6. 방화벽(UFW) 설정: 모든 접근 차단 후 필요한 것만 허용

외부에서 들어오는 모든 연결을 기본 차단하고 필요한 포트만 개방합니다.

설정 방법:

sudo apt install -y ufw
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp
sudo ufw --force enable

검증 명령: sudo ufw status verbose

7. 불필요한 서비스와 포트 닫기

현재 실행 중인 서비스와 대기 중인 포트를 점검하여 사용하지 않는 항목을 비활성화합니다.

확인 명령:

sudo ss -tulnp
systemctl list-units --type=service --state=running

해결 방법: 불필요한 서비스는 sudo systemctl disable --now 서비스이름 명령어로 중지 및 비활성화합니다.

8. SUID 프로그램 점검하기

실행 시 관리자 권한을 부여받는 SUID 파일 중 악용될 소지가 있는 파일이 있는지 추적합니다.

확인 명령: find / -perm -4000 -type f 2> /dev/null

해결 방법: 불필요한 SUID 권한은 sudo chmod u-s /path/to/program 명령어로 제거합니다.

9. 커널 보안 설정 강화 (Sysctl)

커널 메모리 주소 숨기기 및 네트워크 공격 방어 설정을 적용합니다.

설정 방법:

sudo tee /etc/sysctl.d/99-hardening.conf > /dev/null << 'EOF'
kernel.kptr_restrict = 2
kernel.dmesg_restrict = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.rp_filter = 1
EOF
sudo sysctl --system | tail -6

검증 명령: sysctl kernel.kptr_restrict kernel.dmesg_restrict net.ipv4.tcp_syncookies net.ipv4.conf.all.accept_redirects net.ipv4.conf.all.rp_filter

10. 재부팅 후에도 로그가 유지되도록 설정하기

기본 설정에서는 재부팅 시 로그가 사라지므로 영구 저장소를 활성화합니다.

설정 방법: sudo mkdir -p /var/log/journal && sudo systemctl restart systemd-journald

검증 명령: ls -ld /var/log/journal 및 journalctl --list-boots | tail -3

11. 중요 파일 무결성 감시 (Auditd)

시스템 설정 파일(/etc/passwd 등)이 변경될 때 즉시 감지하고 기록하도록 설정합니다.

설정 방법 및 확인:

sudo apt install -y auditd
sudo systemctl enable --now auditd
sudo auditctl -w /etc/passwd -p wa -k passwd_watch
sudo touch /etc/passwd
sudo ausearch -k passwd_watch -i | tail -5

12. 보안 진단 도구(Lynis)로 최종 점검하기

자동화된 보안 진단 도구를 통해 서버 전반의 취약점과 개선 사항을 객관적인 점수로 확인합니다.

실행 명령:

sudo apt install -y lynis
sudo lynis audit system --quick

팁: 점수에만 집착하기보다는 서버의 앱 환경에 맞게 경고와 제안 사항을 유연하게 검토하세요.


출처: 12 linux server hardening practices that shut the door for attacker

반응형