공격 표면 관리를 위한 자동화된 자산 발견 플랫폼 구축 및 엔지니어링 실무

디지털 환경의 복잡성이 증가함에 따라 공격 표면(Attack Surface)의 식별과 관리는 현대 보안 체계의 핵심 과제가 되었습니다. 자동화된 자산 발견 플랫폼은 단순한 정보 수집 도구를 넘어, 지속적이고 체계적인 자산 맵핑을 통해 보안 운영의 가시성을 극대화하는 엔지니어링 솔루션입니다. 본 글에서는 단일 도구 기반의 점검에서 벗어나 확장 가능한 자산 발견 플랫폼을 설계하고 구현하는 핵심 원리와 실무 기법을 다룹니다.

1. 도구에서 시스템으로: 자산 발견의 패러다임 전환

기존의 수동적인 침투 테스트나 단발성 스캔은 급변하는 IT 인프라를 추적하기에 한계가 있습니다. 엔지니어링 기반의 플랫폼은 다음과 같은 차별점을 가집니다.

  • 복합성 대응: 도메인, IP, 포트, 서비스, 프레임워크 등 다차원적인 데이터를 유기적으로 결합합니다.
  • 지속성 유지: 자산은 생성과 소멸이 빈번합니다. 스냅샷 방식이 아닌 배치 또는 실시간 탐지를 통해 최신 상태를 유지합니다.
  • 확장성 확보: 수만 개의 자산을 처리하기 위해 분산 큐와 표준화된 엔진 인터페이스를 도입합니다.
  • 지식의 코드화: 보안 전문가의 노하우를 탐지 규칙과 데이터 연관 로직으로 변환하여 시스템에 내재화합니다.

2. 플랫폼 아키텍처 및 데이터 흐름

효율적인 자산 발견 플랫폼은 일반적으로 4가지 계층으로 구성됩니다.

  1. 수집 엔진(Engine Layer): Subfinder, Naabu, Httpx 등 개별 도구를 표준화된 인터페이스로 래핑하여 실행합니다.
  2. 스케줄러 및 오케스트레이터(Orchestration Layer): 엔진 간의 실행 순서와 의존성을 관리하며 태스크를 분산 처리합니다.
  3. 데이터 처리기(Processor Layer): 중복을 제거하고 자산 간의 연관 관계(예: 도메인-IP-포트)를 정의합니다.
  4. 저장소(Storage Layer): 정형 데이터는 RDB에, 자산 간 연결 구조는 그래프 데이터베이스(Neo4j 등)에 저장합니다.

3. 실무 구현: 환경 구축 및 코어 엔진 설계

플랫폼의 기반이 되는 분산 큐(Redis)와 그래프 DB(Neo4j)를 Docker Compose로 빠르게 구축할 수 있습니다.

# docker-compose.yml
version: '3.9'
services:
  task_broker:
    image: redis:7-alpine
    ports:
      - "6379:6379"

  asset_graph:
    image: neo4j:latest
    ports:
      - "7474:7474"
      - "7687:7687"
    environment:
      - NEO4J_AUTH=neo4j/secure_password_123

다음은 여러 스캔 엔진을 통합하고 결과를 정규화하여 저장하는 핵심 파이썬 로직의 재구성 예시입니다.

import hashlib
import sqlite3
import json
from abc import ABC, abstractmethod

class BaseScanner(ABC):
    """표준화된 스캔 엔진 인터페이스"""
    def __init__(self, name):
        self.name = name

    @abstractmethod
    def execute(self, target):
        pass

class DomainScanner(BaseScanner):
    """서브도메인 수집 엔진"""
    def execute(self, target):
        print(f"[{self.name}] 도메인 탐지 중: {target}")
        # 실제 환경에서는 subprocess 등으로 외부 도구 실행
        # 여기서는 모의 데이터를 반환
        return [
            {"type": "fqdn", "value": f"dev.{target}", "meta": {"source": "passive_dns"}},
            {"type": "fqdn", "value": f"api.{target}", "meta": {"source": "cert_logs"}}
        ]

class AssetManager:
    """자산 정규화 및 DB 영속화"""
    def __init__(self, db_path="recon.db"):
        self.db = sqlite3.connect(db_path)
        self._init_db()

    def _init_db(self):
        self.db.execute("""
            CREATE TABLE IF NOT EXISTS inventory (
                uid TEXT PRIMARY KEY,
                category TEXT,
                addr TEXT,
                origin TEXT
            )
        """)

    def generate_uid(self, category, addr):
        return hashlib.sha256(f"{category}:{addr}".encode()).hexdigest()

    def register_assets(self, results, engine_name):
        for item in results:
            uid = self.generate_uid(item['type'], item['value'])
            self.db.execute(
                "INSERT OR IGNORE INTO inventory VALUES (?, ?, ?, ?)",
                (uid, item['type'], item['value'], engine_name)
            )
        self.db.commit()

def run_discovery(root_target):
    manager = AssetManager()
    
    # 1단계: 서브도메인 탐지
    sub_scanner = DomainScanner("SubFinder-Wrapper")
    found_assets = sub_scanner.execute(root_target)
    manager.register_assets(found_assets, sub_scanner.name)
    
    print(f"탐지 완료: {len(found_assets)} 개의 자산이 등록되었습니다.")

if __name__ == "__main__":
    run_discovery("internal-service.local")

4. 자산 그래프 분석 및 활용

저장된 데이터는 그래프 쿼리를 통해 단순한 리스트 이상의 가치를 제공합니다. Neo4j의 Cypher 쿼리를 사용하면 복잡한 자산 관계를 직관적으로 분석할 수 있습니다.

// 특정 루트 도메인에서 파생된 모든 하위 자산 추적
MATCH path = (root:Asset {value: "example.com"})-[:SUBDOMAIN*]->(sub)
RETURN path;

// 특정 IP 대역에서 80, 443 이외의 포트가 열려 있는 서비스 식별
MATCH (i:IP)-[:HAS_PORT]->(p:Port)
WHERE NOT p.number IN [80, 443]
RETURN i.address, p.number, p.service_name;

5. 방어적 관점에서의 자산 관리 최적화

공격자의 정찰 활동을 지연시키고 탐지 효율을 높이기 위해 방어자 역시 엔지니어링 기법을 활용해야 합니다.

  • 자산 지문(Asset Fingerprinting) 식별: 배포되는 모든 웹 서비스의 HTTP 헤더에 X-Asset-ID와 같은 고유 식별자를 부여하여 CMDB와 자동 동기화합니다.
  • 허니팟 자산 배치: 실제 서비스와 유사한 가짜 도메인이나 포트를 노출시켜 스캔 행위를 조기에 탐지합니다.
  • 트래픽 패턴 분석: 단기간에 수많은 NXDOMAIN 쿼리를 발생시키는 행위나 비정상적인 User-Agent 기반의 스캔 트래픽을 SIEM에서 실시간 모니터링합니다.

결론적으로, 자동화된 자산 발견은 단순한 기술적 구현을 넘어 보안 운영 전반의 가시성을 확보하는 핵심 프로세스입니다. 클라우드 네이티브 환경으로의 변화에 맞춰 API 기반의 동적 탐지와 AI를 활용한 자산 연관성 추론으로 그 영역을 확장해 나가야 합니다.

태그: Attack-Surface-Management Cyber-Reconnaissance python-automation Neo4j DevSecOps

7월 30일 22:28에 게시됨