13년차의 서버실

서버, 인프라, 홈랩 기술 블로그

[태그:] 홈랩 보안

  • [HomeLabs] Frigate NVR 도입 사례: 홈랩 보안 카메라 설계 체크포인트

    [HomeLabs] Frigate NVR 도입 사례: 홈랩 보안 카메라 설계 체크포인트

    Frigate NVR 도입 사례: 홈랩 보안 카메라 설계 체크포인트

    Frigate NVR를 검토하게 된 이유는 단순했습니다. 카메라를 몇 대만 붙여도 녹화는 되는데, 막상 필요한 장면을 찾는 시간이 너무 오래 걸리더라고요. 저도 처음엔 RTSP만 받아 저장하면 끝일 줄 알았는데, 실제 운영에선 이벤트 기준으로 좁혀보는 기능이 없으면 사람이 영상을 관리하는 시간이 훨씬 더 많이 들었습니다.

    그래서 본격적으로 본 게 Frigate NVR였습니다. 오픈소스라는 점도 매력적이지만, 더 중요한 건 객체 감지 이벤트를 기준으로 녹화, 검색, 자동화를 한 흐름으로 묶기 쉽다는 점이었습니다. 다만 이건 설치형 앱보다는 운영형 시스템에 가깝습니다. 잘 맞는 환경에 넣으면 진짜 편한데, 안 맞는 환경에 억지로 올리면 전용 NVR보다 더 손이 갑니다.

    이번 글은 기능 소개보다 도입 판단 기준에 초점을 맞췄습니다. 홈랩에서 제가 실제로 먼저 보는 항목, 어디서 병목이 생기는지, 어떤 구성은 오래 가고 어떤 구성은 금방 흔들리는지를 경험 중심으로 정리했습니다. Home Assistant 자동화나 홈랩 네트워크 설계를 함께 보고 계신다면, 이 글을 기준 글로 삼아 연결해서 읽어보셔도 좋습니다.

    Frigate NVR 기반 홈랩 보안 카메라 전체 아키텍처 이미지

    카메라, Frigate, MQTT, Home Assistant, 저장소가 어떻게 연결되는지 한눈에 보여주는 구성도입니다.

    1. 왜 Frigate NVR를 보게 되었나

    전용 NVR은 장점이 분명합니다. 설치가 빠르고 제조사 앱이 있고, 웬만하면 바로 녹화가 되니까요. 그런데 홈랩을 굴리다 보면 아쉬움이 생깁니다. 특정 브랜드에 종속되거나, 이벤트를 외부 시스템으로 자연스럽게 내보내기 어렵거나, 저장 정책이 내 운영 방식과 딱 안 맞는 경우가 생각보다 많습니다.

    Frigate NVR를 보게 되는 분들은 보통 비슷한 지점에서 고민합니다. 영상 자체보다 영상에서 발생한 사건을 다루고 싶을 때죠. 사람이 지나갔는지, 차량이 들어왔는지, 특정 시간대에만 알림을 줄 건지, Home Assistant에서 조명이나 사이렌과 연결할 건지 같은 요구가 붙는 순간 전용 장비의 편의성보다 데이터 흐름의 유연성이 더 중요해집니다. 저도 딱 그 지점에서 Frigate가 훨씬 현실적으로 느껴졌습니다.

    반대로 영상 보관만 안정적으로 되면 충분한 환경이라면 얘기가 달라집니다. 카메라 2~4대 정도에서 문제가 생기면 타임라인만 훑어보는 수준이라면 전용 NVR이 더 잘 맞을 수 있습니다. Frigate의 진짜 가치는 AI라는 단어 자체보다 운영 자동화와 검색 비용 절감에 있습니다. 이 축이 중요하지 않으면, 도입 난이도 대비 이익이 크지 않을 수 있습니다.

    2. Frigate NVR 핵심 개념 쉽게 정리

    처음 보면 기능이 많아 보여도, 실제로는 세 가지 흐름만 이해하면 됩니다. 입력 영상, 감지 파이프라인, 저장과 이벤트 소비 경로입니다. 이걸 한 번에 보면 복잡한데, 나눠 보면 의외로 단순합니다.

    • 입력 영상: 카메라가 내보내는 메인 스트림과 서브 스트림입니다. 코덱, 해상도, 프레임레이트가 전체 시스템 성격을 거의 정합니다.
    • 감지 파이프라인: Frigate가 FFmpeg로 스트림을 읽고, 감지용 프레임을 detector에 넘기고, 추적 결과를 이벤트로 묶는 흐름입니다.
    • 이벤트 소비 경로: 녹화 저장, 스냅샷 생성, MQTT 발행, Home Assistant 자동화가 여기에 걸립니다.

    실무적으로 중요한 건 Frigate가 얼마나 똑똑한가보다 어떤 입력을 어떤 비용으로 처리하게 만들었는가입니다. 저는 보통 카메라 설정 50, 저장소 30, Frigate 설정 20 정도 감각으로 봅니다. 숫자는 비유지만, 체감상 병목은 Frigate 바깥에서 먼저 시작되는 경우가 많았습니다. 특히 서브 스트림 없이 메인 스트림 하나로 detect와 record를 같이 처리하는 구성은 처음엔 쉬워 보여도 운영 피로도가 빨리 올라가더라고요.

    어떤 환경에 특히 잘 맞나

    시나리오 Frigate 적합도 실무 판단
    Home Assistant 자동화 중심 홈랩 높음 이벤트를 MQTT, 대시보드, 알림, 조명 자동화로 자연스럽게 연결하기 좋습니다.
    그냥 녹화만 필요한 단순 환경 중간 이하 검색성과 자동화가 핵심 요구가 아니라면 전용 NVR이 구축과 운영 모두 단순합니다.
    여러 제조사 카메라 혼합 운영 높음 RTSP 기준으로 묶기 쉬워 벤더 종속을 줄이기 좋습니다.
    저전력 장비 한 대에 감지, 녹화, 자동화 몰아넣기 주의 CPU보다 디코딩, 디스크 I/O, 네트워크 품질, 하드웨어 가속 지원에서 먼저 무너질 가능성이 큽니다.
    보안 장비처럼 손 덜 대고 오래 굴리고 싶은 환경 낮음 업데이트, 로그 확인, 저장 정책 조정이 계속 필요할 수 있어 운영형 시스템에 가깝습니다.

    3. Frigate NVR 설계에서 먼저 볼 것

    처음 붙일 때 CPU와 메모리부터 보는 경우가 많은데, 제 경험상 우선순위는 조금 다릅니다. 먼저 봐야 할 건 스트림 분리 가능 여부, 카메라 코덱 설정, 저장소 분리, 네트워크 안정성입니다. 여기서 한 번 잘못 잡히면 Frigate 설정을 아무리 손봐도 운영이 쉽게 안정되지 않습니다.

    1. 카메라가 메인 스트림과 서브 스트림을 따로 제공하는지 확인합니다.
    2. 감지는 서브 스트림, 녹화는 메인 스트림으로 분리할 수 있는지 먼저 봅니다.
    3. 카메라가 H.264처럼 브라우저와 환경에서 다루기 쉬운 코덱을 안정적으로 내보내는지 확인합니다.
    4. 저장소를 OS 디스크와 분리할지, 최소한 미디어 경로를 분리할지 결정합니다.
    5. Home Assistant 연동이 필요하면 MQTT 브로커 위치를 먼저 정합니다.
    6. 원격 접근은 공개 포트 직결보다 VPN 또는 신뢰된 역방향 프록시 뒤에 둘지 결정합니다.

    여기서 자주 나오는 실수가 두 가지 있습니다. 첫째, 감지에 고해상도 메인 스트림을 그대로 넣는 경우입니다. 이렇게 하면 detect 정확도가 무조건 좋아지는 게 아니라, 디코딩 비용과 지연만 커지는 경우가 더 많습니다. 둘째, 녹화까지 서브 스트림으로 처리하는 경우입니다. 이벤트는 잘 잡혀도 나중에 확인할 때 디테일이 부족해 아쉬움이 크게 남습니다.

    결국 detect는 처리비용, record는 증거품질이라는 기준으로 따로 생각해야 합니다. 저도 예전에 현관 카메라 하나에 메인 스트림만 걸고 detect와 record를 동시에 맡겼다가 밤에 크게 돌아간 적이 있습니다. 낮에는 얼핏 괜찮았는데 밤이 되니까 UI 반응이 느려지고 감지 시점도 뒤로 밀리더라고요. 한참 Frigate 설정만 만졌는데, 실제 원인은 카메라 메인 스트림이 과했고 저장 디스크까지 같이 바빴던 거였습니다.

    4. 실전 구현: Docker Compose로 Frigate 띄우기

    홈랩에서는 컨테이너 기반 운영이 가장 다루기 편한 편입니다. 다만 compose 파일은 실행만 되는 예시보다, 왜 이렇게 두는지 설명되는 예시가 훨씬 중요합니다. 아래 예시는 현재 Frigate 공식 문서 흐름에 맞춘 최소 구성 기준으로 정리했습니다.

    1) 디렉터리 준비

    sudo mkdir -p /opt/frigate/config
    sudo mkdir -p /srv/frigate/media
    sudo mkdir -p /srv/frigate/db
    
    # 권한 점검: 컨테이너가 읽고 쓸 수 있는지 먼저 확인
    sudo chown -R $USER:$USER /opt/frigate /srv/frigate
    ls -ld /opt/frigate/config /srv/frigate/media /srv/frigate/db
    

    저는 설정 경로와 미디어 경로를 분리합니다. 백업 정책이 다르기 때문입니다. 설정과 DB는 보존 가치가 높고 용량은 작습니다. 반면 이벤트 클립과 녹화 파일은 금방 커집니다. 이 둘을 같은 디스크, 같은 백업 정책으로 묶어두면 나중에 운영이 꽤 지저분해집니다.

    2) docker-compose.yml 예시

    services:
      frigate:
        container_name: frigate
        image: ghcr.io/blakeblackshear/frigate:stable
        restart: unless-stopped
        stop_grace_period: 30s
        privileged: true
        shm_size: "512mb"
        ports:
          - "8971:8971"
          - "8554:8554"
          - "8555:8555/tcp"
          - "8555:8555/udp"
        environment:
          FRIGATE_RTSP_PASSWORD: "change-me"
        volumes:
          - /etc/localtime:/etc/localtime:ro
          - /opt/frigate/config:/config
          - /srv/frigate/media:/media/frigate
          - type: tmpfs
            target: /tmp/cache
            tmpfs:
              size: 1000000000
    

    shm_size를 대충 두면 디코딩과 버퍼 처리에서 애매한 문제가 납니다. UI만 보면 감지 문제처럼 보일 수 있는데, 실제로는 프레임 버퍼가 부족한 경우도 많습니다. tmpfs를 쓰는 이유도 비슷합니다. 공식 문서 기준으로도 녹화 세그먼트 캐시는 메모리 기반 /tmp/cache를 권장합니다. 물론 메모리 여유가 없는 장비라면 여기 숫자를 무리해서 크게 잡을 필요는 없습니다.

    하나 더 짚고 갈 부분이 있습니다. 최근 Frigate는 인증 UI와 API 접근에 8971 포트를 쓰는 구성을 기본으로 안내합니다. 5000 포트는 내부 네트워크용 비인증 접근으로 쓰는 흐름이라, 외부 노출 기준으로는 8971 쪽을 보는 게 더 안전합니다.

    Frigate NVR에서 메인 스트림과 서브 스트림을 분리한 설정 이미지

    메인 스트림은 녹화, 서브 스트림은 객체 감지에 쓰는 구성을 시각화한 이미지입니다.

    3) frigate 설정 파일 예시

    mqtt:
      enabled: true
      host: 192.168.0.10
      port: 1883
      topic_prefix: frigate
      client_id: frigate
    
    record:
      enabled: true
      motion:
        days: 3
      alerts:
        retain:
          days: 14
          mode: motion
      detections:
        retain:
          days: 14
          mode: active_objects
    
    snapshots:
      enabled: true
      retain:
        default: 7
    
    cameras:
      front_door:
        ffmpeg:
          inputs:
            - path: rtsp://user:{FRIGATE_RTSP_PASSWORD}@192.168.0.20:554/stream1
              roles:
                - record
            - path: rtsp://user:{FRIGATE_RTSP_PASSWORD}@192.168.0.20:554/stream2
              roles:
                - detect
        detect:
          enabled: true
          width: 1280
          height: 720
          fps: 5
        objects:
          track:
            - person
            - car
        snapshots:
          enabled: true
          bounding_box: true
          retain:
            default: 7
    

    여기서 봐야 할 건 문법보다 의미입니다. roles가 잘못 연결되면 기록은 남는데 감지가 안 되거나, 감지는 되는데 녹화 품질이 이상해질 수 있습니다. 그리고 예전 글에서 자주 보이던 record.events 형태보다, 현재 문서 기준으로는 record.alerts와 record.detections 구조를 기준으로 보는 편이 맞습니다.

    보존 기간도 처음부터 길게 잡지 않는 쪽을 권합니다. 파일 증가 속도를 먼저 확인하고 늘리는 게 훨씬 덜 피곤합니다. 특히 H.265는 저장 효율은 좋지만, 브라우저 호환성과 재생 환경을 같이 따져야 해서 홈랩이라면 초반엔 H.264 쪽이 더 다루기 편할 때가 많습니다.

    4) 컨테이너 실행과 상태 확인

    docker compose up -d
    docker compose ps
    docker logs --tail=200 frigate
    docker logs -f frigate
    

    설치 직후에는 에러 유무만 보지 말고, 어느 계층에서 끊기는지를 구분해서 봐야 합니다.

    • 연결 실패: 인증 오류, RTSP 경로 오타, 카메라 동시 접속 제한을 먼저 봅니다.
    • 디코딩 오류: 코덱 설정, 스트림 안정성, 공유 메모리 부족을 의심합니다.
    • 반복 재시작: 설정 문법, 볼륨 권한, 경로 쓰기 실패를 우선 확인합니다.
    • UI만 느림: 감지 엔진보다 디스크 I/O 또는 썸네일, 클립 생성 부하일 가능성이 큽니다.

    RTSP 스트림 자체가 안정적인지는 Frigate 바깥에서 꼭 따로 확인하는 게 좋습니다. 이걸 생략하면 원인이 뭉개져 보일 때가 많더라고요.

    ffprobe -hide_banner rtsp://user:[email protected]:554/stream1
    ffprobe -hide_banner rtsp://user:[email protected]:554/stream2
    

    이 단계에서 해상도, 코덱, 프레임 정보가 일관되지 않거나 접속이 들쑥날쑥하면, Frigate 이전 계층에서 이미 문제가 시작된 겁니다.

    5. Frigate NVR와 Home Assistant 연동 포인트

    Home Assistant 연동은 Frigate를 단순 NVR에서 운영 시스템으로 바꿔줍니다. 다만 실제로 중요한 건 연동 자체보다 어떤 이벤트를 어떤 문맥에서 쓸 것인가입니다. 기준 없이 다 알림으로 보내면 며칠 안 가서 사람이 알림을 무시하게 됩니다. 이거 진짜 금방 소음이 되더라고요.

    제가 권하는 방식은 이벤트를 세 단계로 나누는 겁니다. 기록용, 대시보드용, 즉시 알림용입니다. 예를 들어 사람 감지는 전부 기록하되, 심야 시간대 person 이벤트만 알림으로 보내고, 차량은 대시보드 위주로 소비하는 식입니다. Frigate가 잘 잡는다고 해서 모든 이벤트 가치가 같은 건 아니니까요.

    현재 기준으로는 Home Assistant의 공식 Frigate 통합을 우선 쓰는 편이 가장 깔끔합니다. 다만 MQTT 메시지 구조를 직접 확인하고 싶다면 아래처럼 먼저 브로커에서 실제 토픽을 보는 게 안전합니다.

    mqtt:
      sensor:
        - name: "Front Door Person Active Count"
          state_topic: "frigate/front_door/person/active"
          icon: mdi:account-alert
    

    수동 MQTT 센서를 쓸 수도 있지만, 먼저 실제 메시지가 올라오는지 눈으로 확인하는 게 더 중요합니다. 특히 frigate/front_door/person과 frigate/front_door/person/active는 의미가 다르기 때문에, 무턱대고 binary sensor로 고정하면 해석이 꼬일 수 있습니다.

    mosquitto_sub -h 192.168.0.10 -t 'frigate/#' -v
    
    # 특정 카메라 관련 이벤트만 좁혀보기
    mosquitto_sub -h 192.168.0.10 -t 'frigate/front_door/#' -v
    

    이 과정을 생략하면 Home Assistant 설정이 틀린 건지, MQTT가 안 오는 건지, Frigate가 이벤트를 못 만드는 건지 구분이 잘 안 됩니다. 저도 초반엔 HA 자동화가 문제인 줄 알고 붙잡고 있었는데, 실제론 Frigate 쪽 객체 추적 대상이 기대와 다르게 잡혀서 메시지가 아예 안 올라오던 적이 있었습니다.

    Home Assistant 연동으로 Frigate NVR 이벤트를 확인하는 대시보드 이미지

    객체 감지 이벤트가 센서와 알림으로 연결된 결과 예시를 보여주는 대시보드 이미지입니다.

    6. 운영 중 자주 만나는 문제와 해결법

    설치보다 운영이 더 어렵습니다. Frigate는 시작은 빠를 수 있어도, 오래 굴릴수록 문제의 성격이 달라집니다. 초반엔 설정 문법과 접속 오류가 많고, 조금 지나면 저장소, 네트워크, 카메라 품질 문제가 본격적으로 드러납니다. 아래는 제가 자주 본 실패 모드와 근본 원인입니다.

    사례 1: 녹화는 되는데 감지가 들쑥날쑥한 경우

    이 상황은 대개 Frigate 설정보다 입력 영상 품질 문제에서 시작합니다. 메인 스트림 하나에 detect와 record를 같이 물려두면 낮에는 버티다가 밤에 흔들리는 경우가 많습니다. 헤드라이트, IR 전환, 노이즈 억제, WDR 같은 카메라 내부 처리 영향이 생각보다 큽니다.

    1. detect용 스트림을 서브 스트림으로 분리합니다.
    2. 카메라의 WDR, 노이즈 억제, 야간 모드 전환 시점을 다시 봅니다.
    3. 객체 종류를 너무 넓게 잡지 말고 필요한 클래스만 추적합니다.
    4. 로그와 이벤트 시간을 비교해 지연이 감지 문제인지 디코딩 지연인지 구분합니다.

    핵심은 Frigate를 더 만지기 전에 카메라를 먼저 의심하는 것입니다. 영상이 흔들리는데 감지만 더 똑똑해지길 기대하면 답이 잘 안 나옵니다.

    사례 2: 디스크가 버벅이면서 UI까지 느려지는 경우

    연속 녹화, 스냅샷, 이벤트 클립이 쌓이면 저장소 쓰기 패턴이 꽤 거칠어집니다. 특히 OS, 컨테이너 데이터, 미디어 파일을 같은 디스크에 몰아두면 녹화는 되는데 보는 순간 느린 상태가 나옵니다. 이건 CPU 부족처럼 보여도 실제론 I/O 대기인 경우가 많습니다.

    iostat -x 1
    df -h
    du -sh /srv/frigate/media
    find /srv/frigate/media -type f | wc -l
    

    저는 여기서 %util, await, 파일 개수 증가 속도를 같이 봅니다. 이벤트가 몰릴 때만 순간적으로 튀는 건 자연스러울 수 있지만, 평시에도 디스크가 숨이 차 있으면 저장 정책을 먼저 줄여야 합니다. retain을 공격적으로 길게 잡는 것보다 실제 이벤트 밀도에 맞춰 보수적으로 시작하는 편이 훨씬 낫습니다.

    사례 3: ffmpeg 관련 오류가 반복되는 경우

    로그에 스트림 재연결이나 디코딩 오류가 반복될 때는 순서를 지켜서 봐야 합니다. Frigate 컨테이너만 재시작하는 건 보통 해결책이라기보다 증상 가리기에 가깝습니다.

    1. 카메라 RTSP URL이 정확한지 다시 확인합니다.
    2. 같은 스트림을 ffprobe로 직접 열어봅니다.
    3. 카메라 코덱과 해상도 설정이 과하지 않은지 봅니다.
    4. PoE 스위치, 케이블, 링크 상태를 포함한 네트워크 층을 확인합니다.
    ffprobe rtsp://user:[email protected]:554/stream1
    ping -c 20 192.168.0.20
    docker logs --tail=200 frigate | grep -iE 'error|fail|ffmpeg|restart'
    

    Frigate 문제처럼 보여도 원인이 카메라 펌웨어, 링크 품질, 전원 불안정인 경우가 꽤 많습니다. 저도 예전에 PoE 스위치 포트 상태가 애매해서 RTSP가 간헐적으로 끊기는 걸 한참 뒤에 찾았습니다. 이런 문제는 설정 파일만 만진다고 해결되지 않습니다.

    사례 4: 알림은 오는데 정작 볼 만한 이벤트가 너무 많은 경우

    이건 성능 이슈가 아니라 설계 이슈입니다. 시스템은 정상인데 사람이 못 쓰는 상태죠. 이벤트를 많이 잡는 것과 유용하게 잡는 건 다릅니다. 낮 시간 현관, 도로 변 카메라, 반사면이 많은 창가 카메라에서 특히 자주 생깁니다.

    1. 알림용 이벤트와 기록용 이벤트를 분리합니다.
    2. 밤 시간대, 특정 구역, 특정 객체만 알림 대상으로 좁힙니다.
    3. Home Assistant에서 조건부 자동화를 먼저 걸고 Frigate는 과도하게 만지지 않습니다.

    여기서 중요한 건 Frigate를 오탐 0% 도구로 기대하지 않는 겁니다. 운영자는 탐지 정확도보다 알림 가치 밀도를 높이는 쪽으로 설계하는 게 훨씬 현실적입니다.

    7. 검증: 무엇을 보고 정상 동작으로 판단할까

    정상 동작을 웹 UI가 뜬다로만 판단하면 결국 다시 손보게 됩니다. 최소한 이벤트 생성, MQTT 전달, 저장 정책, 재시작 복구, 조회 응답성까지 봐야 합니다. 저는 배포 직후와 카메라 추가 직후에 같은 체크리스트를 반복합니다.

    • 이벤트 생성 흐름: 사람이 지나갈 때 이벤트, 스냅샷, 클립이 일관되게 남는지 봅니다.
    • MQTT 전파: 이벤트가 브로커까지 실제로 전달되는지 확인합니다.
    • 스토리지 적재: /media/frigate 아래 파일이 예상한 보존 정책대로 누적, 정리되는지 확인합니다.
    • 재부팅 복구: 호스트 또는 컨테이너 재시작 후 자동으로 회복되는지 봅니다.
    • UI 응답성: 이벤트 목록 조회와 최근 영상 접근이 과도하게 느리지 않은지 확인합니다.

    검증할 때는 단순 모니터링보다 문제 분리용 명령이 필요합니다. 저는 아래 정도는 바로 돌려봅니다.

    docker stats
    ls -lah /srv/frigate/media
    du -sh /srv/frigate/media
    docker inspect frigate --format '{{.State.Status}}'
    docker restart frigate
    docker logs --since=2m frigate
    

    여기서 중요한 건 숫자 자체보다 변화 시점입니다. 사람이 지나갈 때만 CPU가 오르는 건 자연스러울 수 있습니다. 하지만 평소에도 높게 유지되면 감지 대상이 과하거나 스트림 구성이 비효율적일 가능성이 큽니다. 디스크도 마찬가지입니다. 총 용량보다 하루에 얼마나 늘어나는지, 이벤트 밀도가 높은 날에 정리 정책이 제대로 작동하는지가 더 중요합니다.

    이벤트 리스트, 클립 저장, 리소스 사용 상태를 함께 확인하는 운영 점검 이미지입니다.

    8. Frigate NVR 도입 전에 꼭 따져볼 선택 기준

    Frigate를 쓸지, 전용 NVR을 쓸지, 혼합 구성을 쓸지는 좋다 나쁘다로 고를 문제가 아닙니다. 운영 목표가 무엇인지에 따라 답이 달라집니다. 아래 표는 실제로 많이 받는 질문을 기준으로 정리한 것입니다.

    고민 포인트 이럴 땐 Frigate 이럴 땐 전용 NVR 또는 혼합 구성
    자동화가 중요한가 Home Assistant, MQTT, 조건부 알림까지 엮고 싶을 때 앱에서 보기만 하면 충분할 때
    설정보다 간편함이 중요한가 설정 파일과 로그 확인을 감수할 수 있을 때 초기 구축 시간을 짧게 가져가야 할 때
    카메라 제조사가 섞여 있는가 표준 스트림 기준 통합 운영이 필요할 때 한 브랜드로 통일돼 제조사 앱 완성도가 충분할 때
    저장소와 네트워크를 직접 관리할 자신이 있는가 스토리지, 백업, 접근제어까지 직접 설계할 때 운영 책임을 줄이고 싶을 때
    문제 해결 방식 로그와 계층별 점검으로 원인을 추적하는 데 익숙할 때 장비 교체 또는 벤더 지원 중심으로 해결하고 싶을 때

    제가 실무적으로 추천하는 기준은 단순합니다. 이벤트를 다른 시스템과 연결해 써야 하면 Frigate NVR, 영상 보관 자체가 목적이면 전용 NVR입니다. 그리고 이 둘을 혼합하는 것도 충분히 현실적인 선택입니다. 예를 들어 안정적인 연속 녹화는 전용 장비에 맡기고, 특정 카메라의 이벤트 자동화만 Frigate로 가져가는 구성도 꽤 괜찮습니다.

    즉, Frigate는 제품 하나 설치해서 끝나는 장비라기보다 카메라 품질, 네트워크 안정성, 스토리지, 자동화 요구사항을 묶어 운영하는 플랫폼에 가깝습니다. 홈랩을 즐기는 분께는 이 유연성이 큰 장점이지만, 손이 덜 가는 보안 장비를 원한다면 장점이 곧 관리 포인트가 되기도 합니다.

    9. 마무리: 이런 분께는 Frigate, 이런 분께는 다른 선택

    제가 직접 굴려보며 얻은 판단은 꽤 선명합니다. 카메라 2~4대 규모에서 Home Assistant 연동, 객체 감지 기반 알림, 이벤트 검색이 핵심이라면 Frigate NVR 쪽이 잘 맞습니다. 이 경우에는 처음부터 detect와 record를 분리하고, 미디어 저장 경로를 OS와 분리하고, MQTT 이벤트를 먼저 검증하는 순서로 들어가면 시행착오를 많이 줄일 수 있습니다.

    반대로 목표가 무조건 안정적으로 녹화하고 필요할 때 영상만 찾겠다는 쪽에 가깝다면 전용 NVR이나 제조사 클라우드 조합이 더 현실적입니다. 설정 파일 만지는 시간이 부담스럽고, 장애가 났을 때 로그를 따라가며 원인을 찾고 싶지 않다면 더더욱 그렇습니다. Frigate는 강력하지만, 공짜로 단순해지지는 않더라고요.

    한 줄로 정리하면 이렇습니다. 이벤트를 시스템으로 쓰고 싶으면 Frigate, 영상을 장비로 보관하고 싶으면 전용 NVR이 더 낫습니다. 저는 홈랩이라면 전자를 권하지만, 전제는 분명합니다. 스트림 분리, 저장소 분리, 이벤트 설계까지 같이 볼 생각이 있을 때 이야기입니다.

    바로 다음 단계로 넘어가실 분이라면, Frigate를 띄운 뒤 가장 먼저 할 일은 설정을 더 늘리는 게 아닙니다. 현관 카메라 하나만 붙여서 이벤트 생성, MQTT 전달, 디스크 증가 패턴, 재시작 복구까지 확인해보는 겁니다. 이 작은 파일럿을 통과하면 확장하면 되고, 여기서부터 흔들리면 카메라나 저장소 설계를 먼저 고치는 편이 훨씬 덜 돌아갑니다.

    Frigate NVR 도입 판단 기준을 정리한 홈 보안 카메라 비교 이미지

    어떤 환경에서 Frigate가 맞고, 어떤 경우 전용 NVR이 더 나은지 한 장으로 정리한 요약 이미지입니다.

  • [보안] Suricata IDS/IPS 6개월 운영 회고: 오탐 줄이고 위협 탐지율 높이기

    [보안] Suricata IDS/IPS 6개월 운영 회고: 오탐 줄이고 위협 탐지율 높이기

    [보안] Suricata IDS/IPS 6개월 운영 회고: 오탐 줄이고 위협 탐지율 높이기

    홈랩과 소규모 운영망에서 Suricata IDS/IPS를 6개월 정도 굴려보면, 처음 기대했던 그림과 실제 운영 감각이 꽤 다르다는 걸 느끼게 됩니다. 처음엔 “오픈소스 보안 도구 하나 올리면 네트워크 보안이 한 단계 올라가겠지” 싶었거든요. 그런데 막상 붙여보니 알림은 많은데 중요한 이벤트가 묻히고, 정상 트래픽까지 의심해서 마음이 불편해지는 순간이 꼭 옵니다. 저도 처음엔 이게 뭔가 싶었는데, 결국 핵심은 엔진 자체보다 룰 관리, 네트워크 맥락 이해, 로그 검증 습관이더라고요.

    이번 글은 제가 직접 해보면서 겪었던 시행착오를 정리한 회고입니다. 단순 설치기가 아니라, Suricata IDS/IPS를 실제로 6개월 운영하면서 어떻게 오탐(false positive, 정상인데 경고가 나는 경우)을 줄였는지, 그리고 위협 탐지율을 높이기 위해 어떤 기준으로 튜닝했는지 차근차근 풀어보겠습니다. 혹시 알림이 너무 많아서 결국 대시보드를 안 열게 되는 단계까지 가보신 적 있으신가요? 그 상태가 딱 개선 포인트입니다.

    Suricata IDS/IPS 기반 홈랩 네트워크 보안 아키텍처 이미지

    Suricata가 스위치 미러링 또는 인라인 구간에서 트래픽을 분석하는 전체 구조를 보여주는 개요 이미지입니다.

    Suricata IDS/IPS, 쉽게 말해 뭐가 다른가요?

    쉽게 말해 IDS(Intrusion Detection System, 침입 탐지 시스템)는 “수상한 걸 찾아서 알려주는 역할”이고, IPS(Intrusion Prevention System, 침입 방지 시스템)는 “수상한 걸 찾아서 막는 역할”입니다. 같은 엔진을 쓰더라도 어느 위치에 두고 어떤 정책으로 동작시키느냐에 따라 체감이 꽤 달라집니다.

    Suricata는 패킷(packet, 네트워크를 오가는 데이터 조각)을 보고 시그니처(signature, 알려진 패턴) 기반으로 탐지할 수 있고, 프로토콜 단위로 로그를 꽤 잘 뽑아줍니다. 실제로 써보니까 단순히 “악성 트래픽 잡는 도구”라기보다, 내 네트워크에서 평소 어떤 통신이 오가는지 이해하게 만들어주는 관찰 장비에 더 가깝더라고요. 이 관점이 생기니 운영이 훨씬 편해지더라고요.

    구분 IDS 모드 IPS 모드
    목적 탐지와 경보 탐지 후 차단
    장점 업무 영향이 적음 즉각 대응 가능
    단점 후속 대응이 필요 오탐 시 정상 서비스 영향
    추천 시작점 초기 도입 단계 검증 후 점진 적용

    제가 6개월 운영하면서 내린 결론은 단순했습니다. 처음부터 IPS로 크게 가면 삽질합니다 ㅎㅎ 먼저 IDS로 충분히 관찰하고, 자주 보이는 정상 패턴을 이해한 뒤 일부 룰만 선별적으로 차단하는 쪽이 훨씬 안정적이었습니다.

    6개월 운영하면서 느낀 핵심: 규칙보다 맥락이 먼저다

    처음에는 Emerging Threats 계열 룰셋을 넣고 경고가 많이 뜨는 걸 보면서 “오, 잘 잡히네”라고 생각했었습니다. 근데 여기서 함정이 있습니다. 경고가 많다고 탐지가 잘 되는 게 아니거든요. 오히려 운영자는 금방 피로해집니다. 제가 초반에 가장 많이 한 실수가 모든 경고를 동일한 중요도로 본 것입니다.

    실제로 중요한 포인트는 아래 네 가지였습니다.

    • 자산 분류: 서버, NAS, 개발 장비, IoT, 테스트 VM을 구분해야 합니다.
    • 트래픽 방향: Ingress(인그레스, 외부에서 내부로 들어오는 트래픽)와 Egress(이그레스, 내부에서 외부로 나가는 트래픽)를 분리해서 봐야 합니다.
    • 기준선 파악: 평소 정상 통신이 뭔지 알아야 이상 징후가 보입니다.
    • 차단 범위 절제: 처음부터 광범위 차단보다 고신뢰 규칙만 선별 적용해야 합니다.

    예를 들어 백업 서버가 새벽마다 외부 저장소와 대용량 TLS 통신을 하는데, 그걸 평소 패턴으로 인지하지 못하면 이상 트래픽처럼 보일 수 있습니다. 반대로 평소 조용한 관리망에서 갑자기 특정 호스트가 다수의 외부 목적지로 연결을 시도하면, 그건 규칙 경고가 약하더라도 직접 확인해볼 가치가 높습니다. 이게 운영의 감각 차이더라고요.

    실전 구현: Suricata를 6개월 안정적으로 운영하는 구성

    이제 제가 실제로 정착시킨 흐름을 정리해보겠습니다. 배포 환경마다 패키지명이나 경로는 조금 다를 수 있으니, 아래 예시는 운영 개념과 설정 방향 위주로 보시면 됩니다. 저는 처음부터 복잡하게 가지 않고, 미러 트래픽을 보는 IDS 성격으로 시작한 뒤 검증된 일부 정책만 IPS에 가까운 운영으로 확장했습니다.

    1. 트래픽 위치 선정: 코어 스위치 미러 포트나 경계 구간처럼 관찰 가치가 높은 위치를 먼저 잡습니다.
    2. HOME_NET 정의: 보호 대상 대역을 명확히 지정합니다.
    3. 규칙셋 최소화: 다 넣지 말고 필요한 범주부터 켭니다.
    4. EVE 로그 정리: JSON 로그를 검색 가능한 형태로 적재합니다.
    5. 오탐 라벨링: 반복되는 정상 이벤트를 분류합니다.
    6. 선별 차단: 충분히 검증된 규칙만 차단 동작에 연결합니다.

    1. 기본 설정에서 가장 먼저 볼 항목

    여기서 중요한 포인트! 설치보다 suricata.yaml의 네트워크 범위와 출력 로그가 더 중요합니다. 저도 처음엔 기본값으로 돌렸었는데, 로그는 쌓여도 운영에 쓸 만한 정보가 정리되지 않더라고요.

    vars:
      address-groups:
        HOME_NET: "[192.168.10.0/24,192.168.20.0/24,10.10.0.0/16]"
        EXTERNAL_NET: "!$HOME_NET"
    
    default-rule-path: /etc/suricata/rules
    
    rule-files:
      - suricata.rules
      - local.rules
    
    outputs:
      - eve-log:
          enabled: yes
          filetype: regular
          filename: /var/log/suricata/eve.json
          types:
            - alert
            - http
            - dns
            - tls
            - flow
            - ssh

    HOME_NET을 제대로 잡아두면 해석이 쉬워집니다. 어떤 경고가 내부 자산 보호와 직접 연결되는지 판단이 빨라지거든요. 그리고 EVE JSON 로그는 나중에 검색, 집계, 시각화할 때 정말 편합니다. 이건 진짜 편하더라고요.

    2. 로컬 예외 규칙과 임계치(threshold) 조정

    오탐을 줄이는 데 가장 효과가 컸던 건 거창한 차단 정책이 아니라, 예외 처리와 빈도 제한이었습니다. 같은 이벤트가 짧은 시간에 수십 번 반복되면 운영자가 무뎌집니다. 그래서 반복성 높은 이벤트는 threshold를 걸고, 정상으로 검증된 내부 서비스는 suppress 또는 pass 정책을 검토했습니다.

    sudo suricata -T -c /etc/suricata/suricata.yaml -v
    sudo systemctl restart suricata
    sudo tail -f /var/log/suricata/eve.json
    threshold:
      - gen_id: 1
        sig_id: 1000001
        type: threshold
        track: by_src
        count: 5
        seconds: 60

    다만 여기서 조심해야 합니다. 무턱대고 억제하면 진짜 신호까지 가려집니다. 저는 반복되는 경고를 바로 끄지 않고, 최소 며칠은 패턴을 관찰했습니다. 특히 내부 스캐너, 취약점 점검 도구, 백업 에이전트, 모니터링 시스템은 보안 장비 입장에서 꽤 시끄러운 존재거든요.

    Suricata IDS/IPS 설정과 로그 흐름 구성 다이어그램

    HOME_NET, 규칙 파일, EVE JSON 출력, 로그 적재 경로를 한눈에 보여주는 구성 이미지입니다.

    3. 운영자가 읽기 쉬운 로컬 규칙 추가

    기본 규칙셋만 믿고 가기보다, 운영 환경에 맞는 가벼운 로컬 규칙을 추가하면 체감이 좋습니다. 예를 들어 관리망에서 외부로 나가는 비표준 포트 연결, 평소 쓰지 않는 국가 대역과의 통신, 특정 테스트 구간의 스캔 패턴 같은 것들이죠. 아래는 아주 단순한 예시입니다.

    alert tcp $HOME_NET any -> $EXTERNAL_NET 8443 \
      (msg:\"LOCAL Suspicious outbound 8443\"; flow:to_server; sid:1000001; rev:1;)
    
    alert icmp $EXTERNAL_NET any -> $HOME_NET any \
      (msg:\"LOCAL External ICMP to HOME_NET\"; sid:1000002; rev:1;)

    물론 이런 규칙은 환경에 따라 너무 시끄러울 수 있습니다. 그래서 저는 로컬 규칙을 추가할 때마다 꼭 물었습니다. 이 알림이 떠서 내가 실제로 행동할 수 있는가? 행동으로 이어지지 않는 경고는 결국 소음이 되더라고요.

    ⚠️ 실제로 겪었던 문제들: 오탐 줄이다가 탐지를 망치는 순간

    6개월 동안 가장 많이 배운 건 “줄이는 기술”보다 “안 줄여야 할 걸 구분하는 기술”이었습니다. 저도 초반에는 너무 시끄러워서 여러 규칙을 공격적으로 꺼봤는데, 나중에 보니 관찰 가치가 높은 이벤트까지 같이 묻힌 적이 있었습니다.

    문제 1. 개발 환경 트래픽이 전부 수상해 보였던 경우

    컨테이너 이미지 다운로드, 패키지 저장소 접근, 각종 API 호출이 반복되면서 외부 연결이 정말 많아집니다. 개발망을 일반 사용자망과 같은 기준으로 보면 경고가 폭증합니다.

    해결: 네트워크 세그먼트(segment, 구간)별로 기대 동작을 분리했습니다. 개발망은 외부 통신이 상대적으로 많다는 걸 전제로 보고, 관리망과 서버망은 더 엄격하게 봤습니다.

    문제 2. DNS 관련 경고가 너무 많아서 안 보게 된 경우

    내부 DNS 포워더나 광고 차단 DNS, 테스트용 질의가 섞이면 경고 해석이 꽤 까다롭습니다. 처음엔 전부 수상해 보여서 하나하나 열어봤는데, 솔직히 금방 지치더라고요.

    해결: DNS는 쿼리 양보다 희귀성과 대상을 중심으로 봤습니다. 자주 가는 정상 도메인보다, 평소 없던 패턴이나 관리 자산에서 나온 이례적 질의를 우선 확인했습니다.

    문제 3. IPS 성격의 차단을 너무 빨리 건 경우

    이거 삽질 좀 했습니다 ㅎㅎ 특정 시그니처를 신뢰하고 차단을 걸었는데, 정상 자동화 작업이 막히는 일이 생겼습니다. 보안은 강화됐는데 운영이 불편해지는 전형적인 상황이었죠.

    해결: 차단은 아래 기준을 통과한 것만 적용했습니다.

    • 최소 며칠 이상 반복 관찰된 이벤트일 것
    • 정상 서비스와 충돌하지 않을 것
    • 차단 시 영향 범위를 설명할 수 있을 것
    • 롤백 방법이 준비되어 있을 것

    문제 4. 로그는 쌓이는데 검증 루틴이 없었던 경우

    Suricata가 잘 동작하는지 확인하려면, 단순히 프로세스가 떠 있는지만 보면 안 됩니다. 이벤트가 생성되고, 로그가 적재되고, 필요한 사람이 그 로그를 읽을 수 있어야 하거든요.

    해결: 주 1회라도 좋으니 검증 루틴을 만들었습니다. “경고 발생 여부”가 아니라 “의미 있는 경고가 해석 가능한 상태인지”를 체크하는 습관이 생기니 운영 품질이 달라졌습니다.

    검증 방법: 탐지율을 높였는지 어떻게 확인했나

    보안 장비 운영에서 늘 어려운 질문이 이겁니다. “그래서 지금 더 잘 잡고 있나요?” 저도 처음엔 대답이 애매했습니다. 벤치마크 수치를 함부로 말할 수는 없고, 그렇다고 느낌만 얘기할 수는 없으니까요. 그래서 저는 정량보다는 운영 지표 중심으로 봤습니다.

    운영 전후 비교 항목 초기 상태 6개월 후 체감
    알림 피로도 높음 확실히 감소
    이벤트 해석 시간 길었음 짧아짐
    정상/비정상 구분 애매함 기준선이 생김
    차단 정책 신뢰도 낮음 선별 적용 가능

    제가 실제로 확인한 지표는 이런 것들이었습니다.

    1. 하루 경고 수 자체보다, 확인할 가치가 있는 경고 비율이 늘었는가
    2. 같은 오탐을 반복해서 보지 않게 되었는가
    3. 이상 이벤트가 떴을 때 자산, 방향, 서비스 맥락을 바로 설명할 수 있는가
    4. 차단 정책 적용 후 정상 업무 영향이 줄어들었는가

    이 기준으로 보니 분명한 변화가 있었습니다. 초반에는 이벤트가 많아도 대응 품질이 낮았는데, 나중에는 이벤트 수가 조금 줄더라도 대응 가능한 알림의 밀도가 높아졌습니다. 드디어 됐다! 싶은 순간이 이런 때였네요.

    Suricata IDS/IPS 운영 결과와 오탐 감소 대시보드 이미지

    경고 수 변화, 오탐 감소 추세, 검토 가치가 높은 이벤트 비율 상승을 시각화한 결과 이미지입니다.

    제가 정착시킨 운영 체크리스트

    혹시 지금 막 Suricata를 붙여놓고 “이 다음엔 뭘 해야 하지?” 싶은 분이라면, 아래 체크리스트부터 시작해보시면 좋겠습니다. 저도 처음엔 거창한 설계를 하려다가 오히려 복잡해졌고, 결국 이 기본기로 돌아왔습니다.

    • 보호 대상 정의: 무엇을 지키는지 먼저 정합니다.
    • 네트워크 구간 분리: 사용자망, 서버망, 관리망, 실험망을 섞어 보지 않습니다.
    • 로그 우선순위 설정: alert, dns, http, tls, flow 중 필요한 것부터 봅니다.
    • 오탐 기록: 같은 이벤트를 다시 분석하지 않도록 메모를 남깁니다.
    • 규칙 변경 이력 관리: 왜 끄고 왜 켰는지 근거를 남깁니다.
    • 차단 전 검증: IDS에서 충분히 본 뒤 IPS 성격 정책으로 넘깁니다.

    특히 침입 탐지 시스템과 침입 방지 시스템을 같은 것으로 다루지 않는 태도가 중요했습니다. 엔진은 같아 보여도 운영 책임은 완전히 다르거든요. 탐지는 관찰의 문제이고, 차단은 서비스 영향까지 떠안는 결정입니다.

    자주 묻는 질문: Suricata 운영에서 헷갈리는 부분들

    Q1. 처음부터 IPS로 가도 될까요?

    제 경험상 권장하지 않습니다. 먼저 IDS로 기준선을 잡고, 신뢰도가 높은 일부 정책만 단계적으로 차단에 연결하는 게 안전했습니다.

    Q2. 오탐은 어느 정도가 정상인가요?

    환경마다 다릅니다. 중요한 건 절대 숫자보다, 같은 오탐을 반복해서 방치하지 않는 운영 루틴입니다.

    Q3. 규칙을 많이 넣을수록 좋은가요?

    아닙니다. 많이 넣는 것보다, 내 환경에서 의미 있게 읽을 수 있는 규칙을 유지하는 게 더 중요했습니다.

    Q4. 소규모 홈랩에도 가치가 있나요?

    충분히 있습니다. 특히 트래픽 흐름을 이해하고, 평소와 다른 행위를 잡아내는 감각을 키우는 데 큰 도움이 됩니다.

    마무리: 6개월 운영하고 나니, 진짜 중요한 건 도구보다 습관이었습니다

    Suricata IDS/IPS를 6개월 운영해보니 가장 크게 남은 건 화려한 탐지 기능보다 운영 습관이었습니다. 정상 트래픽을 이해하는 습관, 오탐을 기록하는 습관, 차단 전에 충분히 검증하는 습관 말이죠. 사실 이런 기본기가 없으면 어떤 오픈소스 보안 도구를 붙여도 금방 지치게 됩니다.

    반대로 이 루틴이 잡히면, 네트워크 보안은 훨씬 현실적인 수준으로 올라갑니다. 로그가 더 이상 소음이 아니라 단서로 보이기 시작하거든요. 저도 처음엔 경고가 많아 반쯤 포기할 뻔했는데, 환경별 기준선과 규칙 정리를 해놓고 나니 운영이 훨씬 편해졌습니다. 이건 생각보다 큰 차이입니다.

    도입 초기와 6개월 후의 차이, 오탐 감소 원칙, 차단 적용 기준을 요약한 인포그래픽 이미지입니다.

    다음 글에서는 EVE JSON 로그를 조금 더 실무적으로 다뤄보려고 합니다. 예를 들어 어떤 필드를 우선 봐야 하는지, 검색 시스템과 붙일 때 무엇을 남기고 무엇을 버릴지 같은 부분이요. 이전 글에서 다뤘던 홈랩 네트워크 분리 전략과 같이 보면 더 이해가 잘 되실 겁니다. 혹시 지금 운영 중인 Suricata IDS/IPS에서 제일 힘든 부분이 오탐인지, 차단 정책인지, 아니면 로그 해석인지 한 번 점검해보세요. 거기서부터 개선 방향이 꽤 선명해집니다. 🎉

  • [보안] IDS IPS 비교: Snort vs Suricata 선택 가이드

    [보안] IDS IPS 비교: Snort vs Suricata 선택 가이드

    [보안] IDS IPS 비교: Snort vs Suricata 선택 가이드

    IDS IPS 비교를 하다 보면 결국 같은 질문으로 돌아오게 됩니다. Snort와 Suricata 중 우리 환경에는 뭐가 맞을까? 저도 처음엔 이게 뭔가 싶었거든요. 둘 다 오픈소스 IDS/IPS라서 비슷해 보이는데, 실제로 운영에 올려보면 성격이 꽤 다릅니다. 특히 홈랩(Home Lab, 개인 실험용 인프라)이나 소규모 사내망에서는 성능, 룰(rule, 탐지 규칙) 관리, 로그 분석 방식에서 체감 차이가 꽤 크게 납니다.

    제가 직접 해보니, 이 선택은 단순히 기능표 한 줄로 끝나는 문제가 아니었습니다. 침입 탐지 시스템(IDS, Intrusion Detection System)으로만 쓸 건지, 침입 방지 시스템(IPS, Intrusion Prevention System)까지 확장할 건지에 따라 접근이 달라지더라고요. 이번 글에서는 Snort와 Suricata를 실무 관점에서 비교하고, 실제로 어떻게 붙여서 테스트하면 되는지, 그리고 어디서 많이 막히는지까지 정리해보겠습니다.

    IDS IPS 비교를 위한 Snort와 Suricata 네트워크 보안 아키텍처 이미지

    Snort와 Suricata가 스위치 미러링 포트 또는 TAP에서 트래픽을 받아 분석하는 전체 구조를 보여주는 이미지입니다.

    1. 왜 아직도 Snort vs Suricata 이야기가 중요한가

    요즘 보안 이야기를 하면 EDR(Endpoint Detection and Response, 엔드포인트 탐지 및 대응), XDR(Extended Detection and Response, 확장형 탐지 대응) 같은 단어가 더 많이 보이죠. 근데 네트워크 레벨에서 뭔가 이상한 패턴을 빠르게 잡아내는 역할은 여전히 중요합니다. 특히 내부망에서 이상 트래픽이 보이거나, 외부에서 들어오는 스캔(scan, 포트 탐색)이나 익스플로잇(exploit, 취약점 공격 시도)을 보고 싶을 때 오픈소스 IDS/IPS는 아직도 꽤 유용합니다.

    혹시 이런 경험 있으신가요? 방화벽(Firewall, 네트워크 접근 제어)은 잘 돌아가는데, 막상 어떤 패킷(packet, 네트워크 데이터 조각)이 오가는지는 감이 안 잡히는 상황이요. 저도 처음엔 로그만 보면 되겠지 했었는데, 실제로는 방화벽 로그만으로는 애플리케이션 계층의 이상 징후가 잘 안 보이는 경우가 있었습니다. 그럴 때 Snort나 Suricata 같은 네트워크 보안 도구가 꽤 든든합니다.

    2. IDS와 IPS, 쉽게 말해 뭐가 다른가

    쉽게 말해 IDS는 보고하는 역할이고, IPS는 막는 역할입니다. 둘 다 패킷을 들여다보면서 시그니처(signature, 알려진 패턴)나 이상 징후를 찾는데, IDS 모드에서는 경고(alert)를 남기고, IPS 모드에서는 패킷을 드롭(drop, 차단)하거나 세션을 끊어버린다는 차이가 있어요.

    여기서 중요한 포인트! 같은 엔진이라도 배치 방식에 따라 완전히 다른 운영 경험이 됩니다. 미러 포트(SPAN port, 스위치 복제 포트)에 물리면 주로 IDS처럼 쓰게 되고, 인라인(inline, 트래픽 경로 중간 삽입)으로 넣으면 IPS처럼 동작시키는 구조가 많습니다.

    항목 Snort Suricata
    기본 성격 오랫동안 널리 사용된 전통적인 IDS/IPS 멀티스레드 기반 처리에 강점이 있는 IDS/IPS
    룰 호환성 Snort 룰 중심 Snort 스타일 룰을 상당수 활용 가능
    성능 접근 가볍게 시작하기 쉬운 편 코어를 잘 활용하는 환경에서 유리한 편
    로그 환경에 따라 별도 연계가 필요 EVE JSON 같은 구조화 로그 활용이 편리함
    사용자 인상 전통적이고 자료가 많음 현대적인 운영 파이프라인과 잘 맞음

    3. Snort vs Suricata, 실무에서 체감한 차이

    3-1. Snort의 장점

    • 역사가 길어서 참고 자료가 많습니다. 오래된 블로그 글이나 포럼까지 포함하면 트러블슈팅 힌트가 많아요.
    • 룰 기반 탐지 개념을 익히기 좋습니다. 처음 IDS를 공부할 때 구조를 이해하기 편하더라고요.
    • 작게 시작하기 부담이 적습니다. 테스트 VM 한 대에서 감 잡기 좋았습니다.

    3-2. Suricata의 장점

    • 멀티스레드(Multi-thread, 다중 스레드) 활용이 강점입니다. CPU 코어를 여러 개 활용하는 환경에서 유리하더라고요.
    • EVE JSON 로그가 편합니다. Elasticsearch, OpenSearch, Loki 같은 로그 스택과 연결할 때 손이 덜 갑니다.
    • 프로토콜 가시성(visibility, 식별 가능성)이 좋습니다. 나중에 분석할 때 정보가 잘 남는 편입니다.

    3-3. 언제 무엇을 고르면 좋을까

    제가 실제로 써보니까 기준은 생각보다 단순했습니다.

    1. 가볍게 개념 검증(PoC, Proof of Concept)을 하고 싶다면 Snort가 더 직관적일 수 있습니다.
    2. 로그 파이프라인까지 포함해 운영 자동화를 생각한다면 Suricata 쪽이 손에 잘 붙습니다.
    3. CPU 코어가 여유 있고 트래픽이 많은 편이다면 Suricata가 더 편했던 경우가 많았습니다.
    4. 기존 룰 자산이나 운영 경험이 Snort 중심이다면 무리해서 갈아탈 필요는 없습니다.

    결국 IDS IPS 비교의 핵심은 기능 숫자보다 운영 방식입니다. 성능이냐, 익숙함이냐, 로그 활용성이냐. 이 세 가지를 먼저 정리해두면 선택이 빨라집니다.

    4. 실전 구현: 홈랩에서 빠르게 비교해보기

    이제 진짜 중요한 부분이죠. 말로만 비교하면 감이 잘 안 옵니다. 그래서 저는 보통 같은 트래픽 소스에 대해 두 엔진을 각각 돌려보고 경고와 로그를 비교해봅니다. 아래 예시는 Debian/Ubuntu 계열 리눅스에서 테스트할 때 많이 쓰는 흐름입니다. 배포판에 따라 패키지 이름이나 설정 경로는 조금 다를 수 있습니다.

    4-1. 테스트 환경 준비

    1. 분석용 리눅스 서버 1대 준비
    2. 미러링된 인터페이스 또는 테스트용 NIC(Network Interface Card, 네트워크 카드) 연결
    3. 패킷 캡처 도구와 룰셋 준비
    4. 공격 시뮬레이션용 테스트 트래픽 생성
    sudo apt update
    sudo apt install -y suricata snort tcpdump

    패키지 설치는 이 정도로 시작할 수 있습니다. 환경에 따라 Snort는 추가 설정 질문이 나올 수 있습니다. 저도 처음엔 여기서 네트워크 대역 설정을 대충 넣었다가, 왜 경고가 이상하게 뜨지 하고 삽질 좀 했습니다 ㅎㅎ

    4-2. Snort 기본 점검

    Snort는 먼저 설정 파일에서 내부망 대역과 룰 파일 경로를 확인하는 게 중요합니다.

    sudo snort -T -c /etc/snort/snort.conf

    위 명령은 테스트 모드입니다. 설정 문법에 문제가 없는지 먼저 확인합니다. 이거 안 하고 바로 돌리면 나중에 경고가 안 뜨는 이유를 한참 찾게 되거든요.

    sudo snort -A console -q -c /etc/snort/snort.conf -i eth1

    <code>eth1은 미러링된 인터페이스 예시입니다. 실제 인터페이스명으로 바꿔야 합니다. 콘솔 경고 출력으로 반응을 바로 보기에 좋습니다.

    4-3. Suricata 기본 점검

    Suricata는 YAML 기반 설정이라 가독성은 괜찮은데, 인터페이스와 룰 경로, 출력 포맷을 꼭 확인해야 합니다.

    sudo suricata -T -c /etc/suricata/suricata.yaml
    sudo suricata -i eth1 -c /etc/suricata/suricata.yaml

    기본 로그는 보통 /var/log/suricata/ 아래에 쌓입니다. 여기서 eve.json이 특히 편합니다. JSON 구조라 후처리가 쉬워요.

    Snort와 Suricata 설정 및 패킷 미러링 구성 이미지

    룰 파일, 인터페이스, 로그 경로를 연결해서 보여주는 설정 중심 이미지가 들어갈 자리입니다.

    4-4. 테스트용 룰 추가

    비교할 때는 복잡한 규칙보다 단순한 룰 하나로 먼저 동작 확인하는 게 좋습니다. 예를 들어 ICMP(ping, 핑) 트래픽을 잡는 간단한 룰입니다.

    alert icmp any any -> any any (msg:"ICMP test detected"; sid:1000001; rev:1;)

    Snort나 Suricata에서 로컬 룰 파일에 추가한 뒤 다시 테스트합니다. 그런 다음 다른 장비에서 핑을 보내보면 됩니다.

    ping -c 4 192.168.0.10

    이 정도만 해도 침입 탐지 시스템이 어떻게 반응하는지 감이 옵니다. 이후 HTTP, DNS, SMB 같은 프로토콜 단위로 확장해보면 훨씬 재미있습니다.

    5. 운영 관점에서 보는 로그와 분석 편의성

    여기서부터는 실무 냄새가 좀 납니다. 탐지 엔진 자체도 중요하지만, 경고를 어떻게 읽고 쌓고 검색할지가 더 중요하거든요. 실제로 써보니까 이 부분 때문에 Suricata를 선호하는 분들이 많다는 걸 이해하게 됐습니다.

    5-1. Suricata의 EVE JSON

    EVE JSON은 구조화 로그(structured log, 필드가 정리된 로그)라서 SIEM(Security Information and Event Management, 보안 정보 이벤트 관리)이나 로그 스택에 붙이기 편합니다.

    {
      "event_type": "alert",
      "src_ip": "192.168.0.20",
      "dest_ip": "192.168.0.10",
      "alert": {
        "signature": "ICMP test detected"
      }
    }

    이런 식으로 필드가 보이니까 나중에 대시보드 만들 때 편하더라고요. 제가 홈랩에서 OpenSearch로 연동했을 때도 필드 매핑이 비교적 수월했습니다.

    5-2. Snort는 어떤가

    Snort도 충분히 운영 가능합니다. 다만 어떤 포맷으로 남길지, 후단에서 어떻게 수집할지에 대해 설계를 조금 더 해줘야 하는 경우가 있었습니다. 이게 꼭 단점은 아닙니다. 기존 체계가 있으면 오히려 맞춰 넣기 쉬운 경우도 있거든요.

    6. ⚠️ 주의사항과 트러블슈팅

    이 섹션은 꼭 보셨으면 합니다. 이론보다 여기서 시간이 더 많이 날아갑니다. 저도 처음엔 엔진이 이상한 줄 알았는데, 대부분은 배치나 설정 문제였어요.

    6-1. 미러 포트에서 패킷이 안 보이는 경우

    • 스위치 미러링 설정이 잘못되면 아무리 엔진이 좋아도 데이터가 안 들어옵니다.
    • NIC 오프로딩(offloading, 네트워크 처리 일부를 하드웨어에 위임) 때문에 캡처가 이상하게 보일 때가 있습니다.
    • 가상화 환경에서는 promiscuous mode(무차별 수신 모드) 설정이 필요할 수 있습니다.

    저는 한 번 ESXi 기반 테스트에서 미러링은 됐는데 게스트 OS가 패킷을 기대만큼 못 받는 문제가 있었어요. 알고 보니 가상 스위치 설정 쪽이 문제더라고요. 드디어 됐다! 싶었던 순간이 아직 기억납니다.

    6-2. 경고가 너무 많이 뜨는 경우

    False Positive(오탐)는 생각보다 흔합니다. 특히 기본 룰셋을 넓게 켜두면 내부 정상 트래픽도 많이 잡힙니다.

    1. 내부 자산의 정상 패턴을 먼저 파악합니다.
    2. 시끄러운 룰은 threshold(임계치)나 suppress(억제) 설정을 검토합니다.
    3. 바로 IPS로 가지 말고 IDS로 관찰 기간을 둡니다.

    근데 여기서 성급하게 룰을 꺼버리면 나중에 진짜 이상 징후를 놓칠 수도 있습니다. 그래서 저는 꼭 주석을 남기고, 왜 비활성화했는지 기록해둡니다.

    6-3. IPS 모드 전환 시 주의할 점

    침입 방지 시스템으로 쓰려면 차단 정책이 실제 서비스에 미치는 영향을 먼저 봐야 합니다. 운영망에 바로 인라인으로 넣는 건 꽤 공격적인 접근입니다. 저도 처음엔 자신 있게 넣었다가 특정 업무 트래픽이 끊겨서 식은땀 났었습니다.

    • 초기에는 IDS 모드로 충분히 학습
    • 차단보다는 경고 중심으로 베이스라인 확보
    • 업무 시간 외 테스트 권장
    • 롤백 경로 미리 준비
    IDS IPS 비교 결과를 보여주는 경고 로그와 대시보드 이미지

    로그가 어떻게 쌓이고 어떤 필드로 분석되는지 보여주는 결과 중심 이미지가 들어가면 이해가 훨씬 쉬워집니다.

    7. 검증: 무엇을 기준으로 비교하면 되나

    단순히 경고가 떴다 안 떴다만 보면 아쉽습니다. 비교 기준을 몇 가지 잡아두면 좋습니다.

    1. 탐지 정확도: 테스트 트래픽에 대해 기대한 경고가 뜨는가
    2. 로그 가독성: 분석할 때 필요한 정보가 잘 남는가
    3. 운영 편의성: 룰 수정, 재시작, 배포가 부담 없는가
    4. 성능 체감: 트래픽이 늘어도 드롭 없이 버티는가
    5. 확장성: SIEM, 대시보드, 알림 시스템과 쉽게 연결되는가

    제가 홈랩에서 비교했을 때는, 단순 패킷 탐지 자체보다도 운영 이후의 피로도가 꽤 크게 느껴졌습니다. 처음 도입은 Snort가 편한 순간도 있었지만, 로그 후처리와 대시보드 연계까지 생각하면 Suricata가 더 손에 맞는 경우가 있었습니다. 반대로 기존 Snort 룰 자산이 많다면 굳이 무리해서 바꿀 필요는 없겠더라고요.

    sudo tail -f /var/log/suricata/eve.json
    sudo tail -f /var/log/snort/alert

    이렇게 두 로그를 나란히 보면서 테스트 트래픽을 넣어보면 꽤 많은 게 보입니다. 특히 어떤 정보가 더 풍부하게 남는지 비교하기 좋습니다. 이거 진짜 편하더라고요.

    8. 정리: 우리 환경에 맞는 선택은 결국 이것입니다

    정리해보면 이렇습니다. Snort는 전통적이고 학습 자료가 많아서 시작 장벽이 낮습니다. Suricata는 멀티스레드 활용과 구조화 로그 측면에서 현대적인 운영 환경과 잘 맞습니다. 그래서 IDS IPS 비교에서 정답은 하나가 아니라, 현재 환경과 운영 목적에 따라 달라집니다.

    • 작게 시작하고 싶다면: Snort
    • 로그 분석과 확장을 중요하게 본다면: Suricata
    • 기존 룰과 경험이 있다면: 익숙한 쪽 유지도 좋은 선택
    • 운영망 차단이 목표라면: IPS 전환 전 충분한 관찰 필수

    저도 처음엔 무조건 최신스럽고 편해 보이는 쪽으로 가야 하나 싶었는데, 실제로 써보니까 네트워크 보안 도구는 기능보다 운영 맥락이 더 중요했습니다. 결국 사람 손이 덜 가고, 로그가 잘 보이고, 문제 났을 때 빨리 원인을 찾을 수 있는 쪽이 오래 갑니다.

    다음 글에서는 Suricata를 EVE JSON 기반으로 시각화해서 대시보드까지 붙이는 과정을 다뤄볼 예정입니다. 이전 글에서 다뤘던 홈랩 로그 수집 구조와도 연결되는 내용이라, 같이 보시면 흐름이 더 잘 잡히실 겁니다.

    Snort vs Suricata 선택 기준을 정리한 IDS IPS 비교 인포그래픽

    어떤 환경에서 어떤 도구가 더 어울리는지 한눈에 보는 요약 이미지 자리입니다.

    자주 묻는 질문

    Q1. 처음 입문이면 Snort와 Suricata 중 무엇이 더 쉬운가요?

    완전 처음이면 Snort가 더 직관적으로 느껴질 수 있습니다. 다만 로그 활용까지 생각하면 Suricata도 금방 익숙해집니다.

    Q2. 두 도구를 동시에 운영해도 되나요?

    테스트 목적이라면 가능합니다. 다만 같은 트래픽을 두 엔진이 동시에 볼 때 리소스 사용량과 로그 중복을 고려해야 합니다.

    Q3. 바로 IPS로 써도 될까요?

    추천하지는 않습니다. 먼저 IDS로 베이스라인을 잡고, 오탐을 줄인 뒤 점진적으로 전환하는 편이 훨씬 안전합니다.

    결론만 짧게 말하면, 침입 탐지 시스템부터 안정적으로 운영해보고, 그 다음에 침입 방지 시스템으로 확장하는 순서가 가장 덜 아픕니다. 저도 그렇게 가는 게 결국 제일 덜 힘들더라고요.

  • [보안] OpenVAS 스캔 성능 저하? 흔한 문제 해결과 최적화 팁

    [보안] OpenVAS 스캔 성능 저하? 흔한 문제 해결과 최적화 팁

    [보안] OpenVAS 스캔 성능 저하? 흔한 문제 해결과 최적화 팁

    홈랩이든 사내 테스트망이든, 취약점 스캐너를 돌려놨는데 유독 OpenVAS 성능 저하가 심하게 느껴질 때가 있습니다. 스캔 하나 시작했을 뿐인데 CPU는 치솟고, 디스크 I/O는 바빠 보이고, 웹 UI는 굼떠지고, 결과는 한참 뒤에야 나오더라고요. 저도 처음엔 네트워크가 느린 줄 알았습니다. 근데 실제로 뜯어보니 네트워크보다 리소스 병목(resource bottleneck, 자원 병목), 피드 동기화 상태, 동시 작업 수 같은 기본 설정에서 문제가 생기는 경우가 훨씬 많더라고요. 이번 글에서는 제가 직접 겪었던 삽질을 바탕으로 OpenVAS 문제 해결과 취약점 스캔 최적화에 바로 써먹을 수 있는 포인트를 정리해보겠습니다.

    특히 Greenbone 기반 환경을 쓰시는 분들은 비슷한 흐름으로 점검하실 수 있습니다. 제품 패키징이나 서비스 이름은 배포판과 설치 방식에 따라 조금씩 다르지만, 원인은 대체로 비슷하거든요.

    OpenVAS 성능 저하 원인을 설명하는 전체 스캔 아키텍처 이미지

    OpenVAS 스캐너, 관리 데몬, 웹 UI, 피드 동기화, 대상 네트워크 사이의 흐름을 한눈에 보여주는 개요 이미지입니다.

    1. 왜 OpenVAS 성능 저하가 자주 생길까요?

    쉽게 말해 OpenVAS는 단순 포트 스캔만 하는 도구가 아닙니다. NVT(Network Vulnerability Test, 네트워크 취약점 테스트)를 아주 많이 실행하면서 대상 시스템에 대해 여러 프로토콜을 확인합니다. 그러다 보니 CPU, 메모리, 디스크, 네트워크, 심지어 DNS 응답 상태까지 영향을 줍니다.

    여기서 중요한 포인트! 느리다고 해서 무조건 스캐너 성능만 탓하면 안 됩니다. 실제로는 다음 네 가지가 가장 흔한 원인이었습니다.

    • 과도한 동시성(concurrency, 동시 실행) 설정
    • 메모리 부족(memory pressure, 메모리 압박)과 스왑 사용
    • 피드(feed, 취약점 테스트 데이터) 동기화 이상 또는 DB 부담
    • 대상 네트워크 응답 지연과 DNS/방화벽 영향

    제가 처음엔 이게 뭔가 싶었는데, 스캔 속도가 느린 문제가 사실상 한 가지가 아니라 여러 병목이 겹쳐서 나타나는 경우가 많았습니다. 그래서 증상만 보고 설정부터 막 바꾸면 오히려 더 느려질 수 있더라고요.

    2. OpenVAS 구조를 이해하면 문제 원인이 빨리 보입니다

    OpenVAS Scanner(스캐너)는 실제 테스트를 수행하고, gvmd(관리 데몬)는 작업과 결과를 관리하며, GSAD 웹 UI는 우리가 보는 화면을 제공합니다. 여기에 피드 데이터와 데이터베이스가 얹히죠.

    쉽게 말해 이런 구조입니다.

    구성요소 역할 성능 저하 시 보이는 증상
    Scanner 취약점 테스트 실행 CPU 사용량 급증, 스캔 시간 증가
    Manager 작업 스케줄링, 결과 저장 작업 대기, UI 반응 저하
    Database 결과 및 메타데이터 저장 보고서 생성 지연, 조회 느림
    Feed NVT/SCAP/CERT 데이터 제공 누락된 테스트, 비정상 동작 가능

    이 구조를 머릿속에 넣어두면, 어디부터 봐야 할지가 바로 잡힙니다. 예를 들어 스캔 자체가 느리면 스캐너와 시스템 자원부터, 결과 조회만 느리면 DB와 매니저 쪽부터 보는 식이죠.

    3. 실전 점검 1단계: 리소스 병목부터 확인해보세요

    저는 항상 제일 먼저 운영체제 레벨부터 봅니다. 이유는 간단합니다. 서비스 설정을 아무리 예쁘게 바꿔도 CPU가 꽉 차 있거나 디스크가 버벅이면 답이 없거든요.

    1. CPU와 메모리 사용량 확인
    2. 디스크 여유 공간과 I/O 확인
    3. 스왑 사용 여부 확인
    4. 로드(load average, 평균 부하)와 프로세스 상태 확인
    top
    free -h
    df -h
    iostat -xz 1
    vmstat 1

    ⚠️ 스왑(swap)이 적극적으로 사용되고 있다면 체감 성능이 확 떨어집니다. 제가 홈랩 VM 자원을 좀 아끼겠다고 메모리를 넉넉히 안 줬다가, 스캔 중간마다 UI가 멎는 것처럼 보이는 일을 겪었거든요. 그때 로그보다 먼저 메모리를 봤어야 했습니다 ㅎㅎ

    또 하나, 디스크도 중요합니다. 결과 DB와 피드 데이터가 같이 있는 환경에서 느린 스토리지를 쓰면, 스캔보다 보고서 생성에서 더 답답함이 크게 느껴질 수 있습니다. 특히 가상 디스크가 얇게 할당(thin provisioned)되어 있거나, 다른 VM과 I/O를 경쟁하면 금방 티가 납니다.

    OpenVAS 성능 저하 점검을 위한 CPU 메모리 디스크 I/O 확인 이미지

    CPU 사용률, 메모리 압박, 디스크 I/O 병목을 함께 확인하는 점검 흐름을 보여주는 이미지입니다.

    4. 실전 점검 2단계: 서비스 상태와 로그를 같이 봐야 합니다

    자원 사용량에 큰 문제가 없는데도 느리다면, 이제 서비스 상태를 봐야 합니다. 배포판에 따라 서비스 이름은 다를 수 있지만, 보통은 관리 데몬, 스캐너, 웹 UI 관련 프로세스를 확인하면 됩니다.

    systemctl status gvmd
    systemctl status ospd-openvas
    systemctl status gsad
    journalctl -u gvmd -n 100 --no-pager
    journalctl -u ospd-openvas -n 100 --no-pager

    여기서 제가 자주 봤던 증상은 이런 쪽이었습니다.

    • 피드 동기화 이후 캐시가 완전히 반영되지 않아 초기 응답이 매우 느린 경우
    • 스캔 작업이 겹치면서 큐(queue, 대기열)가 쌓이는 경우
    • 타깃 호스트가 응답을 늦게 하거나 차단해서 각 테스트가 타임아웃(timeout, 응답 대기 초과) 나는 경우

    OpenVAS 문제 해결에서 의외로 중요한 게 로그를 너무 무겁게 읽지 않는 겁니다. 모든 줄을 해석하려고 하면 지칩니다. 대신 반복되는 경고, 타임아웃, 연결 실패, DB 지연 같은 패턴만 먼저 찾으세요. 그게 훨씬 빠릅니다.

    5. 취약점 스캔 최적화: 제가 효과 봤던 설정 포인트

    이제 본격적으로 취약점 스캔 최적화 얘기를 해보겠습니다. 성능을 올리는 핵심은 무작정 많이 돌리는 게 아니라, 대상 범위(scope, 스캔 범위)와 동시 작업 수를 현실적으로 맞추는 겁니다.

    5-1. 한 번에 너무 많은 대역을 넣지 마세요

    처음엔 욕심이 나서 넓은 대역을 한 번에 넣기 쉽습니다. 저도 그랬습니다. 근데 실제로 써보니까 네트워크 구간, OS 종류, 중요도별로 타깃을 나누는 게 결과도 깔끔하고 성능도 안정적이더라고요.

    # 예시: 대상을 역할별로 나눠 관리
    # 192.168.10.0/24 : 서버 존
    # 192.168.20.0/24 : 사용자 PC 존
    # 192.168.30.0/24 : 테스트 존

    5-2. 동시 스캔 수를 환경에 맞게 낮춰보세요

    동시성을 높이면 빨라질 것 같지만, VM 자원이 작으면 오히려 전체 완료 시간이 늘어납니다. CPU 코어 수와 메모리에 비해 과한 병렬 처리(parallelism, 병렬 실행)를 주면 컨텍스트 스위칭과 I/O 대기가 늘어나거든요. 저는 작은 홈랩에서는 작업을 나눠서 순차적으로 돌리는 편이 훨씬 안정적이었습니다.

    5-3. DNS와 라우팅을 의심해보세요

    이건 은근히 많이 놓칩니다. 타깃 해석이 꼬이거나 역방향 조회(reverse lookup, 역방향 DNS 조회)가 늦으면 전체 체감 속도가 나빠집니다. 방화벽이 특정 프로브를 조용히 드롭(drop, 폐기)하는 환경도 마찬가지고요. 이런 경우는 스캐너 문제가 아니라 네트워크 응답 정책 문제인 경우가 많습니다.

    5-4. 피드 동기화 직후에는 상태를 한 번 더 확인하세요

    Greenbone VM 팁으로 하나 말씀드리면, 피드 동기화 이후에는 잠깐 정리 시간이 필요할 때가 있습니다. 바로 스캔을 몰아서 넣기보다 서비스 상태와 시스템 부하를 먼저 확인하는 게 안전합니다. 저는 동기화 직후 UI가 유독 굼뜬 날이 있었는데, 잠시 기다린 뒤 다시 시도하니 정상화된 적이 꽤 있었습니다.

    취약점 스캔 최적화와 OpenVAS 대상 분리 설정 이미지

    대상 네트워크 분리, 동시 작업 수 조절, 피드 동기화 타이밍 같은 최적화 포인트를 시각화한 이미지입니다.

    6. 자주 겪는 트러블슈팅 4가지

    여기는 진짜 실전 구간입니다. 제가 삽질 좀 했던 부분만 추려보겠습니다.

    6-1. 스캔이 유난히 오래 걸리고 끝나지 않는 느낌

    원인: 타임아웃이 많은 대상, 방화벽 드롭, 응답 느린 장비가 섞여 있을 가능성이 큽니다.

    해결: 대상을 분리하고, 느린 세그먼트를 따로 스캔하세요. 네트워크 장비나 프린터, IoT 장비가 섞여 있으면 유독 길어질 때가 있습니다.

    6-2. 웹 UI만 느리고 스캔은 도는 경우

    원인: DB 조회 부담이나 보고서 렌더링 지연일 수 있습니다.

    해결: 오래된 결과를 정리하고, 동시에 여러 보고서를 열지 마세요. 리소스가 작은 VM이라면 브라우저에서 체감 차이가 꽤 큽니다.

    6-3. 피드 동기화 후 이상하게 무거워진 경우

    원인: 캐시 반영이나 백그라운드 작업이 끝나지 않았을 수 있습니다.

    해결: 서비스 로그를 먼저 확인하고, 시스템 부하가 안정될 때까지 기다린 뒤 스캔을 시작합니다.

    6-4. 가상머신에서만 유독 느린 경우

    원인: CPU overcommit(오버커밋), 느린 스토리지, 메모리 부족이 흔합니다.

    해결: vCPU와 메모리를 재점검하고, 가능하면 스토리지 I/O 경쟁을 줄이세요. 이건 진짜 체감이 큽니다. 드디어 됐다! 싶은 순간이 여기서 오더라고요.

    증상 먼저 볼 것 우선 조치
    스캔 전체가 느림 CPU, 메모리, 타임아웃 대상 분리, 동시성 완화
    UI만 느림 DB, 보고서 조회 결과 정리, 동시 조회 감소
    동기화 직후 무거움 로그, 백그라운드 작업 상태 안정 후 스캔
    VM 환경만 느림 vCPU, RAM, 스토리지 리소스 재할당

    7. 검증은 이렇게 해보시면 됩니다

    튜닝하고 나서 정말 나아졌는지는 감으로 판단하면 안 됩니다. 같은 대상군으로 비교해보는 게 제일 좋습니다.

    1. 비슷한 규모의 대상 그룹을 고릅니다.
    2. 변경 전 스캔 시간과 시스템 부하를 기록합니다.
    3. 동시 작업 수, 대상 분리, 자원 조정 중 한 가지만 변경합니다.
    4. 다시 스캔해서 완료 시간과 체감 반응을 비교합니다.
    date
    uptime
    free -h
    journalctl -u gvmd -n 30 --no-pager

    제가 직접 해보니 한 번에 여러 설정을 바꾸는 것보다, 한 가지씩 바꾸고 비교하는 게 훨씬 정확했습니다. 사실 귀찮아 보여도 이게 제일 빠른 길입니다. 특히 OpenVAS 성능 저하는 원인이 복합적이라서, 바꾼 항목이 어떤 효과를 냈는지 분리해서 봐야 합니다.

    스캔 시간 비교, 시스템 부하 확인, 결과 검증 흐름을 한 장으로 정리한 이미지입니다.

    8. 정리와 FAQ: 결국 핵심은 병목을 정확히 찾는 겁니다

    OpenVAS 성능 저하가 보이면 무조건 설정 파일부터 열지 마세요. 운영체제 자원, 서비스 상태, 대상 특성, 피드 동기화 순으로 보시면 생각보다 빨리 풀립니다. 저도 처음엔 스캐너 자체 문제라고 단정했었는데, 실제로는 메모리 부족과 과한 동시 실행이 원인이었던 적이 많았습니다.

    정리하면 이렇습니다.

    • 리소스 병목이 있는지 먼저 확인
    • 대상 범위를 잘게 나눠 스캔
    • 동시성은 높을수록 좋은 게 아님
    • 로그 패턴에서 타임아웃과 반복 오류를 먼저 확인
    • 피드 동기화 직후에는 상태 안정 여부를 점검

    자주 묻는 질문

    Q. CPU가 남는데도 느릴 수 있나요?
    네, 가능합니다. 디스크 I/O나 네트워크 타임아웃, DB 조회 지연 때문일 수 있습니다.

    Q. Greenbone VM 팁이 따로 있나요?
    있습니다. 작은 VM에 과한 동시 작업을 넣지 말고, 피드 동기화 직후에는 상태를 먼저 보는 습관이 좋습니다.

    Q. 어디부터 손대야 제일 효과가 큰가요?
    대상 분리와 메모리 확인부터 해보세요. 실제로 가장 빨리 효과를 보는 경우가 많습니다.

    다음 글에서는 스캔 결과를 운영 우선순위로 정리하는 방법, 즉 단순 취약점 개수보다 실제 대응 순서를 어떻게 잡아야 하는지 다뤄볼 예정입니다. 이전 글에서 다룬 홈랩 모니터링 구성과 함께 보시면 더 이해가 잘 되실 거예요.

    OpenVAS 성능 저하 원인과 해결책 요약 인포그래픽

    원인별 점검 순서와 최적화 포인트를 마지막에 다시 확인할 수 있도록 정리한 요약 이미지입니다.

    결론은 단순합니다. OpenVAS 문제 해결은 감이 아니라 순서입니다. 혹시 지금도 스캔이 이상하게 느리다면, 오늘은 딱 세 가지만 보세요. 메모리, 디스크 I/O, 그리고 대상 분리. 여기서 풀리는 경우가 정말 많습니다. 이거 진짜 편하더라고요.

  • [홈랩] Frigate NVR 하드웨어 체크리스트: 최적 성능을 위한 선택

    [홈랩] Frigate NVR 하드웨어 체크리스트: 최적 성능을 위한 선택

    [홈랩] Frigate NVR 하드웨어 체크리스트: 최적 성능을 위한 선택

    Frigate NVR 하드웨어를 어떻게 골라야 하는지 막막하셨다면, 딱 그 지점에서 이 글을 보시면 됩니다. 저도 처음 Frigate를 붙일 때는 “카메라 몇 대 안 되는데 아무 미니 PC나 쓰면 되겠지” 하고 시작했었거든요. 근데 실제로 써보니까 NVR(Network Video Recorder, 네트워크 영상 녹화 장치)은 단순 저장 장비가 아니라 영상 디코딩, 객체 감지, 저장, 네트워크 처리가 한 번에 몰리는 워크로드였습니다. 여기서 하드웨어 선택을 대충 하면 CPU는 100%로 치솟고, 녹화는 끊기고, 홈랩 보안은 오히려 불안해지더라고요.

    이번 글은 광고성 추천이 아니라, 제가 홈랩에서 Frigate, 보안 카메라, Coral AI(코랄 AI 가속기) 조합을 만지면서 정리한 실전 체크리스트입니다. 제품명만 나열하기보다 어떤 부품이 왜 중요한지, 어디서 병목이 생기는지, 그리고 최소한 무엇부터 챙겨야 하는지 멘토처럼 짚어보겠습니다.

    Frigate NVR 하드웨어 전체 아키텍처를 보여주는 홈랩 보안 구성 이미지

    Frigate, 보안 카메라, 스토리지, Coral AI, 스위치가 어떻게 연결되는지 한눈에 보여주는 전체 구성도입니다.

    1. 왜 Frigate NVR 하드웨어가 먼저 정리되어야 할까요?

    쉽게 말해 Frigate는 “녹화기”이면서 동시에 “영상 분석기”입니다. 카메라에서 RTSP(Real Time Streaming Protocol, 실시간 스트리밍 프로토콜)로 영상을 받아오고, ffmpeg로 스트림을 처리하고, 객체 감지를 돌리고, 이벤트 클립과 스냅샷을 저장하죠. 이 중에서 특히 무거운 건 영상 디코딩과 객체 감지입니다.

    제가 직접 해보니 같은 카메라 4대라도 설정에 따라 부하 차이가 꽤 컸어요. 해상도가 높아질수록, 프레임 수가 늘어날수록, 감지 구역이 많아질수록 하드웨어 부담이 훅 올라갑니다. 그래서 Frigate NVR 하드웨어를 고를 때는 “서버가 켜지느냐”보다 지속적으로 안정 동작하느냐를 봐야 합니다. 여기서 중요한 포인트! 처음부터 과하게 비싼 장비를 살 필요는 없지만, 병목이 생기는 영역은 정확히 알아야 삽질을 줄일 수 있습니다.

    2. Frigate와 NVR의 핵심 개념, 쉽게 말해 이겁니다

    Frigate는 오픈소스 NVR로 많이 알려져 있고, 홈 어시스턴트(Home Assistant)와 함께 쓰는 분도 꽤 많아요. 구조를 아주 단순하게 풀면 아래 흐름입니다.

    1. 보안 카메라가 영상을 계속 보냅니다.
    2. Frigate가 그 영상을 받아 녹화합니다.
    3. 필요하면 객체 감지(Object Detection, 사람/차량/동물 등 인식)를 수행합니다.
    4. 이벤트만 따로 저장하거나 알림을 보냅니다.

    이때 CPU는 전체 제어와 일부 디코딩을 맡고, GPU(Graphics Processing Unit, 그래픽 처리 장치)나 iGPU(내장 GPU)는 영상 가속을 도와주고, Coral AI 같은 TPU(Tensor Processing Unit, 추론 가속기)는 객체 감지를 덜어줍니다. 스토리지는 녹화 영상을 버티는 저장소 역할을 하고요. 즉, 한 부품만 좋아서는 안 되고 전체 밸런스가 맞아야 해요.

    3. Frigate NVR 하드웨어 체크리스트: 꼭 보는 항목 6가지

    3-1. CPU: 무조건 고클럭보다 “지속 부하”가 중요합니다

    처음엔 코어 수만 보면 되는 줄 알았는데, 실제로 써보니까 Frigate는 장시간 켜두는 서비스라서 발열과 스로틀링(throttling, 발열로 인한 성능 제한)도 같이 봐야 하더라고요. 소형 장비는 순간 성능은 괜찮아도 여름철에 성능이 출렁이는 경우가 있습니다.

    • 카메라 수: 2대와 8대는 완전히 다른 이야기입니다.
    • 해상도/프레임: 1080p와 4MP 이상급은 부하 차이가 큽니다.
    • 하드웨어 가속 유무: 지원되는 환경에서는 CPU 부담을 크게 줄어들어요.

    3-2. Coral AI: 객체 감지용 가속기는 체감 차이가 큽니다

    Frigate 이야기에서 Coral AI를 빼기 어렵습니다. 저도 처음엔 “CPU로도 되지 않나?” 싶었는데, 객체 감지를 CPU로 오래 돌리면 다른 작업까지 같이 무거워지더라고요. Coral USB Accelerator나 M.2 기반 Edge TPU 같은 실존하는 Coral 장치는 Frigate 구성에서 많이 쓰이는 편입니다.

    특히 사람, 차량 같은 이벤트 감지를 꾸준히 돌릴 계획이라면 Coral AI 같은 추론 가속기를 고려할 만한 가치가 충분해요. 다만 여기서 중요한 건, Coral이 모든 문제를 해결해주진 않는다는 점입니다. 영상 디코딩 병목은 여전히 별개라서 CPU/iGPU/스토리지도 같이 맞춰야 합니다.

    3-3. 저장장치: SSD와 HDD를 역할 분리하면 편합니다

    이거 진짜 편하더라고요. 운영체제, 컨테이너, 데이터베이스 성격의 파일은 SSD에 두고, 연속 녹화는 HDD에 두는 방식입니다. 제가 한동안 전부 한 디스크에 몰아넣고 썼었는데, 로그와 녹화가 같이 쌓이니 관리가 번거로웠어요.

    • SSD: OS, Docker, Frigate 메타데이터, 캐시
    • HDD: 장시간 녹화 보관
    • 여유 용량: 이벤트 중심 저장인지, 24시간 연속 녹화인지에 따라 크게 달라집니다

    3-4. 네트워크: 카메라보다 스위치가 먼저 흔들릴 수 있습니다

    보안 카메라는 한 대씩 보면 대역폭이 커 보이지 않는데, 여러 대가 동시에 붙으면 스위치와 업링크가 생각보다 바빠집니다. PoE(Power over Ethernet, 랜선 전원 공급) 스위치를 쓰면 배선은 깔끔해지지만, 전력 예산도 함께 봐야 해요. 홈랩 보안에서 의외로 자주 놓치는 부분입니다.

    3-5. 카메라 스트림 호환성: RTSP와 코덱 확인은 필수입니다

    Frigate 자체보다 카메라 설정에서 더 오래 헤매는 경우도 많더라고요. 메인 스트림은 녹화용, 서브 스트림은 감지용으로 나누는 구성이 흔한데요, 실제로 써보니까 카메라가 RTSP를 안정적으로 제공하는지, H.264/H.265 코덱을 어떻게 내보내는지부터 확인해야 했습니다.

    3-6. 전원과 냉각: 조용한 서버가 꼭 좋은 서버는 아니더라고요

    24시간 켜둘 장비라면 어댑터 품질, 케이스 통풍, 팬 소음보다 먼저 안정성을 보셔야 합니다. 미니 PC나 소형 보드 장비는 공간은 적게 먹지만, 먼지와 여름철 온도에 꽤 민감하더라고요. 저도 처음엔 무소음이 좋아 보였는데, 결국 약한 강제 냉각을 넣고 훨씬 안정화됐습니다.

    항목 중요 이유 체크 포인트
    CPU 전체 처리와 디코딩 부담 카메라 수, 발열, 지속 성능
    Coral AI 객체 감지 오프로딩 USB 또는 M.2 연결 가능 여부
    스토리지 녹화 데이터 누적 SSD/HDD 분리, 보관 기간
    네트워크 다중 카메라 스트림 수집 PoE, 스위치 용량, 케이블 상태
    카메라 스트림 품질과 호환성 RTSP, 서브 스트림, 코덱
    냉각/전원 24시간 안정성 온도, 어댑터, 팬 구성

    4. 실전 구현: 제가 주로 확인하는 구축 순서

    여기서는 제품 추천보다, 어떤 순서로 확인하면 덜 꼬이는지 말씀드리겠습니다. 저도 처음엔 Docker부터 올렸다가 카메라 스트림 문제를 뒤늦게 발견해서 삽질 좀 했습니다 ㅎㅎ 순서는 아래처럼 가는 게 훨씬 낫습니다.

    1. 카메라 RTSP 접속 확인
    2. 서버에서 저장소 마운트 구성
    3. Docker와 Frigate 컨테이너 실행
    4. 감지용 서브 스트림 연결
    5. Coral AI 인식 여부 확인
    6. 녹화/이벤트 저장 경로 검증
    7. 온도와 CPU 사용률 모니터링
    docker run --rm hello-world
    ls /dev/bus/usb
    lsblk
    df -h

    위 명령은 아주 기본이지만 꼭 해보시는 걸 권합니다. 특히 Coral USB를 쓴다면 장치가 보이는지부터 확인해야 하고, 저장소는 남은 공간보다 어디에 마운트됐는지가 더 중요합니다.

    mqtt:
      enabled: false
    
    cameras:
      front_door:
        ffmpeg:
          inputs:
            - path: rtsp://USER:PASS@CAMERA_IP:554/stream1
              roles:
                - record
            - path: rtsp://USER:PASS@CAMERA_IP:554/stream2
              roles:
                - detect
        detect:
          enabled: true
        record:
          enabled: true
    
    detectors:
      coral:
        type: edgetpu
        device: usb

    설정의 핵심은 녹화용 스트림과 감지용 스트림을 분리하는 겁니다. 메인 스트림은 선명하지만 무겁고, 서브 스트림은 가볍지만 감지에는 충분한 경우가 많거든요. Frigate NVR 하드웨어 부담을 줄이는 가장 현실적인 방법 중 하나입니다.

    Frigate NVR 하드웨어에서 메인 스트림과 서브 스트림 분리 구성을 설명하는 이미지

    메인 스트림은 녹화, 서브 스트림은 감지에 사용하는 Frigate 설정 흐름을 보여주는 구성 이미지입니다.

    docker compose up -d
    docker logs frigate
    docker stats

    docker stats를 보면 대략적인 CPU와 메모리 사용량을 볼 수 있습니다. 드디어 됐다! 싶어도 바로 끝내지 말고, 카메라 여러 대를 동시에 붙였을 때도 안정적인지 꼭 보세요.

    5. ⚠️ 실제로 많이 겪는 문제와 해결 포인트

    이 섹션은 이론보다 실전입니다. 저도 처음엔 설정 파일 문법보다 하드웨어 병목에서 더 많이 막혔습니다.

    • CPU 사용률이 너무 높다: 감지 해상도를 낮추고, 서브 스트림을 감지용으로 분리해보세요. 하드웨어 가속 지원 여부도 다시 확인해야 합니다.
    • Coral AI가 안 잡힌다: USB 패스스루나 장치 권한 문제일 수 있습니다. 컨테이너에서 장치가 노출되는지 먼저 확인하세요.
    • 녹화가 중간중간 끊긴다: 네트워크 품질, 카메라 RTSP 안정성, 디스크 쓰기 지연을 순서대로 의심하는 게 좋습니다.
    • 저장 공간이 너무 빨리 찬다: 연속 녹화와 이벤트 녹화를 분리해서 생각해야 합니다. 보관 기간(retention)을 현실적으로 잡아야 합니다.
    • 장비가 뜨거워진다: 특히 소형 장비는 케이스 내부 공기 흐름만 바꿔도 안정성이 확 달라져요.

    혹시 이런 경험 있으신가요? 저는 한동안 카메라 문제인 줄 알았는데, 알고 보니 USB Coral이 허브를 타면서 인식이 불안정했던 적이 있었습니다. 결국 포트를 바꾸고 전원 환경을 정리하니 해결됐습니다. 사소해 보여도 이런 물리 계층 이슈가 꽤 많습니다.

    6. 검증 방법: 구축 후 무엇을 확인해야 할까요?

    구축이 끝났다고 바로 안심하긴 이릅니다. 홈랩 보안은 “켜졌다”보다 “며칠 지나도 멀쩡하다”가 훨씬 중요하거든요. 제가 보통 보는 검증 포인트는 아래와 같습니다.

    1. Frigate 대시보드에서 카메라별 라이브 뷰가 안정적으로 보이는지
    2. 사람이나 차량 같은 객체 이벤트가 정상 기록되는지
    3. 녹화 디렉터리에 파일이 꾸준히 생성되는지
    4. CPU, 메모리, 온도가 과하게 치솟지 않는지
    5. 재부팅 후에도 자동으로 서비스가 복구되는지
    docker ps
    docker logs --tail 100 frigate
    df -h
    uptime

    실제로 써보니까 하루 정도는 멀쩡해도, 3일째부터 문제가 드러나는 경우가 있었습니다. 그래서 저는 최소 며칠은 돌려보면서 로그를 확인합니다. 🎉 이 과정을 통과하면 그때부터는 꽤 마음이 편해집니다.

    Frigate NVR 하드웨어 검증을 위한 대시보드와 시스템 리소스 모니터링 이미지

    카메라 상태, 이벤트 감지, CPU 사용률을 함께 확인하는 검증 단계의 대시보드 이미지입니다.

    7. 옵션별 판단 기준: 어떤 환경에 무엇이 맞을까요?

    정답은 한 가지가 아닙니다. 다만 사용 목적에 따라 우선순위는 분명히 갈립니다.

    환경 우선순위 추천 판단 기준
    카메라 1~2대 소형 홈랩 저전력, 저소음 서브 스트림 활용, SSD 중심 구성
    카메라 여러 대 상시 녹화 스토리지, 냉각 HDD 분리, 안정 전원, 네트워크 점검
    객체 감지 비중이 큰 환경 Coral AI Edge TPU 연결성과 컨테이너 인식 확인
    확장 예정이 있는 홈랩 여유 포트와 슬롯 저장장치 추가 가능성, USB/M.2 여유

    여기서 중요한 포인트! 지금 당장 카메라가 2대라고 해서 2대 기준으로만 짜면 나중에 꼭 후회하더라고요. 보안 카메라는 한 번 맛보면 주차장, 현관, 복도까지 늘어나기 쉽습니다. 저도 그랬습니다.

    8. 자주 묻는 질문과 마무리 체크

    • Q. Frigate는 무조건 Coral AI가 있어야 하나요?
      A. 꼭 그렇진 않습니다. 다만 객체 감지를 오래 안정적으로 돌릴 계획이면 Coral AI 같은 가속기가 체감상 도움이 큽니다.
    • Q. SSD만으로도 가능한가요?
      A. 가능합니다. 다만 장시간 녹화 보관이 목적이라면 저장 전략을 따로 설계하는 게 낫습니다.
    • Q. 보안 카메라는 어떤 점을 먼저 봐야 하나요?
      A. RTSP 지원, 스트림 분리 가능 여부, 코덱 호환성을 먼저 보시는 게 좋습니다.

    CPU, Coral AI, 스토리지, 네트워크, 냉각 요소를 한 장으로 정리한 요약 이미지입니다.

    정리해보면 Frigate NVR 하드웨어 선택의 핵심은 비싼 장비를 사는 게 아니라 병목이 생기는 지점을 먼저 이해하는 것입니다. CPU만 보지 마시고, Coral AI 같은 감지 가속기, 저장장치 역할 분리, 카메라 스트림 설계, 그리고 전원과 냉각까지 같이 보셔야 합니다. 제가 직접 해보니 이 순서로 접근하면 시행착오가 훨씬 줄었습니다.

    다음 글에서는 Frigate 설정 파일을 더 깊게 들어가서, 감지 구역(zone), 마스크(mask), 녹화 보관 정책을 어떻게 잡으면 좋은지 다뤄볼 예정입니다. 이전 글에서 홈랩 네트워크와 역방향 프록시(Reverse Proxy, 리버스 프록시) 구성 이야기를 보셨다면, 그 위에 얹는 방식으로 생각하시면 이해가 훨씬 쉬우실 겁니다. 홈랩 보안, 천천히 하나씩 쌓아가면 됩니다. 급하게 가면 꼭 다시 뜯게 되더라고요.

  • [Proxmox] Proxmox LXC 컨테이너 보안 강화 체크리스트: 프로덕션 필수 설정

    [Proxmox] Proxmox LXC 컨테이너 보안 강화 체크리스트: 프로덕션 필수 설정

    Proxmox LXC 컨테이너 보안 강화 체크리스트: 프로덕션 필수 설정

    안녕하세요, 13년차의 서버실 주인장입니다. 오늘은 제가 홈랩에서, 그리고 실제 프로덕션 환경에서 Proxmox LXC 컨테이너를 운영하면서 뼈저리게 느꼈던 보안 강화에 대한 이야기를 해보려고 합니다. Proxmox LXC는 가볍고 빠르며 효율적이라서 저도 정말 애용하는 기술 스택인데요. 근데 이 편리함 뒤에는 간과하기 쉬운 보안 위협이 숨어있다는 사실, 혹시 알고 계셨나요? ⚠️

    처음에는 LXC가 워낙 가볍고 VM(Virtual Machine)만큼 복잡하지 않으니까, ‘이 정도면 괜찮겠지?’ 하고 안일하게 생각했던 적도 있습니다. 하지만 몇 번의 삽질과 실제 보안 사고(아찔한 순간이었죠… 휴)를 겪으면서, 컨테이너 환경도 강력한 보안 대책이 필수적이라는 것을 깨달았죠. 특히 프로덕션 환경에서는 더더욱 그렇습니다.

    오늘은 제가 직접 해보고 효과를 본 Proxmox LXC 컨테이너 보안 강화 체크리스트와 베스트 프랙티스를 여러분께 멘토처럼 알려드릴게요. 저처럼 삽질하지 마시라고, 제가 겪었던 시행착오와 해결 과정까지 솔직하게 공유해드리겠습니다! 자, 그럼 시작해볼까요? 🎉

    Proxmox LXC 컨테이너 보안 강화를 위한 주요 구성 요소를 보여주는 개요 다이어그램

    Proxmox LXC 컨테이너 환경에서 보안 강화를 위한 주요 구성 요소와 상호작용을 보여주는 다이어그램입니다.

    1. LXC 컨테이너, 왜 보안이 중요할까요? (개념 설명)

    Proxmox VE (Virtual Environment)에서 LXC (Linux Containers)는 도커(Docker) 컨테이너와 VM의 중간 지점에 있다고 생각하시면 편합니다. VM처럼 완벽한 격리는 아니지만, 도커보다는 더 OS에 가까운 환경을 제공하죠. 호스트 OS의 커널을 공유하기 때문에 가상화 오버헤드가 적고 성능이 좋습니다. 하지만 바로 이 커널 공유 때문에 보안에 취약점이 생길 수 있습니다.

    만약 하나의 LXC 컨테이너가 해킹당하면, 공격자가 호스트 OS의 커널에 접근할 수 있는 경로를 확보하게 될 수도 있습니다. 이는 곧 다른 컨테이너나 심지어 호스트 시스템 전체까지 위험에 빠뜨릴 수 있다는 뜻이거든요. 그래서 LXC 컨테이너는 VM만큼은 아니더라도, 최소한의 보안 장치들을 꼭 마련해두는 것이 좋습니다. 제가 처음 이걸 알았을 때, 등골이 오싹했더랬죠.

    2. 실전 구현: Proxmox LXC 보안 강화 체크리스트

    자, 이제 실질적으로 어떤 작업을 해야 하는지 단계별로 살펴보겠습니다. 제가 직접 구축하면서 가장 효과적이라고 느꼈던 방법들 위주로 구성했어요.

    2.1. ✅ Unprivileged 컨테이너 사용 (권한 분리)

    가장 기본 중의 기본입니다. Unprivileged container (비특권 컨테이너)는 컨테이너 내부의 root 사용자가 호스트 시스템의 root 권한을 가지지 못하도록 격리하는 방식입니다. 이게 핵심이에요. 만약 컨테이너가 Compromise (침해)되더라도, 공격자가 호스트 시스템에 직접적인 root 권한을 행사하기 어렵게 만드는 거죠.

    새 LXC 컨테이너를 생성할 때 Proxmox UI에서 ‘Unprivileged container’ 옵션을 체크하거나, CLI에서는 --unprivileged 1 옵션을 추가하면 됩니다. 저는 주로 CLI로 작업하기 때문에 다음과 같이 명령어를 사용합니다.

    pct create 101 local:vztmpl/debian-11-standard_11.0-1_amd64.tar.zst \
      --hostname my-secure-lxc \
      --password mysecretpassword \
      --memory 512 --swap 512 \
      --rootfs local-lvm:8 \
      --unprivileged 1 # 여기가 중요!

    이렇게 컨테이너를 생성하면 Proxmox가 자동으로 UID/GID 매핑 설정을 해줍니다. /etc/subuid와 /etc/subgid 파일에 호스트 시스템의 사용자 ID와 그룹 ID를 컨테이너 내부의 ID에 매핑하는 규칙이 추가되죠. 처음엔 이게 뭔가 싶었는데, 결국 호스트와 컨테이너 간의 권한 분리 장치더라고요.

    2.2. ✅ AppArmor 프로파일 적용 (강제적 접근 제어)

    AppArmor (앱아머)는 Linux 커널의 MAC (Mandatory Access Control, 강제적 접근 제어) 보안 시스템 중 하나입니다. 특정 프로그램이 접근할 수 있는 파일, 네트워크 리소스 등을 미리 정의된 프로파일에 따라 제한합니다. 쉽게 말해, ‘이 프로그램은 딱 이것만 할 수 있어!’라고 미리 정해주는 거죠.

    Proxmox는 기본적으로 LXC 컨테이너에 AppArmor 프로파일을 적용하지만, 더 세밀하게 제어하고 싶을 때가 있습니다. 예를 들어, 웹 서버 컨테이너가 불필요한 시스템 파일에 접근하는 것을 막는 것이죠.

    현재 AppArmor 상태는 다음 명령어로 확인할 수 있습니다.

    sudo aa-status

    특정 컨테이너나 서비스에 대한 커스텀 AppArmor 프로파일을 작성하여 /etc/apparmor.d/ 디렉토리에 넣고, sudo apparmor_parser -r /etc/apparmor.d/my-lxc-profile 명령어로 로드하면 됩니다. 제가 예전에 특정 서비스가 계속 죽어서 살펴보니, AppArmor 프로파일 때문에 필요한 파일에 접근을 못 하고 있더라고요. aa-complain 모드로 변경해서 로그를 보면서 디버깅했던 기억이 납니다.

    2.3. ✅ UFW를 이용한 네트워크 방화벽 설정

    컨테이너 내부에서도 방화벽을 설정하는 것은 정말 중요합니다. UFW (Uncomplicated Firewall)는 iptables의 복잡한 규칙들을 좀 더 쉽게 관리할 수 있게 해주는 도구입니다. LXC 컨테이너 내부에서 UFW를 설치하고 활성화하여, 필요한 포트만 외부에 노출하도록 설정할 수 있습니다.

    # 컨테이너 내부에서 실행
    sudo apt update
    sudo apt install ufw -y
    sudo ufw enable
    sudo ufw default deny incoming # 기본적으로 모든 외부 접근 차단
    sudo ufw allow ssh # SSH (22번 포트) 허용
    sudo ufw allow http # HTTP (80번 포트) 허용
    sudo ufw allow https # HTTPS (443번 포트) 허용
    sudo ufw status verbose

    이렇게 설정하면 컨테이너 내부에서 불필요한 포트가 열려 외부 공격에 노출되는 것을 방지할 수 있습니다. 혹시 LXC 안에서 서비스가 안 열려서 헤매신 적 있나요? 거의 십중팔구 UFW나 iptables 때문일 겁니다. 💡

    LXC 컨테이너 내부에서 UFW 명령어를 사용하여 네트워크 방화벽 규칙을 설정하고 확인하는 CLI 화면

    LXC 컨테이너 내부에서 UFW 명령어를 사용하여 네트워크 방화벽 규칙을 설정하고 확인하는 CLI 화면입니다.

    2.4. ✅ 정기적인 시스템 업데이트 및 패치

    너무 당연한 이야기 같지만, 잊지 않고 꾸준히 해야 할 가장 기본적인 보안 수칙입니다. OS와 설치된 모든 패키지를 최신 상태로 유지하여 알려진 취약점을 제거해야 합니다. 저는 unattended-upgrades를 설정해서 자동으로 업데이트되도록 해두는 편입니다. 물론 중요한 서비스는 수동으로 확인하고 적용하지만요.

    # 컨테이너 내부에서 실행
    sudo apt update && sudo apt upgrade -y
    
    # 자동 업데이트 설정 (옵션)
    sudo apt install unattended-upgrades -y
    sudo dpkg-reconfigure --priority=low unattended-upgrades

    2.5. ✅ SSH 보안 강화

    컨테이너에 접근하는 주요 방법 중 하나가 SSH입니다. SSH 보안을 강화하는 것은 컨테이너 전체의 보안을 높이는 데 큰 역할을 합니다.

    • 비밀번호 대신 키 기반 인증 사용: 가장 강력한 방법입니다.
    • 기본 SSH 포트 변경 (22번 외 다른 포트): 기본적인 스캐닝 공격을 회피할 수 있습니다.
    • Root 로그인 비활성화: PermitRootLogin no 설정.
    • 강력한 비밀번호 정책: (비밀번호 인증을 사용해야 할 경우)

    /etc/ssh/sshd_config 파일을 수정하여 위 항목들을 적용할 수 있습니다. 변경 후에는 꼭 sudo systemctl restart sshd 명령어로 SSH 서비스를 재시작해주세요.

    2.6. ✅ 로깅 및 모니터링

    아무리 보안을 강화해도 100% 완벽할 수는 없습니다. 중요한 것은 이상이 발생했을 때 얼마나 빨리 알아차리고 대응하느냐입니다. 컨테이너 내부의 로그를 중앙 집중식으로 관리하고, 주요 지표들을 모니터링하는 시스템을 구축하는 것이 좋습니다.

    • syslog-ng 또는 rsyslog 설정: 호스트 또는 별도의 로깅 서버로 로그를 전송.
    • Prometheus + Grafana: CPU, 메모리, 네트워크 트래픽 등 리소스 사용량과 서비스 상태 모니터링.
    • Fail2ban: SSH 무차별 대입 공격(Brute-force attack)과 같은 침입 시도를 자동으로 차단.

    물론 이 모든 걸 한 번에 다 하기는 어렵겠지만, 중요한 서비스부터 차근차근 적용해보는 것이 좋습니다. 제가 처음 홈랩을 구성할 때 로깅과 모니터링을 소홀히 했다가, 나중에 문제 터지고 나서야 뒤늦게 붙잡고 후회했던 적이 많거든요. 😅

    3. ⚠️ 주의사항 및 트러블슈팅: 제가 겪었던 삽질들

    위에서 말씀드린 내용을 적용하다 보면 분명히 문제가 발생할 수 있습니다. 저도 그랬거든요. 몇 가지 흔한 문제와 해결 방법을 공유해 드릴게요.

    • UID/GID 매핑 오류로 인한 컨테이너 시작 실패:

      • 증상: 컨테이너가 시작되지 않거나, 내부에서 파일 권한 문제로 서비스가 실행되지 않습니다. lxc-start 로그를 보면 Operation not permitted 같은 에러가 보입니다.
      • 해결: /etc/subuid와 /etc/subgid 파일에 올바른 매핑이 설정되어 있는지 확인합니다. pct create 시 --unprivileged 1 옵션을 제대로 사용했는지도 중요하고요. 이미 생성된 컨테이너라면 /etc/pve/lxc/VMID.conf 파일의 lxc.idmap 설정을 확인해야 합니다. 제가 이걸로 반나절을 날린 적이 있습니다.
    • AppArmor 프로파일로 인한 서비스 장애:

      • 증상: 특정 서비스가 AppArmor 정책 때문에 필요한 파일에 접근하지 못해 실행되지 않거나 비정상적으로 종료됩니다.
      • 해결: sudo aa-status로 AppArmor 상태를 확인하고, 문제가 되는 프로파일을 sudo aa-complain /etc/apparmor.d/my-lxc-profile 명령어로 complain 모드로 변경합니다. 이 모드에서는 정책 위반 시 로그만 남기고 차단하지 않으므로, 로그를 확인하여 필요한 접근 권한을 프로파일에 추가한 후 다시 sudo aa-enforce로 enforce 모드로 전환합니다.
    • UFW 포트 블로킹으로 인한 서비스 접근 불가:

      • 증상: 분명히 서비스는 실행 중인데 외부에서 접근이 안 됩니다.
      • 해결: 컨테이너 내부에서 sudo ufw status verbose 명령어로 현재 UFW 규칙을 확인합니다. 필요한 포트가 ALLOW 되어 있는지 확인하고, 만약 막혀있다면 sudo ufw allow [PORT] 명령어로 허용해줍니다.

    4. 검증 및 결과 확인

    보안 설정을 마쳤다면, 제대로 적용되었는지 확인하는 과정이 필수입니다.

    1. 컨테이너 권한 확인:

      # 호스트에서 실행
      lxc-info -n VMID -p

      lxc.idmap 설정이 올바르게 되어 있고, unprivileged 컨테이너로 생성되었는지 확인합니다.

    2. AppArmor 상태 확인:

      # 호스트에서 실행
      sudo aa-status

      적용된 프로파일이 enforce 모드로 잘 동작하는지 확인합니다.

    3. UFW 방화벽 규칙 확인:

      # 컨테이너 내부에서 실행
      sudo ufw status verbose

      필요한 포트만 열려 있고, 나머지는 잘 차단되어 있는지 확인합니다.

    4. 외부 포트 스캔:

      # 외부 시스템에서 실행 (예: 공격자 시점)
      nmap -sV -p- [LXC_컨테이너_IP]

      실제 외부에서 접근했을 때 불필요한 포트가 열려있지 않은지 nmap 같은 도구로 스캔해보는 것도 좋은 방법입니다. 저는 이 과정을 통해 ‘드디어 됐다!’ 하는 뿌듯함을 느꼈습니다. 😄

    LXC 컨테이너 보안 설정 완료 후 nmap 스캔 결과 및 AppArmor 상태를 보여주는 대시보드

    LXC 컨테이너 보안 설정이 완료된 후, nmap 스캔을 통해 열린 포트를 확인하고 AppArmor 상태를 점검하는 결과 화면입니다.

    5. 마무리하며: 지속적인 관심이 중요합니다

    오늘은 Proxmox LXC 컨테이너의 보안을 강화하기 위한 핵심 체크리스트를 저의 경험을 녹여가며 알려드렸습니다. Unprivileged 컨테이너, AppArmor, UFW, 정기 업데이트, SSH 보안 강화, 로깅 및 모니터링까지, 이 여섯 가지만 잘 지켜도 여러분의 LXC 컨테이너는 훨씬 더 안전해질 겁니다. 🛡️

    사실 보안은 한 번 설정하고 끝나는 것이 아니라, 지속적인 관심과 관리가 필요한 영역입니다. 새로운 취약점은 계속해서 발견되고, 공격 기술도 진화하거든요. 그러니 늘 최신 보안 동향에 귀 기울이고, 여러분의 시스템을 꾸준히 점검해주시길 바랍니다.

    다음 글에서는 LXC 컨테이너 환경에서 SELinux (Security-Enhanced Linux) 적용 방안이나, IDS/IPS (침입 탐지/방지 시스템)를 구축하는 방법에 대해 좀 더 깊이 있게 다뤄볼까 합니다. 혹시 궁금한 점이나 ‘이런 내용도 다뤄줬으면 좋겠다!’ 하는 아이디어가 있다면 언제든지 댓글로 남겨주세요! 여러분의 안전하고 튼튼한 서버실을 응원합니다. 💪

    Proxmox LXC 컨테이너 보안 강화를 위한 주요 체크리스트 항목들을 시각적으로 요약한 인포그래픽입니다.

  • [NAS] Cloudflare Tunnel로 NAS 외부 접속, 보안 강화 체크리스트 10가지

    [NAS] Cloudflare Tunnel로 NAS 외부 접속, 보안 강화 체크리스트 10가지

    [NAS] Cloudflare Tunnel로 NAS 외부 접속, 보안 강화 체크리스트 10가지

    안녕하세요, 13년차의 서버실입니다. 홈랩에 NAS(Network Attached Storage) 운영하시는 분들 많으시죠? 저도 몇 년째 NAS를 제 손으로 구성해서 쓰고 있는데요, 외부에서 언제든 접속해서 파일을 관리하고, 미디어를 스트리밍하는 건 정말 편리한 일입니다.

    근데 여기서 중요한 게 하나 있어요. 바로 보안입니다. NAS를 외부 인터넷에 직접 노출하는 순간, 수많은 공격 시도에 직면하게 되거든요. 포트 포워딩(Port Forwarding)으로 NAS의 웹 인터페이스를 그대로 열어두는 건 마치 대문에 자물쇠를 안 채우고 나가는 것과 마찬가지예요. 저도 처음엔 쉽게 가려고 그렇게 했다가, NAS 로그인 시도 실패 기록이 수두룩하게 쌓이는 걸 보고 식겁했던 경험이 있습니다. 😱

    이런 걱정 없이 NAS에 안전하게 외부 접속할 수 있는 방법이 없을까 고민하다가, Cloudflare Tunnel(클라우드플레어 터널)을 알게 됐고, 직접 써보고는 감탄했어요. 이거 진짜 물건이더라고요. 오늘은 Cloudflare Tunnel로 NAS에 안전하게 외부 접속하는 방법과, 여기서 더 나아가 보안을 튼튼하게 만드는 체크리스트 10가지를 제 경험을 녹여서 알려드릴게요. 저와 함께 삽질의 과정을 줄여보시죠! 🎉

    NAS 외부 접속을 위한 Cloudflare Tunnel 아키텍처는 마치 성벽에 난 비밀 통로처럼 작동해요. 직접적인 문을 여는 대신, Cloudflare가 제공하는 안전한 터널을 통해 외부와 소통하는 거죠.

    Cloudflare Tunnel과 Zero Trust, 왜 필요한가요?

    Cloudflare Tunnel은 쉽게 말해, 내부 네트워크의 서비스를 외부 인터넷에 안전하게 노출시키는 터널이라고 생각하시면 됩니다. 보통 외부 접속을 하려면 라우터에서 특정 포트를 열어 NAS로 트래픽을 보내는 포트 포워딩을 하잖아요? Cloudflare Tunnel은 이 방식과 완전히 다릅니다. NAS나 내부 서버에서 Cloudflare의 엣지 네트워크로 아웃바운드(Outbound) 연결을 맺어요. 외부에서는 이 터널을 통해서만 NAS에 접근할 수 있게 됩니다. Ingress(인그레스, 외부 트래픽 진입점)가 Cloudflare 엣지에서 시작되니, 내 홈 네트워크 IP 주소나 포트 정보가 외부에 노출될 일이 없는 거죠. 💡

    여기에 Cloudflare Zero Trust(클라우드플레어 제로 트러스트) 개념이 더해지면 보안이 한층 강화됩니다. 제로 트러스트는 이름 그대로 ‘아무도 믿지 않는다’는 철학이에요. 내부 네트워크에 있든 외부에 있든, 모든 접속 시도를 의심하고, 철저히 인증하고, 권한을 확인해야만 리소스에 접근할 수 있게 합니다. Cloudflare Tunnel은 Zero Trust 플랫폼의 핵심 구성 요소 중 하나이고요. 제가 직접 써보니, 특정 이메일 주소로만 NAS 접속을 허용하거나, 2단계 인증을 강제하는 등 강력한 접근 제어 기능을 쉽게 설정할 수 있어서 정말 편하더라고요.

    홈랩 NAS에 Cloudflare Tunnel 설치 및 설정하기

    자, 이제 실전입니다. 저는 리눅스 기반의 NAS(예: Synology, QNAP 또는 직접 구성한 서버)를 기준으로 설명해 드릴게요. 기본적인 개념은 동일합니다.

    1. Cloudflare Zero Trust 대시보드에서 Tunnel 생성하기

      먼저 Cloudflare Zero Trust 대시보드(https://one.dash.cloudflare.com/)에 접속합니다. 좌측 메뉴에서 Access > Tunnels로 이동해서 Create a tunnel 버튼을 눌러주세요. 터널 이름을 지정하고 생성하면, 다음 단계에서 cloudflared라는 클라이언트 소프트웨어를 설치하라는 가이드가 나옵니다. 여기에 나오는 인증 정보를 잘 복사해 두세요.

    2. cloudflared 클라이언트 설치 및 실행

      NAS에 SSH로 접속한 후, OS에 맞는 cloudflared를 설치합니다. 대부분의 리눅스 배포판은 다음 명령어로 쉽게 설치할 수 있어요.

      # Debian/Ubuntu 기반 시스템
      curl -L --output cloudflared.deb https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
      sudo dpkg -i cloudflared.deb
      
      # RPM 기반 시스템 (CentOS, Fedora)
      # sudo yum install -y https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-x86_64.rpm
      
      # 설치 후 터널 인증 (Cloudflare 계정 자동 인증)
      sudo cloudflared tunnel login
      
      # 터널 생성 및 구성 (대시보드에서 복사한 이름 사용)
      sudo cloudflared tunnel create [터널이름]
      
      # 서비스 등록 및 시작
      sudo cloudflared service install
      sudo systemctl start cloudflared
      sudo systemctl enable cloudflared

      cloudflared service install 명령으로 서비스에 등록하면, NAS가 재부팅되어도 자동으로 터널이 연결됩니다. 제가 처음엔 일회성으로 실행하고 재부팅 후에 터널이 끊어져서 당황했던 기억이 나네요. 😅

    3. Ingress(인그레스) 규칙 설정

      다시 Cloudflare Zero Trust 대시보드로 돌아가서, 방금 생성한 터널을 선택하고 Configure > Public Hostnames 탭으로 이동합니다. 여기서 NAS의 웹 인터페이스나 다른 서비스로 연결될 도메인과 포트를 설정합니다.

      # 예시: NAS 웹 인터페이스 (DSM, OMV 등)를 mynas.mydomain.com으로 연결
      Hostname: mynas.mydomain.com
      Type: HTTPS
      URL: http://localhost:5000  # NAS 내부 IP와 포트 (NAS 자체에서 실행 시 localhost)
      

      이렇게 설정하면 mynas.mydomain.com으로 접속했을 때 Cloudflare Tunnel을 통해 내 NAS의 5000번 포트로 연결되는 거죠. HTTPS를 선택해야 Cloudflare가 SSL/TLS 인증서를 자동으로 관리해주기 때문에 보안상 훨씬 유리해요. 복잡한 인증서 설정 없이도 HTTPS로 접속할 수 있어서 정말 편하더라고요.

    Cloudflare Zero Trust 대시보드 터널 Ingress 규칙 설정 화면

    Cloudflare Zero Trust 대시보드에서 Ingress 규칙을 설정하는 모습입니다. 외부에서 어떤 도메인으로 들어올 때, 내부의 어떤 서비스로 연결할지 명확하게 지정할 수 있죠.

    여기서 멈추면 안 됩니다! 보안 강화 체크리스트 10가지

    Cloudflare Tunnel만으로도 보안이 훨씬 좋아지지만, 완벽한 건 없습니다. 13년차 인프라 엔지니어의 경험으로 볼 때, 다음 10가지 체크리스트를 꼭 확인하셔서 NAS 보안을 더욱 강화하시길 추천합니다. 이 과정에서 저도 여러 번 삽질하며 배운 내용들입니다. ⚠️

    1. ✅ Cloudflare Tunnel 사용: NAS를 인터넷에 직접 노출하는 대신, Cloudflare Tunnel을 통해 안전한 아웃바운드 연결을 사용합니다. 이게 가장 기본이자 핵심입니다.
    2. ✅ Zero Trust Access 정책 설정: Cloudflare Zero Trust 대시보드에서 Access > Applications를 통해 NAS 서비스에 접근할 수 있는 사용자(이메일, IP 등)를 제한하는 정책을 만드세요. 저는 특정 Google 계정으로만 접근을 허용하도록 설정해서 쓰고 있습니다.
    3. ✅ Ingress 규칙 최소화: 필요한 서비스(예: NAS 웹 인터페이스, Plex)만 Ingress 규칙으로 등록하고, 불필요한 포트는 절대 열지 마세요. Type: HTTP 또는 HTTPS로 웹 서비스만 연결하고, SSH 포트 같은 건 터널로 노출하지 않는 게 좋습니다.
    4. ✅ cloudflared 최신 버전 유지: cloudflared 클라이언트는 보안 취약점이 발견될 수 있으니, 항상 최신 버전으로 업데이트하세요. sudo apt update && sudo apt upgrade cloudflared (Debian/Ubuntu) 또는 sudo yum update cloudflared (RPM) 명령으로 주기적으로 업데이트해 주세요.
    5. ✅ NAS 사용자 계정 강력한 비밀번호 사용: Cloudflare Tunnel로 보호해도, NAS 자체의 보안이 약하면 무용지물입니다. NAS 로그인 비밀번호는 길고 복잡하게, 그리고 주기적으로 변경하는 게 좋아요.
    6. ✅ NAS 및 Cloudflare 계정 2단계 인증(2FA) 설정: NAS 자체 로그인과 Cloudflare 계정 모두 2FA를 활성화하세요. 제로 트러스트 정책과 함께 쓰면 보안이 극대화됩니다.
    7. ✅ 라우터에서 UPnP(Universal Plug and Play) 비활성화: UPnP는 기기들이 자동으로 포트 포워딩을 설정하게 하는 편리한 기능이지만, 보안상 매우 취약합니다. 라우터 설정에서 반드시 비활성화하세요.
    8. ✅ NAS 운영체제(OS) 및 애플리케이션 최신 상태 유지: NAS OS(DSM, OMV 등)와 설치된 Docker 컨테이너, 패키지 등을 항상 최신 버전으로 업데이트하여 알려진 취약점을 패치합니다.
    9. ✅ 네트워크 세그먼테이션 고려 (고급): 가능하다면 NAS를 다른 IoT 기기나 일반 사용자의 네트워크와 분리하는 네트워크 세그먼테이션(Network Segmentation)을 고려해볼 수 있습니다. VLAN을 이용하는 방식이 대표적이죠.
    10. ✅ Cloudflare Audit Logs 및 Analytics 모니터링: Cloudflare Zero Trust 대시보드에서 Audit Logs(감사 로그)나 Analytics(분석)를 주기적으로 확인하여 비정상적인 접근 시도나 트래픽 패턴이 없는지 모니터링해요.

    접속 확인 및 모니터링

    이제 모든 설정이 끝났으니, 제대로 작동하는지 확인해볼 차례입니다. 설정한 도메인(예: mynas.mydomain.com)으로 웹 브라우저를 통해 접속해 보세요. Cloudflare Zero Trust Access 정책이 적용되어 있다면, 먼저 이메일 인증이나 다른 설정된 인증 절차를 거치게 될 겁니다. 이 과정을 통과하면 NAS 웹 인터페이스가 나타날 거예요. 드디어 됐다! 🎉

    Cloudflare Zero Trust 대시보드에서 Access > Logs로 이동하면 누가, 언제, 어떤 정책을 통해 NAS에 접근했는지 상세한 로그를 확인할 수 있습니다. 저도 이 로그를 보면서 누가 내 NAS에 접근하는지, 혹시 비정상적인 시도는 없는지 주기적으로 확인하고 있어요. 이런 가시성이 보안에 정말 큰 도움이 되더라고요.

    Cloudflare Zero Trust 대시보드 Access Logs 화면

    Cloudflare Zero Trust 대시보드의 Access Logs 화면입니다. 누가, 언제, 어떻게 NAS에 접속했는지 투명하게 확인할 수 있어, 보안 모니터링에 큰 도움이 됩니다.

    마무리하며

    NAS 외부 접속, 편리함만큼이나 보안이 중요합니다. 예전에는 복잡한 VPN 설정이나 위험한 포트 포워딩에 의존했지만, Cloudflare Tunnel과 Zero Trust 덕분에 이제는 훨씬 쉽고 안전하게 홈랩 NAS를 외부에서 활용할 수 있게 됐어요. 제가 직접 써보니 초기 설정은 조금 복잡하게 느껴질 수 있지만, 한번 구축하고 나면 얻게 되는 보안성과 편의성은 그 이상이더라고요. 😊

    오늘 제가 알려드린 Cloudflare Tunnel을 이용한 NAS 외부 접속 방법과 10가지 보안 강화 체크리스트가 여러분의 소중한 데이터를 보호하는 데 도움이 되기를 바라요. 기술은 계속 발전하고, 그만큼 우리의 보안 의식도 함께 발전해야 한다는 걸 잊지 마세요. 다음번에는 Cloudflare Tunnel을 활용해서 다른 홈랩 서비스들을 외부로 노출하는 방법에 대해 더 깊이 다뤄볼 예정입니다. 기대해주세요!

    Cloudflare Tunnel NAS 보안 강화 체크리스트 10가지 인포그래픽

    오늘 다룬 Cloudflare Tunnel과 NAS 보안 강화 체크리스트 10가지 핵심 내용을 한눈에 볼 수 있도록 정리한 인포그래픽입니다.

  • [Proxmox] Proxmox VE 보안 강화 체크리스트 10가지: 안전한 가상화 환경 구축

    [Proxmox] Proxmox VE 보안 강화 체크리스트 10가지: 안전한 가상화 환경 구축

    안녕하세요! 13년차 인프라 엔지니어, 13년차의 서버실 운영자입니다. 오늘은 제가 홈랩(Homelab)에서 Proxmox VE를 운영하면서 겪었던 일들과 함께, 여러분의 소중한 가상화 환경을 더욱 안전하게 보호할 수 있는 Proxmox 보안 강화 체크리스트 10가지를 공유해볼까 합니다. 사실 처음엔 저도 ‘내 개인 서버인데 뭐 그렇게까지 해야 하나?’ 싶었거든요. 근데 한번 호되게 당하고 나서는 생각이 싹 바뀌었습니다. 인터넷에 연결된 모든 시스템은 잠재적인 공격 대상이 될 수 있다는 걸 뼈저리게 느꼈죠. 이 글을 통해 여러분은 저처럼 삽질하지 마시고, 처음부터 튼튼한 Proxmox VE 환경을 구축하시길 바랍니다. 이 체크리스트만 따라 해도 웬만한 위협에서는 훨씬 안전해질 거예요! 자, 그럼 시작해볼까요? 🎉

    Proxmox VE의 구성 요소와 각 영역에 적용될 보안 조치들을 시각적으로 보여주는 다이어그램입니다.

    1. 강력한 관리자 비밀번호와 SSH 키 인증 ✅

    보안의 가장 기본은 뭐니 뭐니 해도 비밀번호거든요. Proxmox VE 설치 시 설정하는 root 계정 비밀번호는 물론, 추가로 생성하는 모든 사용자 계정 비밀번호는 길고 복잡하게 만들어야 합니다. 숫자, 특수문자, 대소문자를 섞어서 최소 12자리 이상이죠. 저는 보통 16자리 이상으로 만듭니다.

    그리고 SSH(Secure Shell) 접속 시에는 비밀번호 인증 대신 SSH 키 인증(SSH Key Authentication)을 사용하는 게 훨씬 안전해요. 비밀번호는 무작위 대입 공격(Brute-force attack)에 취약하거든요. 제가 직접 해보니 키 인증 한 번 설정해두면 훨씬 편하고 안전하더라고요. 처음엔 좀 번거롭지만, 한 번 해두면 두고두고 안심입니다.

    # 1. SSH 키 생성 (클라이언트 PC에서 실행)
    ssh-keygen -t rsa -b 4096 -C "[email protected]"
    
    # 2. Proxmox VE 서버로 공개 키 복사
    ssh-copy-id -i ~/.ssh/id_rsa.pub root@your_proxmox_ip
    
    # 3. 비밀번호 없이 SSH 접속 확인
    ssh root@your_proxmox_ip

    이렇게 하면 다음부터는 비밀번호 입력 없이 SSH에 접속할 수 있습니다. 💡 팁: ssh-agent를 활용하면 키 비밀번호(passphrase)도 한 번만 입력해도 되더라고요.

    2. Proxmox VE 웹 UI 2단계 인증 (2FA) 🛡️

    Proxmox VE의 웹 관리 UI는 모든 설정의 핵심이거든요. 이곳이 뚫리면 모든 게 끝장입니다. 그래서 2단계 인증(Two-Factor Authentication, 2FA)은 선택이 아닌 필수죠. 구글 OTP(Google Authenticator) 같은 TOTP(Time-based One-Time Password) 앱을 연동해서 로그인할 때마다 일회용 코드를 입력하게 하는 거예요.

    제가 직접 설정해보니 생각보다 간단하더라고요. Proxmox VE 웹 UI에 로그인해서 [Datacenter] > [Permissions] > [Users]로 가서 여러분의 사용자 계정을 선택한 다음, [TFA] 탭에서 [Add] > [TOTP Factor]를 선택하면 됩니다. 그러면 QR 코드가 나오는데, 이걸 OTP 앱으로 스캔하면 끝! 로그인할 때 아이디/비밀번호 입력 후 OTP 코드를 한 번 더 입력하게 됩니다.

    Proxmox VE 웹 UI 2단계 인증 (TOTP) 설정 화면

    Proxmox VE 웹 인터페이스에서 TOTP(Time-based One-Time Password) 2단계 인증을 활성화하는 과정을 보여주는 스크린샷입니다.

    3. SSH 기본 설정 강화 🔒

    앞서 SSH 키 인증을 설정했다면, 이제 sshd 설정을 강화할 차례예요. 기본 설정을 그대로 두면 보안에 취약할 수 있거든요. 특히 root 계정으로 바로 로그인하는 것을 막고, 비밀번호 인증도 비활성화하는 것이 좋습니다. 저는 이 설정을 안 했다가 한동안 SSH 무작위 대입 공격 시도 로그를 보면서 식겁했던 경험이 있습니다. ㅎㅎ

    # Proxmox VE 서버에서 실행
    
    # 1. SSH 설정 파일 백업 (중요!)
    cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
    
    # 2. 설정 파일 수정
    nano /etc/ssh/sshd_config
    
    # 다음 라인들을 찾아서 수정하거나 추가합니다.
    # PermitRootLogin no             # root 계정 직접 로그인 금지
    # PasswordAuthentication no      # 비밀번호 인증 비활성화 (키 인증 필수)
    # Port 2222                      # SSH 기본 포트 22번 대신 다른 포트 사용 (예: 2222)
    
    # 3. SSH 서비스 재시작
    systemctl restart sshd

    ⚠️ 주의사항: PermitRootLogin no와 PasswordAuthentication no를 설정하기 전에, 반드시 일반 사용자 계정을 만들고 SSH 키 인증으로 로그인 가능한지 확인해야 합니다. 안 그러면 서버에 접속하지 못하는 불상사가 발생할 수 있거든요! 저도 한 번 실수로 root 계정으로만 접속 가능한 상태에서 이 설정을 했다가 콘솔에 매달려야 했던 적이 있습니다… 😅

    4. Proxmox VE 내장 방화벽 활용 🔥

    Proxmox VE는 자체적으로 방화벽(Firewall) 기능을 제공하는데, 정말 강력해요. 호스트 레벨과 VM(Virtual Machine)/컨테이너(Container) 레벨 모두에서 네트워크 보안(Network Security)을 구현할 수 있거든요. Ingress(인그레스, 외부에서 내부로 들어오는 트래픽)와 Egress(이그레스, 내부에서 외부로 나가는 트래픽) 규칙을 세밀하게 제어할 수 있습니다.

    제가 홈랩에서 가장 먼저 하는 일 중 하나가 바로 이 방화벽 설정입니다. 불필요한 포트는 모두 막아두고, 필요한 포트(예: Proxmox 웹 UI 8006, SSH 변경 포트)만 열어두는 거죠. VM마다 다른 보안 정책을 적용할 수 있어서 정말 유용하더라고요.

    # Proxmox VE 호스트 레벨 방화벽 활성화
    pve-firewall start
    pve-firewall enable
    
    # 방화벽 규칙 설정은 Web UI를 권장합니다:
    # [Datacenter] > [Firewall] 또는 [Node] > [Firewall]
    # [VM/Container] > [Firewall]

    이건 Proxmox VE의 꽃 같은 기능이라고 생각합니다. 네트워크 세그멘테이션과 함께 사용하면 시너지가 정말 엄청나거든요!

    5. 네트워크 세그멘테이션 🌐

    네트워크 세그멘테이션(Network Segmentation)은 물리적 또는 가상적으로 네트워크를 여러 개의 작은 구역으로 나누는 것을 의미해요. 예를 들어, Proxmox VE 관리용 네트워크, VM 서비스용 네트워크, 스토리지용 네트워크 등을 분리하는 거죠. 이렇게 하면 한 구역이 뚫려도 다른 구역으로의 확산을 막을 수 있습니다.

    저는 보통 물리적 네트워크 인터페이스 카드(NIC)를 여러 개 사용하거나, VLAN(Virtual Local Area Network)을 활용해서 네트워크를 나눕니다. 관리 네트워크는 외부 인터넷과 직접 연결되지 않도록 하고, VM 서비스 네트워크만 필요한 포트만 열어두죠. 처음엔 귀찮아서 한데 뭉쳐놨었는데, 나중에 문제가 생겼을 때 트러블슈팅도 훨씬 어렵고, 보안적으로도 너무 취약하더라고요. 그래서 지금은 무조건 나누는 걸 원칙으로 합니다.

    Proxmox VE에서는 vmbr0, vmbr1 등 리눅스 브릿지(Linux Bridge)를 활용해서 가상 네트워크를 구성해요. 물리 NIC와 연결하거나, VLAN 태그를 지정할 수 있죠.

    6. Proxmox VE 시스템 최신 유지 🔄

    소프트웨어는 항상 최신 상태로 유지하는 게 중요합니다. Proxmox VE도 마찬가지거든요. 개발팀은 지속적으로 보안 취약점을 패치하고 새로운 기능을 추가하니까요. 오래된 버전은 알려진 취약점에 노출될 위험이 크거든요.

    저는 정기적으로 업데이트를 확인하고 적용하는 루틴을 가지고 있습니다. 한 달에 한 번 정도는 꼭 확인해서 업데이트를 진행하죠. 물론 업데이트 전에 백업은 필수예요! 업데이트하다가 예기치 않은 문제가 생길 수도 있거든요. 이 부분은 제가 나중에 백업 관련 글로 자세히 다룰 예정입니다.

    # Proxmox VE 업데이트
    apt update
    apt dist-upgrade
    
    # 재부팅이 필요한 경우 (커널 업데이트 등)
    reboot

    apt dist-upgrade는 새로운 커널이나 주요 패키지 업데이트를 포함하므로, 항상 변경 내용을 확인하고 신중하게 진행해야 합니다. 특히 프로덕션 환경이라면 더더욱 그렇고요!

    7. 백업 및 복구 전략 보안 💾

    아무리 보안을 잘해도 사고는 언제든 일어날 수 있어요. 랜섬웨어 공격, 하드웨어 고장, 실수로 인한 데이터 손실 등 다양한 위협으로부터 데이터를 보호하기 위해 백업은 필수입니다. 그리고 이 백업 데이터 자체도 안전하게 관리해야 합니다.

    저는 Proxmox Backup Server (PBS)를 활용해서 백업을 하더라고요. PBS는 효율적인 증분 백업(Incremental Backup)과 중복 제거(Deduplication)는 물론, 백업 암호화(Backup Encryption) 기능까지 제공해서 데이터를 안전하게 보관할 수 있게 해줍니다. 백업 데이터를 외부(Off-site) 스토리지에 보관하는 것도 중요해요. 물리적으로 다른 위치에 두는 거죠.

    그리고 백업이 잘 되는지 주기적으로 복구 테스트를 해보는 것도 정말 중요합니다. 백업만 있고 복구가 안 되면 아무 소용 없잖아요? 제가 예전에 백업은 잘 했는데, 복구 테스트를 안 했다가 막상 필요할 때 복구가 안 돼서 식은땀 흘렸던 적이 있어요… 😅

    Proxmox VE 보안 강화 체크리스트 10가지 요약 인포그래픽

    Proxmox VE 보안 강화의 핵심 10가지 항목을 요약하고 시각적으로 강조한 인포그래픽입니다.

    8. 사용자 및 권한 관리 (RBAC) 👥

    Proxmox VE는 역할 기반 접근 제어(Role-Based Access Control, RBAC)를 지원해요. 관리자 계정 하나로 모든 걸 다 하는 것보다는, 필요한 최소한의 권한만 부여하는 최소 권한 원칙(Principle of Least Privilege)을 지키는 게 중요합니다. 예를 들어, VM만 관리하는 사용자에게는 스토리지나 네트워크 설정 권한을 주지 않는 거죠.

    Proxmox VE 웹 UI에서 [Datacenter] > [Permissions]로 들어가면 사용자(Users), 그룹(Groups), 역할(Roles)을 정의할 수 있습니다. 처음엔 좀 복잡하게 느껴질 수도 있지만, 익숙해지면 훨씬 체계적으로 관리할 수 있더라고요.

    저도 처음엔 그냥 root 계정 하나로 모든 걸 했다가, 실수로 중요한 설정을 건드릴 뻔한 적이 여러 번 있습니다. 그때마다 ‘아, 이러면 안 되겠구나’ 싶어서 권한을 쪼개기 시작했죠. 특히 여러 사람이 함께 Proxmox VE를 관리하는 환경이라면 이 기능은 정말 필수예요.

    9. 불필요한 서비스 비활성화 🛑

    운영체제에는 기본적으로 다양한 서비스(Daemon)들이 설치되어 있어요. 이 중에는 Proxmox VE 운영에 반드시 필요하지 않거나, 사용하지 않는 서비스들도 있을 수 있습니다. 불필요한 서비스를 비활성화하면 공격 표면(Attack Surface)을 줄이고 시스템 자원을 절약할 수 있거든요.

    예를 들어, Proxmox VE를 설치하면 apt-cacher-ng 서비스가 자동으로 설치되는 경우가 있는데, 만약 여러 대의 Proxmox 서버를 운영하는 환경이 아니라면 굳이 필요 없을 수 있습니다. 이런 서비스들을 확인하고 비활성화하는 것이 좋아요.

    # 현재 실행 중인 서비스 목록 확인
    systemctl list-units --type=service --state=running
    
    # 특정 서비스 비활성화 (예시: apt-cacher-ng)
    systemctl stop apt-cacher-ng
    systemctl disable apt-cacher-ng

    ⚠️ 경고: 어떤 서비스가 시스템에 필요한지 확실히 모른다면 섣불리 비활성화하지 마세요. 잘못하면 시스템이 부팅되지 않거나 정상적으로 작동하지 않을 수 있거든요. Proxmox 관련 핵심 서비스는 절대 건드리면 안 됩니다!

    10. 정기적인 보안 감사 및 모니터링 🔍

    마지막으로, 모든 보안 설정이 잘 작동하는지 정기적으로 확인하고 모니터링하는 게 정말 중요합니다. 시스템 로그를 확인하고, 이상 징후는 없는지 살펴보는 거죠. fail2ban 같은 도구를 사용하면 SSH 무작위 대입 공격 시도를 자동으로 차단하는 데 큰 도움이 됩니다.

    저는 journalctl 명령어를 자주 사용해서 로그를 살펴봐요. 특히 SSH 접속 시도 로그나 방화벽 차단 로그 같은 것들이죠. 처음엔 그냥 지나쳤는데, 자세히 보니 수상한 IP에서 계속 접속 시도가 있더라고요. 그때부터 fail2ban을 설치해서 사용하기 시작했습니다. 이거 진짜 편하더라고요!

    # 최근 로그 확인
    journalctl -f
    
    # fail2ban 설치 및 설정
    apt install fail2ban
    cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
    nano /etc/fail2ban/jail.local
    # [sshd] 섹션에서 enabled = true 로 변경하거나 원하는 설정 적용
    systemctl enable fail2ban
    systemctl start fail2ban

    ⚠️ 삽질 경험과 해결 과정

    솔직히 이 모든 과정을 한 번에 완벽하게 해내기란 쉽지 않습니다. 저도 여러 번 삽질 좀 했거든요. 특히 SSH 설정을 강화하다가 제 발등을 찍었던 적이 많아요. PermitRootLogin no와 PasswordAuthentication no를 설정하고 sshd를 재시작했는데, 그만 SSH 키 인증이 제대로 안 되어 있어서 서버에 접속하지 못했던 거죠. 다행히 Proxmox VE는 콘솔 접속(Keyboard & Monitor)이 가능해서 직접 가서 복구했습니다만… 원격으로만 관리하는 서버였다면 정말 큰일 날 뻔했어요.

    이런 경험을 통해 배운 건, ‘변경 전에 항상 백업하고, 변경 후에는 반드시 검증하라’는 거예요. 특히 원격 접속 설정은 더더욱 신중해야 합니다. 콘솔 접속이 불가능한 환경이라면 ‘Rollback Plan(롤백 계획)’을 미리 세워두는 것이 좋아요.

    🎉 안전한 Proxmox 환경, 직접 확인해보니

    위에 언급된 체크리스트를 하나씩 적용하고 나면, 여러분의 Proxmox VE 환경은 훨씬 견고해질 겁니다. SSH 포트가 바뀌고, 키 인증으로만 접속되며, 웹 UI는 2단계 인증을 거쳐야만 들어갈 수 있게 되죠. 방화벽 덕분에 불필요한 트래픽은 차단되고, 시스템은 항상 최신 상태를 유지하게 됩니다. 이런 변화들을 직접 체감하면 정말 뿌듯하더라고요!

    각 설정이 제대로 적용되었는지 확인하는 것도 중요합니다. 예를 들어, SSH 포트 변경은 netstat -tuln | grep <새로운 포트> 명령어로 확인할 수 있고, 방화벽 규칙은 Proxmox VE 웹 UI의 [Datacenter] > [Firewall] 섹션에서 확인할 수 있어요.

    보안 강화 설정이 완료된 Proxmox VE 환경 대시보드

    Proxmox VE의 보안 설정이 강화된 후의 상태를 보여주는 대시보드 또는 주요 보안 설정 활성화 여부를 시각적으로 나타낸 이미지입니다.

    💡 마무리하며: 13년차 서버실의 다음 이야기

    오늘은 Proxmox VE 보안 강화 체크리스트 10가지를 통해 안전한 가상화 환경을 구축하는 방법을 알아봤습니다. 기본적인 비밀번호부터 시작해서 SSH 보안, 2FA Proxmox, Proxmox 방화벽 설정, 네트워크 세그멘테이션까지, 이 모든 과정이 처음엔 어렵게 느껴질 수 있지만, 하나씩 따라 하다 보면 어느새 튼튼한 서버실을 만들고 있는 자신을 발견할 수 있을 거예요. 이 경험들이 여러분의 인프라 엔지니어링 여정에 큰 도움이 되기를 바랍니다. 다음번에는 Proxmox VE의 백업 전략에 대해 좀 더 깊이 있는 이야기를 나눠볼까 합니다. 그때까지 여러분의 서버실이 안전하길 바랍니다! 궁금한 점이 있다면 언제든지 댓글로 남겨주세요. 저도 함께 고민해드릴게요! 😊