ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [라즈베리파이5] 홈서버 구축하기 3 - 보안 세팅 1단계 SSH, Fail2Ban, UFW
    📗공부기록/CS 2026. 1. 20. 03:03
    세상에는 악성 봇들이 수많은 서버의 문을 두드리고, 취약한 서버를 발견하면 정보 갈취, 디도스 공격, 코인채굴, 서비스 이용자에게 2차 피해 등등 여러 방면으로 악용될 수가 있다. 물론 내 작고 귀여운 라즈베리파이에는 그닥 좋은 스펙도 아니고, 딱히 중요한 정보도, 서비스 이용자도 없기 때문에 이만큼 철저히 보안을 설정하지 않아도 되겠지만, 이게 다 공부고 경험이 될 거라고 생각한다.

     

    세팅할 보안 관련 설정은 크게 두 가지로 나뉘었다.

    1. 나는 외부에서도 안전하게 내 서버에 접근할 수 있어야 한다.
      -> 나의 원격 접속 (SSH) → VPN과 SSH
    2. 내 서비스에는 모두가 안전하게 접근할 수 있어야 한다.
      -> 웹 접속 (HTTP/HTTPS) → 라즈베리파이 (포트 80/443)

    이번 포스팅에서는 1번에 관련된 보안 설정 일부와 공통으로 적용될 보안 설정을 다룰 것이다. 우선 가장 먼저 SSH 로그인 설정 부터 확인하도록 하겠다.

     


    SSH 로그인 설정(비밀번호 로그인 차단)

    Raspberry Pi Imager을 이용해 OS를 구울 때 처음부터 비밀번호 로그인은 불가능하게 막고 키를 생성하여 SSH 로그인만 가능하도록 설정하긴 했지만 잘 설정 되었는지 확인을 해보자.

    sudo nano /etc/ssh/sshd_config

    PasswordAuthentication no
    PermitRootLogin no

    이 옵션이 있다면 된거다. 만약 없다면 추가 후 sudo systemctl restart ssh 명령어로 설정을 갱신 해주면 된다. 이렇게 하면 SSH키를 이용해서만 로그인을 할 수 있게 된다.

     

     

    보안 패치 자동 업데이트 설정 추가

    sudo apt update
    sudo apt upgrade -y
    sudo apt install unattended-upgrades

     

    fail2ban

    fail2ban이란?
    서버 로그 파일을 분석하여 반복적인 로그인 실패나 악의적인 요청을 감지하고, 해당 IP 주소를 iptables나 파이어월(Firewall)을 통해 자동으로 차단하는 오픈 소스 보안 프레임워크입니다. 무차별 대입 공격(Brute-force)을 방어하는 데 주로 사용됩니다.
    몇 회 실패시 차단되고, 해제되는지 직접 설정할 수 있습니다. 

    이미 SSH 로그인만 가능하게 설정해 놓았고 보안도 철저하게 세팅할건데 왜 fail2ban이 필요하냐고 생각할 수 있다.

    무차별 대입 공격은 서버 보안이 철저해서 뚫리지 않더라도 수천 번의 시도가 서버에 들어오는 것 자체가 CPU 리소스 낭비이며, 수 많은 쓰레기 로그를 남기게 되기 때문이다. 이제 fail2ban을 세팅하겠다.

     

    문제 발생

    간단하게 sudo apt install fail2ban 명령어를 이용해 설치 후 세팅을 완료한 줄 알았는데, 상태를 확인하니 Active: failed였다.

    찾아보니 Ubuntu 24.04 버전은 기본 파이썬 버전이 fail2ban에서 사용하는 버전과 달라서 오류가 나는 것이었다.

    https://github.com/fail2ban/fail2ban/issues/3755

    https://github.com/alexdcodes/ConfigureUbuntu/blob/main/fail2ban/install.sh

    위 fail2ban repo의 issue에서 똑같은 오류를 확인했고, 답변에 작성된 명령어와 두번째 링크에 작성된 sh파일 명령어를 참고해서 직접 터미널에 입력하여 최신 버전을 수동으로 설치해 주었다.

    그리고 설정파일을 복사했다.

    sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

     

    설정 파일은 원본은 그대로 두고 복사본을 생성해서 옵션을 추가해야 버전 업데이트 등 예기치 못하게 설정 파일이 초기화 되는 것을 방지할 수 있다. 복사 후 sudo nano /etc/fail2ban/jail.local 명령어로 파일을 열어 아래 옵션을 확인 및 추가한다. 시간과 횟수는 변경 가능하다.

    [sshd]
    enabled = true
    port    = ssh
    filter  = sshd
    logpath = /var/log/auth.log
    maxretry = 5        # 5번 틀리면 차단
    findtime = 600      # 10분(600초) 안에 5번 시도할 경우
    bantime  = 3600     # 1시간(3600초) 동안 차단 (완전 차단은 -1)

     

    그리고 만에 하나 내 집에서 내가 차단 당하는 참사를 방지하기 위해 집 IP를 white list에 추가해 차단 당하지 않도록 세팅 해주었다.

    [DEFAULT]
    # 로컬 호스트(127.0.0.1)는 기본으로 포함
    ignoreip = 127.0.0.1/8 ::1 내집IP 사무실IP #등등 아이피는 공백으로 구분한다.

     

    설정을 저장한 뒤 재시작하고, 부팅 시 자동으로 재실행이 될 수 있도록 세팅했다. 세팅이 끝나면 아래 두 명령어를 입력해서 잘 설정이 됐는지 확인해주면 된다.

    sudo systemctl restart fail2ban
    sudo systemctl enable fail2ban  # 부팅 시 자동 실행
    
    sudo fail2ban-client get sshd ignoreip # 화이트리스트 아이피 확인 명령어
    sudo systemctl status fail2ban # fail2ban 상태 확인 명령어

     

     

    UFW

    UFW는 1번과 2번을 아우르는 방화벽 보안 설정이다.

    UFW란?
    UFW(Uncomplicated Firewall)는 복잡하지 않은 방어벽의 약자로 리눅스에서 사용되는 사용하기 쉬운 방화벽 관리 도구로, 복잡한 iptables 명령어 대신 간단한 명령어로 방화벽 규칙을 설정하고 관리할 수 있게 해줍니다. 네트워크 트래픽을 제어하여 시스템을 보호하는 역할을 하며, 규칙 추가, 삭제, 활성화/비활성화 등이 쉽습니다.

     

     

    ufw는 기본적으로 우분투에 설치되어 있지만 비활성화 된 상태이다. 아래 명령어들을 이용해 방화벽 기초 세팅을 하고, 활성화해주면 된다.

    첫째줄의 입력 트래픽 차단 명령어를 입력한 뒤 반드시! 방화벽 활성화 명령어를 입력하기 전에 22번 포트는 꼭 allow 해두어야 한다. 그렇지 않으면 22번 포트를 통해 서버에 접속할 수 없게 된다...엄청난 참사가 아닐 수 없다.

    만약 실수로 22번 포트를 추가하지 않고 ufw를 활성화 했고, 아직 접속 된 터미널을 닫지 않았다면 잽싸게 22번 포트를 allow해주면 된다. 터미널까지 닫았다면 원격으로는 방법이 없다. 라즈베리파이에 직접 모니터와 키보드를 연결해서 추가하는 수밖에.

    sudo ufw default deny incoming # 입력 트래픽 차단. 내가 허용한 포트 외에 외부에서 서버로 들어오려는 모든 시도를 차단
    sudo ufw default allow outgoing # 출력 트래픽 허용. 서버 내부에서 외부로 나가는 데이터는 모두 허용. 업데이트 설치, 패키지 다운로드 가능
    
    sudo ufw allow 22 # 포트 개방 기본 명령어로 22번 포트 개방
    
    sudo ufw enable # 방화벽 활성화 명령어. 설정한 모든 규칙을 실제로 적용하고 시스템 시작 시 자동으로 실행되도록 설정

     

    그리고 한번 활성화해두면 나중에 허용할 포트를 더 추가하거나 삭제하더라도 시스템에 바로 반영되기 때문에 따로 재시작 할 필요가 없다.

    sudo ufw allow 포트번호/tcp # tcp 프로토콜 지정하여 개방, udp도 가능
    
    sudo ufw delete allow 포트번호 # 개방한 포트 삭제 명령어
    
    sudo ufw status verbose # 설정한 규칙 확인 명령어

    위 사진은 이미 전체 보안 세팅을 끝내 필요한 포트만 열어놓은 상태이다. 그런데 22번 포트 뒤에 뭐가 더 붙어 있다?(지금은 없어야 정상)

    저 22 on wg0은 이 다음에 포스팅 할 wireguard와 연관이 있는데, vpn을 통해 접근하는 경우에 한해 안전하게 22번 포트를 열어주겠다는 의미이다. 자세한 것은 다음 포스팅에서 마저 설명하도록 하겠다.

     


     

    여기까지 비교적 간단한 방법으로 설정할 수 있는 것 우선 한번에 작성해보았다. 다음엔 wireguard vpn 세팅에 대해 포스팅할 예정이다.

     

     

    댓글

Designed by Tistory.