본문 바로가기
IT

[리눅스 기초 #66] 해커의 의지를 꺾는 방패: SSH 요새화와 Fail2Ban으로 서버 철통 방어하기

by sunyjiny 2026. 2. 28.
반응형

리눅스 기초 시리즈의 66번째 시간입니다! 지난 시간에는 Bash와 Python을 결합해 24시간 쉬지 않고 일하는 자동화 매크로를 만들어 보았습니다. 이제 여러분의 서버는 스스로 유튜브 영상을 만들거나 데이터를 수집하며 부지런히 수익을 창출하고 있을 겁니다. 하지만 서버가 유명해지고 외부에 노출될수록, 반갑지 않은 손님들의 방문도 늘어납니다.

세상에는 남의 공들인 서버에 무단으로 침입하려는 자동화된 봇(Bot)들이 널려 있습니다. 오늘은 소중한 자동화 시스템과 데이터를 지키기 위해, 서버의 관문인 SSH를 요새화하고 침입 시도를 즉각 차단하는 Fail2Ban 설정법을 저의 생생한 경험담과 함께 정리해 보겠습니다.


1. 나의 경험담: "로그 파일에 찍힌 수천 번의 발자국"

최근 제가 구축한 유튜브 쇼츠 자동화 서버의 상태를 점검하던 중이었습니다. 무심코 인증 로그 파일(/var/log/auth.log)을 열어보았는데, 경악을 금치 못했습니다. 제가 잠든 사이, 전 세계 각지의 IP들이 제 서버의 'root' 계정 비밀번호를 맞추려고 수천 번의 시도를 하고 있었거든요. 마치 피 냄새를 맡고 몰려드는 모기떼 같았습니다.

보안을 소홀히 했다면 제가 정성껏 만든 영상 소스들과 자동화 스크립트들이 한순간에 날아갈 뻔한 아찔한 순간이었습니다. 저는 즉시 SSH의 기본 포트를 변경하고, Fail2Ban이라는 강력한 경비원을 고용했습니다. 이제 제 서버 로그는 놀라울 정도로 깨끗해졌고, 저는 다시 평온하게 영화 '하빈'의 개봉을 기다리며 개발에 전념할 수 있게 되었습니다. 진정한 개발자의 건강 관리는 스트레스의 근원인 '불안함'을 제거하는 것에서 시작됩니다.


2. Before: "대문을 열어두고 잠을 청하는 격"

기본 설정의 리눅스 서버는 해커들에게 아주 맛있는 먹잇감입니다. 22번 포트는 전 세계 모든 해커가 알고 있는 공용 관문이며, root 로그인이 허용되어 있다면 해커는 아이디를 추측할 필요도 없이 비밀번호만 뚫으면 되기 때문입니다.

취약한 기본 SSH 상태:

/etc/ssh/sshd_config (Default)
 
# 기본 포트 22번 (누구나 아는 길)
Port 22

root 계정 직접 로그인 허용 (아이디 힌트를 주는 셈)
PermitRootLogin yes

비밀번호 시도 횟수 무제한... (밤새도록 두드려보세요)

(▲ Before: 문손잡이를 수만 번 돌려봐도 아무런 제재가 없는 상태입니다. 단 한 번만 운 좋게 맞으면 서버의 모든 권한이 넘어갑니다.)


3. Action: 서버를 요새로 만드는 2단계 방어

이제 본격적으로 방어선을 구축해 보겠습니다. 1차로 SSH 포트를 숨기고, 2차로 Fail2Ban을 통해 끈질긴 녀석들을 영구 차단합니다.

Step 1: SSH 설정 강화 (sshd_config):

Bash Terminal
 
# 1. 포트 번호를 자신만의 번호(예: 2222)로 변경
sudo sed -i 's/#Port 22/Port 2222/' /etc/ssh/sshd_config

2. root 로그인 금지 (일반 계정으로 접속 후 su 사용 권장)
sudo sed -i 's/PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config

3. 설정 적용
sudo systemctl restart ssh

Step 2: Fail2Ban 설치 및 감옥(Jail) 설정:

Bash Terminal
 
# 1. 설치
sudo apt update && sudo apt install fail2ban -y

2. 로컬 설정 파일 생성
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

3. 5번 틀리면 1시간 동안 차단하는 설정 적용
[sshd] 섹션을 찾아 maxretry = 5, bantime = 3600 설정
sudo systemctl restart fail2ban

4. 차단 현황 확인 (마치 전리품을 확인하는 기분!)
sudo fail2ban-client status sshd

(▲ Action: 포트를 바꾸는 것만으로도 대부분의 무지성 봇들을 따돌릴 수 있습니다. 그럼에도 끝까지 쫓아오는 끈질긴 공격자는 Fail2Ban이 알아서 지옥(Ban)으로 보내버립니다.)


4. After: "침묵 속에서 꽃피는 생산성"

보안 설정을 마친 뒤 제 서버는 '정적'을 되찾았습니다. 이제 더 이상 로그 파일이 쓰레기 데이터로 가득 차지 않습니다.

요새화의 효과:

  • 자원 절약: 무의미한 로그인 시도에 낭비되던 CPU와 네트워크 자원이 온전히 제 자동화 스크립트로 집중됩니다.
  • 심리적 안정: "혹시 뚫리지 않을까?" 하는 걱정 없이 주말을 즐길 수 있게 되었습니다.
  • 전문성 강화: 단순히 코드를 짜는 개발자를 넘어, 시스템 전체를 보호할 줄 아는 인프라 엔지니어의 시각을 갖게 되었습니다.

5. 보안 설정 요약

항목 권장 설정 보안 수준
SSH Port 1024~65535 사이의 랜덤 포트 중 (단순 봇 차단)
Root Login PermitRootLogin no 상 (아이디 보호)
Fail2Ban 실패 횟수 및 차단 시간 설정 상 (지속 공격 차단)
SSH Key 비밀번호 대신 키 기반 인증(41편) 최상 (철통 보안)

6. 마치며: 당신의 노력을 보호하세요.

리눅스 기초 66단계를 거치며 우리는 이제 시스템을 만들고, 자동화하고, 지키는 법까지 마스터해 가고 있습니다. 공들여 쌓은 탑이 한순간에 무너지지 않도록 방어선을 구축하는 것은 선택이 아닌 필수입니다. 오늘 설정한 이 짧은 코드 몇 줄이 여러분의 소중한 프로젝트를 지켜줄 가장 강력한 방패가 될 것입니다.

오늘의 인사이트: "편리함과 보안은 반비례하지만, 자동화된 보안은 그 두 마리 토끼를 모두 잡게 해준다."


66번째 이야기를 마칩니다. 이제 우리 서버는 외부의 위협으로부터 안전한 요새가 되었습니다. 다음 시간에는 리눅스 서버 운영의 투명도를 높여주는 '서버의 모든 활동을 한눈에: Grafana로 만드는 나만의 인프라 대시보드'에 대해 다뤄보겠습니다.

이 글이 여러분의 서버를 지키는 데 도움이 되었나요? 혹시 포트를 변경한 뒤에 본인도 접속을 못 해서 당황하고 계신가요?

접속 불능 사태를 방지하기 위한 '포트 변경 전 체크리스트'를 다음 포스팅 부록으로 준비해 드릴까요?

반응형