Sign In

보안 개요

Clawdbot의 보안 모델과 샌드박스 시스템 설명

🔒 보안 아키텍처

┌─────────────────────────────────────────────────────────────────────┐
│                        외부 위협                            │
│                      (악의적 프롬프트)                   │
└─────────────┬───────────────────────────────────────────────────┘
              │
              ▼
     ┌────────────────┐
     │   보안 계층   │
     └────┬────┬─────┘
          │     │
     ┌────┴────┐  ┌──────┴──────────┐
     │ DM 페어링 │  │   샌드박스      │
     │   정책   │  │  (Docker)      │
     └──────────┘  └─────┬──────────┘
                    │
                    ▼
          ┌──────────────────────┐
          │   권한 시스템      │
          └────────┬───────────┘
                   │
         ┌───────────┼──────────┐
         ▼           ▼           ▼
    ┌────────┐ ┌────────┐ ┌────────┐
    │ 브라우저│ │  Canvas │ │  노드 │
    │ 자동화  │ │  A2UI   │ │ 제어  │
    └────────┘ └────────┘ └────────┘

🔑 보안 레이어

1. 네트워크 계층

위협
방어 기법
구현
중간자 공격
TLS 암호화
gateway.tls.enabled
DNS 스푸핑
Tailscale 통합
gateway.tailscale
비인가 접속
인증 (password/token)
gateway.auth.mode
원격 접속
SSH 터널, 포트 제한
gateway.port, gateway.bind

2. 애플리케이션 계층

위협
방어 기법
구현
악의적 메시지
DM 페어링
channels.*.dmPolicy
그룹 스팸
멘션 모드
channels.*.groupPolicy.mode
코드 실행 공격
샌드박스 격리
sandbox.mode
권한 에스컬레이션
도구 권한 시스템
sandbox.allowlist/denylist

3. 데이터 계층

위협
방어 기법
구현
데이터 유출
로컬 저장 우선
기본 동작
중간 서버 노출
직접 LLM 통신
기본 동작
메모리 유출
세션 격리
agents.bindings

🎫 DM 페어링 (Pairing)

개요

새로운 DM 발신자를 승인하는 메커니즘입니다.

작동 방식

1. 알 수 없는 발신자가 메시지 전송

2. Gateway가 짧은 페어링 코드 생성
   예: "pairing-code-ABC123"

3. 발신자에게 코드가 포함된 응답 전송
   "알 수 없는 발신자입니다.
    페어링 코드: pairing-code-ABC123"

4. 사용자가 CLI에서 승인
   clawdbot pairing approve whatsapp pairing-code-ABC123

5. 발신자가 로컬 allowlist에 추가
   .clawdbot/channels/whatsapp/allowlist.json:
   ["+9876543210"]

6. 이후 메시지가 정상 처리됨

설정

{
  channels: {
    whatsapp: {
      dmPolicy: "pairing",  // 또는 "open"
      allowFrom: ["+1234567890", "*"]  // "*": 모든 연결 허용
    },
    discord: {
      dm: {
        policy: "pairing",
        allowFrom: ["1234567890123456789", "*"]
      }
    }
  }
}

장점

✅ 알 수 없는 발신자를 방지
✅ 페어링 코드로 1회 승인
✅ allowlist 관리로 쉬운 접근 제어
✅ 여러 발신자 동시 승인 가능

🐳 Docker 샌드박스

개요

비-main 세션(그룹, 공개 DM)에서 잠재적인 코드 실행을 방지하기 위해 Docker 컨테이너를 사용합니다.

샌드박스 모드

모드
설명
대상 세션
none
샌드박스 비활성화
모든 세션
non-main
비-main 세션만 샌드박스
그룹, 공개 DM
all
모든 세션 샌드박스
모든 세션

설정

{
  sandbox: {
    mode: "non-main",
    allowlist: [
      "bash",           // 쉘 명령 실행
      "process",        // 프로세스 정보
      "read",           // 파일 읽기
      "write",          // 파일 쓰기
      "edit",          // 파일 편집
      "sessions_list",  // 세션 목록 조회
      "sessions_history" // 세션 기록 조회
    ],
    denylist: [
      "browser",        // 브라우저 자동화
      "canvas",         // 캔버스 제어
      "nodes",          // 디바이스 노드
      "cron",          // 크론 작업
      "discord",        // Discord 액션
      "slack",          // Slack 액션
      "gateway"        // Gateway 제어
    ]
  }
}

샌드박스 동작

// 샌드박스 실행 로직
async function runInSandbox(tool: string, params: any, session: Session) {
  if (session.isMain) {
    // main 세션은 호스트에서 직접 실행
    return await executeTool(tool, params);
  }

  // 비-main 세션은 Docker 컨테이너에서 실행
  if (!sandbox.allowlist.includes(tool)) {
    throw new Error(`Tool ${tool} not in allowlist`);
  }

  if (sandbox.denylist.includes(tool)) {
    throw new Error(`Tool ${tool} in denylist`);
  }

  // Docker 컨테이너 실행
  return await executeInDocker(tool, params, session.workspace);
}

Docker 이미지

# 샌드박스 Docker 이미지 (개념)
FROM node:22-alpine

# 필요한 의존성만 설치
RUN apk add --no-cache git curl bash

# 작업 디렉토리
WORKDIR /workspace

# 샌드박스 실행
ENTRYPOINT ["node", "/usr/local/bin/clawdbot-sandbox"]

장점

✅ 호스트 파일 시스템 격리
✅ 악의적 코드 실행 방지
✅ 리소스 사용 제한
✅ 세션별 격리

🔐 인증 및 권한

Gateway 인증

모드
설명
설정
password
비밀번호 기반 인증
gateway.auth.password
token
토큰 기반 인증
gateway.auth.token
none
인증 비활성화 (로컬 전용)
gateway.auth.mode = "none"

인증 예시

{
  gateway: {
    auth: {
      mode: "password",  // 또는 "token", "none"
      password: "secure-password"  // mode="password" 시 필요
      // 또는
      // token: "auth-token-xyz123"  // mode="token" 시 필요
    }
  }
}

TLS 설정

{
  gateway: {
    tls: {
      enabled: true,
      certPath: "~/.clawdbot/gateway/cert.pem",
      keyPath: "~/.clawdbot/gateway/key.pem",
      caPath: "~/.clawdbot/gateway/ca.pem",  // 선택적
      autoGenerate: true  // 자체 서명 인증서 자동 생성
    }
  }
}

Tailscale 통합

{
  gateway: {
    tailscale: {
      enabled: true,
      allowTailscale: true  // Tailscale IP 자동 인증 허용
    }
  }
}

🔒 권한 시스템

도구 권한

// 도구 권한 체크
interface ToolPermission {
  tool: string;
  allowed: boolean;
  reason?: string;
}

// 권한 검사 로직
function checkPermission(tool: string, session: Session): boolean {
  if (session.isMain) {
    return true;  // main 세션은 모든 도구 허용
  }

  if (sandbox.mode === 'non-main') {
    return sandbox.allowlist.includes(tool);
  }

  return false;
}

권한 그룹

그룹
포함 도구
비-Main 허용
파일
read, write, edit, list, delete
프로세스
process, bash
세션
sessions_list, sessions_history
브라우저
browser.*
Canvas
canvas.*
노드
camera.*, screen.*, location.*
자동화
cron.*, webhook.*
Gateway
gateway.*
채널
discord.*, slack.*

🛡 보안 베스트 프랙티스

1. 권장 설정

{
  // Gateway 보안
  gateway: {
    auth: {
      mode: "password"  // 비밀번호 인증 권장
    },
    tls: {
      enabled: true,  // TLS 활성화 권장
      autoGenerate: true
    },
    bind: "loopback"  // 루프백만 바인드 권장
  },

  // 채널 DM 정책
  channels: {
    whatsapp: {
      dmPolicy: "pairing",  // 페어링 권장
      groupPolicy: {
        mode: "mention"  // 멘션 모드 권장
      }
    }
  },

  // 샌드박스
  sandbox: {
    mode: "non-main",  // 비-main 세션만 샌드박스
    denylist: [
      // 위험한 도구는 비-Main에서 거부
      "browser",
      "canvas",
      "nodes",
      "cron",
      "discord",
      "slack",
      "gateway"
    ]
  }
}

2. 보안 체크리스트

✅ [ ] Gateway 인증 활성화되어 있는가?
✅ [ ] TLS가 활성화되어 있는가?
✅ [ ] DM 정책이 pairing으로 설정되어 있는가?
✅ [ ] 샌드박스가 활성화되어 있는가?
✅ [ ] 위험한 도구가 denylist에 있는가?
✅ [ ] 로그 파일 권한이 제한되어 있는가?

3. 정기적 보안 점검

# 보안 설정 확인
clawdbot config get gateway.auth.mode
clawdbot config get gateway.tls.enabled
clawdbot config get channels.*.dmPolicy
clawdbot config get sandbox.mode

# 로그 검사
clawdbot logs gateway --follow | grep -i "auth\|denied\|error"

🔗 관련 문서