AI 에이전트를 위한 보안 스캐너 구축 — Flowork의 Threat Radar 아키텍처
요약
Flowork의 Threat Radar는 AI 에이전트가 실행하는 코드를 실시간으로 감시하는 내장형 보안 레이더 아키텍처를 소개합니다. 에이전트의 자율적 실행 과정에서 발생할 수 있는 보안 위협을 방지하기 위해 마이크로커널 수준에서 보안 스캔 기능을 통합했습니다.
핵심 포인트
- AI 에이전트의 코드 실행에 대한 실시간 가시성 및 보안 레이더 제공
- 정적/동적 검사 도구를 활용한 두 가지 스캔 모드 지원
- 사용자 정의 가능한 Nuclei 템플릿 기반의 탐지 체크 항목 구축
- 허용 목록(allowlist) 기반의 엄격한 도구 및 타겟 제어로 임의 명령 실행 방지
AI 에이전트에게 보안 스캐너가 중요한 이유
AI 에이전트는 무엇을 실행할지, 어디서 실행할지, 그리고 언제 실행할지를 결정하는 프로그램입니다. 인간 운영자와 달리, 에이전트는 잠시 멈춰서 "정말로 이걸 해도 될까?"라고 물어보는 본능적인 직관이 없습니다. 에이전트를 프로덕션(production) 환경에 배포하기 전, 혹은 테스트하기 전이라도, 에이전트가 실행할 수 있는 코드에 대한 실질적인 가시성(visibility)이 필요합니다. Flowork의 Threat Radar는 에이전트가 실행하는 코드를 실시간으로 감시하는 내장형 보안 레이더입니다.
다른 어떤 에이전트 프레임워크도 이를 기본적으로 제공하지 않습니다. 대부분은 보안을 사후 고려 사항이나 나중에 덧붙이는 별도의 툴체인(toolchain)으로 취급합니다. 하지만 여기서는 보안이 마이크로커널(microkernel)의 일부입니다.
실시간 대시보드
Threat Radar를 열면 왼쪽에 세 가지 숫자와 함께 레이더 스윕(radar sweep)이 보입니다:
- Runs (실행) — 이 에이전트에서 완료된 스캔 횟수.
- Findings (탐지 결과) — 모든 스캔을 통해 발견된 총 이슈 수.
- Critical (심각도) — 현재 활성화된 가장 심각한 이슈의 수준. 이 숫자는 심각한 문제가 실시간으로 존재하면 빨간색, 깨끗하면 초록색으로 표시됩니다. 결정적으로, 이는 각 타겟의 최신 스캔 결과를 반영하므로, 문제를 수정하면 빨간색이 사라집니다.
오른쪽에는 Scan Log (스캔 로그) (모든 스캔 기록, 최신순)와 Findings (탐지 결과) 패널(실행 기록을 클릭하여 발견된 내용을 상세히 확인 가능)이 있습니다. 대시보드는 페이지를 새로고침할 필요 없이 몇 초마다 자동으로 업데이트됩니다.
두 가지 스캔 모드
⊕ Scan Target (스캔 타겟) 버튼을 누르면 네 가지 필드가 있는 양식이 열립니다:
- Tool (도구) — 사용할 스캐너 (예: 정적 코드 감사 도구(static code auditor), 동적 검사기(dynamic checker)).
- Target (타겟) — 스캔 대상 (본인의 에이전트 코드 또는 권한이 있는 외부 타겟).
- Args (인자) — 도구에 필요한 선택적 플래그(flags) 또는 설정.
- Category (카테고리) —
immune(본인의 코드를 강화) 또는pentest(테스트 권한을 가진 승인된 외부 타겟).
도구 목록과 타겟 목록은 모두 **소유자가 편집 가능한 허용 목록(allowlist)**에서 가져옵니다. Flowork는 허용 목록에 없는 도구를 실행하거나 타겟에 접근하는 것을 거부합니다. 중간에 쉘(shell)이 없으며, 임의의 명령 실행(arbitrary command execution)도 불가능합니다. 오직 소유자가 명시적으로 허용한 것만 가능합니다.
무기고 (The Arsenal): 방어적 코드 감사 도구 + 수천 개의 체크 항목
우측 상단의 ≣ Arsenal을 클릭하면 스캐너가 사용할 수 있는 모든 항목의 카탈로그가 열립니다.
- 방어적 코드 감사 도구 (Defensive code auditors) (
CORE로 표시됨) — 기본 구성 요소로, 삭제할 수 없습니다. - 도구 (Tools) — 활성화하거나 비활성화할 수 있는 특정 스캐너들입니다.
- 탐지 체크 (Detection checks) — 수천 개에 달하며, 검색이 가능하고 팩(pack) 형태로 설치할 수 있습니다.
이곳은 스캐너가 무엇을 탐색할지 사용자 정의하는 곳입니다. 새로운 탐지 팩을 설치하면 재시작 없이 즉시 무기고에 통합됩니다.
나만의 체크 항목 구축하기
체크 항목은 **nuclei 템플릿 (nuclei template)**입니다. 즉, "이 패턴을 찾아라"라고 명시하는 작은 YAML 파일입니다. Nuclei는 보안 업계에서 검증된 도구입니다. 우리는 선언적(declarative)이고, 가독성이 높으며, 안전하기 때문에(템플릿은 비활성 상태로 실행됩니다. 즉, 무엇을 할지가 아니라 무엇을 찾을지를 기술합니다) 체크 항목을 위한 언어로 Nuclei를 사용합니다.
간단한 HTTP 체크 항목
다음은 노출된 .env 파일을 찾는 체크 항목입니다:
id: exposed-env-file
info:
name: Exposed .env file
...
이 템플릿은 다음과 같이 지시합니다: "대상 서버의 /.env 경로로 GET 요청을 보냅니다. 만약 응답에 DB_PASSWORD가 포함되어 있다면, 이를 높은 심각도(high-severity)의 문제로 표시합니다."
단일 체크 항목 추가하기
JSON 본문과 함께 /api/scanner/checks/add로 POST 요청을 보냅니다:
{
"name": "exposed-env-file",
"yaml": "id: exposed-env-file\ninfo:\n name: Exposed .env file\n author: you\n severity: high\nhttp:\n - method: GET\n path:\n - ""{{BaseURL}}/.env""\n matchers:\n - type: word\n words:\n - ""DB_PASSWORD"""
...
체크 항목이 도착하면 nuclei -validate를 통해 검증을 거칩니다. 유효하다면 <nuclei-templates>/flowork-private/ 경로에 저장되며 무기고(Arsenal)에 나타납니다.
여러 체크 항목을 하나의 팩으로 묶기
더 큰 규모의 스캐너나 관련 체크 항목 모음을 만들려면 .fwpack 파일을 생성합니다:
my-scanner.fwpack
├─ plugin.json
└─ checks/
...
plugin.json은 팩을 정의합니다:
{
"id": "my-scanner",
"kind": "scanner",
...
/api/scanner/packs/install`을 사용하여 설치합니다. 모든 체크(check)는 검증되며, 나머지는 즉시 Arsenal에 통합됩니다.
안전 보장 (Safety Guarantees)
- 소유자 전용 (Owner-only) — 오직 소유자만이 도구(tools), 대상(targets), 또는 체크(checks)를 추가할 수 있습니다.
- 모든 체크 검증 (Every check is validated) — 모든 YAML은 시스템에 반영되기 전
nuclei -validate를 통해 검증됩니다. - 템플릿은 비활성 상태로 실행 (Templates run inert) — nuclei 템플릿은 무엇을 실행할지가 아니라, 무엇을 찾을지를 기술합니다. 쉘 이스케이프(shell escapes)나 코드 인젝션(code injection)이 불가능합니다.
- 허용 목록 강제 (Allowlist enforcement) — 스캔은 오직 귀하의 허용 목록(allowlist)에 명시적으로 포함된 도구와 대상에만 접근합니다. 스캐너가 무엇을 건드릴 수 있는지 귀하가 직접 제어합니다.
- 외부 호출 없음 (No external calls) — 귀하가 명시적으로 대상을 외부 시스템으로 지정하지 않는 한(귀하의 허가 하에), 모든 것은 귀하의 머신 내에 머뭅니다.
자체 호스팅 AI(Self-Hosted AI)에 이것이 중요한 이유
자체 호스팅 에이전트(self-hosted agent)는 귀하의 하드웨어에서 코드를 실행합니다. 해당 코드는 다음과 같을 수 있습니다:
- 도구 호출 (데이터 가져오기, 스크립트 실행, 메시지 전송).
- 에이전트가 호출하는 외부 MCP 서버.
- 귀하가 보지 않는 동안 실행되는 예약된 자동화.
Threat Radar는 무엇이 안전하고 무엇이 안전하지 않은지에 대한 **실시간 가시성 (real-time visibility)**을 제공합니다. 에이전트가 무언가를 실행해 달라고 요청할 때, 귀하는 다음과 같은 스캐너를 보유하게 됩니다:
- 위험 요소가 무엇인지 인지함 — 일반적인 결함(노출된 비밀값(secrets), 패치되지 않은 버전, 일반적인 설정 오류)에 대한 수천 개의 규칙을 보유합니다.
- 문제를 조기에 포착함 — 실수가 운영 환경(production)에 도달하기 전에 잡아냅니다.
- 귀하의 통제 하에 유지됨 — 클라우드, 외부 API, 또는 스캔 결과를 보유하는 제3자가 없습니다.
자체 호스팅 시스템에서 이것은 사치가 아니라 필수 요구 사항입니다. 귀하가 에이전트를 소유하고, 귀하가 리스크를 소유하며, 귀하가 스캐너를 소유합니다.
실제 스캐닝 사례
전형적인 워크플로우:
- 에이전트 배포 (Agent is deployed) → 일정 시간 실행됨 → 도구 호출 (tool call) 수행.
- 문제가 있다고 의심될 때 → Threat Radar를 열고, ⊕ Scan Target을 클릭하여 에이전트를 선택한 뒤 스캔을 실행합니다.
- 결과 확인 (Findings come back) → 심각도 (severity) 순으로 정렬된 이슈들을 확인합니다.
- 코드 수정 → 에이전트를 재시작합니다.
- 재스캔 → 심각한 (critical) 이슈 카운트가 다시 녹색(안전)으로 떨어집니다.
또는 자동화를 선호한다면: Flowork의 스케줄러 (scheduler)를 연결하여 정기적(매시간, 매일, 배포 후 등)으로 스캔을 실행함으로써, 새로운 리스크가 실제 운영되기 전에 포착할 수 있습니다.
트레이드오프 (Trade-offs) 및 솔직한 고백
Nuclei 템플릿 (templates)은 선언적 (declarative)이고 안전하지만, 무엇을 찾아야 하는지를 설명할 뿐 무엇을 수정해야 하는지를 알려주지는 않습니다. 스캔 결과는 "하드코딩된 비밀번호가 있습니다"라고 알려주지만, 이를 수정하는 것은 여전히 귀하의 몫입니다. 저희는 코드 재작성 제안을 제공하는 SAST (정적 분석 보안 테스트) 도구가 아니라, 감시하고 경고를 보내는 레이더 (radar)입니다.
또한: 스캐너의 성능은 스캐너가 알고 있는 체크 항목 (checks)의 수준에 달려 있습니다. 새로운 취약점에 대한 규칙이 없다면 스캐너는 이를 잡아낼 수 없습니다. Arsenal은 가장 흔한 패턴들로 시작하며, 귀하는 자신의 필요에 따라 도메인 특화된 체크 항목을 추가할 수 있습니다.
용어 사전 (Glossary)
- Nuclei template — 대상에서 무엇을 찾을지에 대한 YAML 선언.
- Check — 단일 탐지 규칙 (하나의
.yaml파일). - Pack —
.fwpack으로 묶인 체크 항목들의 집합. - Allowlist — 스캐너가 사용할 수 있도록 허용된 도구 및 대상의 목록으로, 소유자가 편집 가능함.
- Category —
immune(자신의 코드를 스캔), 또는pentest(승인된 외부 대상을 스캔). - Finding — 스캔에 의해 탐지된 이슈로, 심각도와 컨텍스트를 포함함.
- Arsenal — 사용 가능한 모든 도구 및 체크 항목의 카탈로그.
Threat Radar는 실행 중인 것을 볼 수 없다면 셀프 호스팅 (self-hosted) AI가 안전하지 않기 때문에 존재합니다. 이를 사용하십시오.
Flowork는 오픈 소스입니다 — 두 제품 모두:
- 🤖 Flowork Agent (자체 호스팅 에이전트 OS): [https://github.com/flowork-os/Flowork_Agent]
- 🛣️ Flow Router (주권형 LLM 게이트웨이): [https://github.com/flowork-os/flowork_Router]
💬 Telegram에서 Flowork 커뮤니티에 참여하세요: [https://t.me/+55oqrk75lc43YWE1]
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기