보안 🔒
[!WARNING] 개인 비서 신뢰 모델: 이 가이드는 게이트웨이당 하나의 신뢰할 수 있는 운영자 경계(단일 사용자/개인 비서 모델)를 가정합니다. OpenClaw는 여러 적대적 사용자가 하나의 에이전트/게이트웨이를 공유하는 적대적 다중 테넌트 보안 경계가 아닙니다. 혼합 신뢰 또는 적대적 사용자 운영이 필요한 경우, 신뢰 경계를 분리하세요 (별도 게이트웨이 + 인증 정보, 이상적으로는 별도 OS 사용자/호스트).
범위 우선: 개인 비서 보안 모델
OpenClaw 보안 가이드는 개인 비서 배포를 가정합니다: 하나의 신뢰할 수 있는 운영자 경계, 잠재적으로 여러 에이전트.
- 지원되는 보안 태세: 게이트웨이당 하나의 사용자/신뢰 경계 (경계당 하나의 OS 사용자/호스트/VPS 선호).
- 지원되지 않는 보안 경계: 상호 신뢰할 수 없거나 적대적인 사용자가 사용하는 하나의 공유 게이트웨이/에이전트.
- 적대적 사용자 격리가 필요하면, 신뢰 경계별로 분리하세요 (별도 게이트웨이 + 인증 정보, 이상적으로는 별도 OS 사용자/호스트).
- 여러 신뢰할 수 없는 사용자가 하나의 도구 지원 에이전트에 메시지를 보낼 수 있다면, 해당 에이전트에 대해 동일한 위임된 도구 권한을 공유하는 것으로 취급하세요.
이 페이지는 해당 모델 내에서의 보안 강화를 설명합니다. 하나의 공유 게이트웨이에서 적대적 다중 테넌트 격리를 주장하지 않습니다.
빠른 확인: openclaw security audit
참고: 형식 검증 (보안 모델)
정기적으로 실행하세요 (특히 설정 변경이나 네트워크 표면 노출 후):
openclaw security audit
openclaw security audit --deep
openclaw security audit --fix
openclaw security audit --json
일반적인 실수를 표시합니다 (게이트웨이 인증 노출, 브라우저 제어 노출, 엘리베이티드 허용 목록, 파일시스템 권한).
OpenClaw는 제품이자 실험입니다: 프런티어 모델 동작을 실제 메시징 표면과 실제 도구에 연결합니다. “완벽하게 안전한” 설정은 없습니다. 목표는 다음에 대해 의도적으로 판단하는 것입니다:
- 누가 봇과 대화할 수 있는지
- 봇이 어디서 행동할 수 있는지
- 봇이 무엇을 건드릴 수 있는지
작동하는 가장 작은 접근 권한으로 시작한 후, 신뢰가 쌓이면 확대하세요.
배포 가정 (중요)
OpenClaw는 호스트와 설정 경계를 신뢰합니다:
- 게이트웨이 호스트 상태/설정(
~/.openclaw,openclaw.json포함)을 수정할 수 있는 사람은 신뢰할 수 있는 운영자로 취급하세요. - 상호 신뢰할 수 없는/적대적인 여러 운영자를 위해 하나의 게이트웨이를 실행하는 것은 권장 설정이 아닙니다.
- 혼합 신뢰 팀의 경우, 별도 게이트웨이(또는 최소한 별도 OS 사용자/호스트)로 신뢰 경계를 분리하세요.
- OpenClaw는 한 머신에서 여러 게이트웨이 인스턴스를 실행할 수 있지만, 권장 운영은 깨끗한 신뢰 경계 분리를 선호합니다.
- 권장 기본값: 머신/호스트(또는 VPS)당 하나의 사용자, 해당 사용자를 위한 하나의 게이트웨이, 해당 게이트웨이 내 하나 이상의 에이전트.
- 여러 사용자가 OpenClaw를 원하면, 사용자당 하나의 VPS/호스트를 사용하세요.
실제적 결과 (운영자 신뢰 경계)
하나의 게이트웨이 인스턴스 내에서 인증된 운영자 접근은 신뢰할 수 있는 제어 평면 역할이며, 사용자별 테넌트 역할이 아닙니다.
- 읽기/제어 평면 접근 권한을 가진 운영자는 설계상 게이트웨이 세션 메타데이터/히스토리를 검사할 수 있습니다.
- 세션 식별자(
sessionKey, 세션 ID, 레이블)는 라우팅 선택자이며, 인증 토큰이 아닙니다. - 예:
sessions.list,sessions.preview,chat.history와 같은 메서드에 대해 운영자별 격리를 기대하는 것은 이 모델의 범위 밖입니다. - 적대적 사용자 격리가 필요하면, 신뢰 경계별로 별도 게이트웨이를 실행하세요.
- 한 머신에서 여러 게이트웨이를 운영하는 것은 기술적으로 가능하지만, 다중 사용자 격리를 위한 권장 기준은 아닙니다.
개인 비서 모델 (다중 테넌트 버스가 아님)
OpenClaw는 개인 비서 보안 모델로 설계되었습니다: 하나의 신뢰할 수 있는 운영자 경계, 잠재적으로 여러 에이전트.
- 여러 사람이 하나의 도구 지원 에이전트에 메시지를 보낼 수 있으면, 각자가 동일한 권한 세트를 조종할 수 있습니다.
- 사용자별 세션/메모리 격리는 프라이버시에 도움이 되지만, 공유 에이전트를 사용자별 호스트 권한 부여로 전환하지는 않습니다.
- 사용자 간에 적대적 관계가 있으면, 신뢰 경계별로 별도 게이트웨이(또는 별도 OS 사용자/호스트)를 실행하세요.
공유 Slack 워크스페이스: 실제 위험
“Slack의 모든 사람이 봇에 메시지를 보낼 수 있다”면, 핵심 위험은 위임된 도구 권한입니다:
- 허용된 모든 발신자가 에이전트 정책 내에서 도구 호출(
exec, 브라우저, 네트워크/파일 도구)을 유도할 수 있음; - 한 발신자의 프롬프트/콘텐츠 인젝션이 공유 상태, 디바이스 또는 출력에 영향을 미치는 작업을 유발할 수 있음;
- 공유 에이전트에 민감한 인증 정보/파일이 있으면, 허용된 모든 발신자가 도구 사용을 통해 잠재적으로 유출을 유도할 수 있음.
팀 워크플로우에는 최소한의 도구를 가진 별도 에이전트/게이트웨이를 사용하세요. 개인 데이터 에이전트는 비공개로 유지하세요.
회사 공유 에이전트: 허용되는 패턴
해당 에이전트를 사용하는 모든 사람이 동일한 신뢰 경계(예: 하나의 회사 팀)에 있고 에이전트가 엄격히 업무 범위인 경우에 허용됩니다.
- 전용 머신/VM/컨테이너에서 실행;
- 해당 런타임에 전용 OS 사용자 + 전용 브라우저/프로필/계정 사용;
- 해당 런타임에 개인 Apple/Google 계정이나 개인 비밀번호 관리자/브라우저 프로필에 로그인하지 마세요.
개인 ID와 회사 ID를 동일한 런타임에서 혼합하면, 분리가 무너지고 개인 데이터 노출 위험이 증가합니다.
게이트웨이와 노드 신뢰 개념
게이트웨이와 노드를 하나의 운영자 신뢰 도메인으로 취급하되, 역할이 다릅니다:
- 게이트웨이는 제어 평면이자 정책 표면입니다 (
gateway.auth, 도구 정책, 라우팅). - 노드는 해당 게이트웨이에 페어링된 원격 실행 표면입니다 (명령, 디바이스 작업, 호스트 로컬 기능).
- 게이트웨이에 인증된 호출자는 게이트웨이 범위에서 신뢰됩니다. 페어링 후 노드 작업은 해당 노드에서의 신뢰할 수 있는 운영자 작업입니다.
sessionKey는 라우팅/컨텍스트 선택이며, 사용자별 인증이 아닙니다.- 실행 승인(허용 목록 + 확인)은 운영자 의도에 대한 가드레일이며, 적대적 다중 테넌트 격리가 아닙니다.
- 실행 승인은 정확한 요청 컨텍스트와 최선 노력의 직접 로컬 파일 피연산자를 바인딩합니다. 모든 런타임/인터프리터 로더 경로를 의미적으로 모델링하지는 않습니다. 강력한 경계를 위해서는 샌드박싱과 호스트 격리를 사용하세요.
적대적 사용자 격리가 필요하면, OS 사용자/호스트별로 신뢰 경계를 분리하고 별도 게이트웨이를 실행하세요.
신뢰 경계 매트릭스
위험을 분류할 때 이 빠른 모델을 사용하세요:
| 경계 또는 제어 | 의미 | 일반적인 오독 |
|---|---|---|
gateway.auth (토큰/비밀번호/디바이스 인증) | 게이트웨이 API에 대한 호출자 인증 | ”안전하려면 모든 프레임에 메시지별 서명이 필요함” |
sessionKey | 컨텍스트/세션 선택을 위한 라우팅 키 | ”세션 키가 사용자 인증 경계임” |
| 프롬프트/콘텐츠 가드레일 | 모델 남용 위험 감소 | ”프롬프트 인젝션만으로 인증 우회가 증명됨” |
canvas.eval / 브라우저 evaluate | 활성화 시 의도적 운영자 기능 | ”JS eval 프리미티브는 이 신뢰 모델에서 자동으로 취약점” |
로컬 TUI ! 셸 | 명시적 운영자 트리거 로컬 실행 | ”로컬 셸 편의 명령이 원격 인젝션” |
| 노드 페어링 및 노드 명령 | 페어링된 디바이스에서의 운영자 수준 원격 실행 | ”원격 디바이스 제어는 기본적으로 신뢰할 수 없는 사용자 접근으로 취급해야 함” |
설계상 취약점이 아닌 것
다음 패턴은 일반적으로 보고되며, 실제 경계 우회가 표시되지 않는 한 보통 조치 없이 종료됩니다:
- 정책/인증/샌드박스 우회 없이 프롬프트 인젝션만으로 구성된 체인.
- 하나의 공유 호스트/설정에서 적대적 다중 테넌트 운영을 가정하는 주장.
- 공유 게이트웨이 설정에서 일반 운영자 읽기 경로 접근(예:
sessions.list/sessions.preview/chat.history)을 IDOR로 분류하는 주장. - 로컬호스트 전용 배포 발견 (예: 루프백 전용 게이트웨이에서 HSTS).
- 이 저장소에 존재하지 않는 인바운드 경로에 대한 Discord 인바운드 웹훅 서명 발견.
sessionKey를 인증 토큰으로 취급하는 “사용자별 권한 부여 누락” 발견.
연구자 사전 검증 체크리스트
GHSA를 열기 전에 다음을 모두 확인하세요:
- 재현이 최신
main또는 최신 릴리스에서 여전히 작동함. - 보고서에 정확한 코드 경로(
file, 함수, 라인 범위)와 테스트된 버전/커밋이 포함됨. - 영향이 문서화된 신뢰 경계를 넘음 (프롬프트 인젝션만이 아님).
- 주장이 범위 밖에 나열되지 않음.
- 중복에 대해 기존 권고가 확인됨 (해당 시 정규 GHSA 재사용).
- 배포 가정이 명시적 (루프백/로컬 vs 노출, 신뢰할 수 있는 vs 신뢰할 수 없는 운영자).
60초 강화 기본 설정
이 기본 설정을 먼저 사용한 후, 신뢰할 수 있는 에이전트별로 선택적으로 도구를 다시 활성화하세요:
{
gateway: {
mode: "local",
bind: "loopback",
auth: { mode: "token", token: "replace-with-long-random-token" },
},
session: {
dmScope: "per-channel-peer",
},
tools: {
profile: "messaging",
deny: ["group:automation", "group:runtime", "group:fs", "sessions_spawn", "sessions_send"],
fs: { workspaceOnly: true },
exec: { security: "deny", ask: "always" },
elevated: { enabled: false },
},
channels: {
whatsapp: { dmPolicy: "pairing", groups: { "*": { requireMention: true } } },
},
}
게이트웨이를 로컬 전용으로 유지하고, DM을 격리하며, 제어 평면/런타임 도구를 기본적으로 비활성화합니다.
공유 수신함 빠른 규칙
봇에 DM을 보낼 수 있는 사람이 한 명 이상이면:
session.dmScope: "per-channel-peer"(또는 다중 계정 채널의 경우"per-account-channel-peer")를 설정하세요.dmPolicy: "pairing"또는 엄격한 허용 목록을 유지하세요.- 공유 DM과 광범위한 도구 접근을 절대 결합하지 마세요.
- 이는 협력적/공유 수신함을 강화하지만, 호스트/설정 쓰기 접근을 공유하는 사용자 간의 적대적 공동 테넌트 격리로 설계되지 않았습니다.
감사가 확인하는 사항 (상위 수준)
- 인바운드 접근 (DM 정책, 그룹 정책, 허용 목록): 낯선 사람이 봇을 트리거할 수 있는지?
- 도구 폭발 반경 (엘리베이티드 도구 + 개방된 방): 프롬프트 인젝션이 셸/파일/네트워크 작업으로 전환될 수 있는지?
- 네트워크 노출 (게이트웨이 바인딩/인증, Tailscale Serve/Funnel, 약한/짧은 인증 토큰).
- 브라우저 제어 노출 (원격 노드, 릴레이 포트, 원격 CDP 엔드포인트).
- 로컬 디스크 위생 (권한, 심볼릭 링크, 설정 포함, “동기화된 폴더” 경로).
- 플러그인 (명시적 허용 목록 없이 확장이 존재).
- 정책 드리프트/설정 오류 (샌드박스 모드가 꺼져 있는데 샌드박스 Docker 설정이 구성됨; 매칭이 정확한 명령 이름 전용(예:
system.run)이고 셸 텍스트를 검사하지 않아 비효과적인gateway.nodes.denyCommands패턴; 위험한gateway.nodes.allowCommands항목; 에이전트별 프로필로 재정의된 전역tools.profile="minimal"; 허용적 도구 정책에서 도달 가능한 확장 플러그인 도구). - 런타임 기대 드리프트 (예: 샌드박스 모드가 꺼져 있는데
tools.exec.host="sandbox", 게이트웨이 호스트에서 직접 실행됨). - 모델 위생 (설정된 모델이 레거시로 보일 때 경고; 하드 차단은 아님).
--deep을 실행하면, OpenClaw는 최선 노력의 라이브 게이트웨이 프로브도 시도합니다.
인증 정보 저장 맵
접근 감사 또는 백업 대상 결정 시 사용하세요:
- WhatsApp:
~/.openclaw/credentials/whatsapp/<accountId>/creds.json - Telegram 봇 토큰: 설정/환경 변수 또는
channels.telegram.tokenFile(일반 파일만; 심볼릭 링크 거부) - Discord 봇 토큰: 설정/환경 변수 또는 SecretRef (env/file/exec 프로바이더)
- Slack 토큰: 설정/환경 변수 (
channels.slack.*) - 페어링 허용 목록:
~/.openclaw/credentials/<channel>-allowFrom.json(기본 계정)~/.openclaw/credentials/<channel>-<accountId>-allowFrom.json(비기본 계정)
- 모델 인증 프로필:
~/.openclaw/agents/<agentId>/agent/auth-profiles.json - 파일 기반 시크릿 페이로드 (선택):
~/.openclaw/secrets.json - 레거시 OAuth 가져오기:
~/.openclaw/credentials/oauth.json
보안 감사 체크리스트
감사에서 발견 사항이 출력되면, 다음 우선순위로 처리하세요:
- “open” + 도구 활성화: DM/그룹을 먼저 잠그고 (페어링/허용 목록), 그 다음 도구 정책/샌드박싱을 강화하세요.
- 공개 네트워크 노출 (LAN 바인딩, Funnel, 인증 누락): 즉시 수정.
- 브라우저 제어 원격 노출: 운영자 접근과 동일하게 취급 (Tailnet 전용, 의도적 노드 페어링, 공개 노출 방지).
- 권한: 상태/설정/인증 정보/인증이 그룹/전체 읽기 가능하지 않은지 확인.
- 플러그인/확장: 명시적으로 신뢰하는 것만 로드.
- 모델 선택: 도구를 사용하는 봇에는 최신의 명령어 강화된 모델을 선호.
보안 감사 용어집
실제 배포에서 가장 자주 볼 수 있는 주요 checkId 값 (전체 목록은 아님):
checkId | 심각도 | 중요한 이유 | 주요 수정 키/경로 | 자동 수정 |
|---|---|---|---|---|
fs.state_dir.perms_world_writable | critical | 다른 사용자/프로세스가 전체 OpenClaw 상태를 수정할 수 있음 | ~/.openclaw의 파일시스템 권한 | 예 |
fs.config.perms_writable | critical | 다른 사람이 인증/도구 정책/설정을 변경할 수 있음 | ~/.openclaw/openclaw.json의 파일시스템 권한 | 예 |
fs.config.perms_world_readable | critical | 설정이 토큰/설정을 노출할 수 있음 | 설정 파일의 파일시스템 권한 | 예 |
gateway.bind_no_auth | critical | 공유 시크릿 없이 원격 바인딩 | gateway.bind, gateway.auth.* | 아니오 |
gateway.loopback_no_auth | critical | 리버스 프록시된 루프백이 인증 없이 될 수 있음 | gateway.auth.*, 프록시 설정 | 아니오 |
gateway.http.no_auth | warn/critical | auth.mode="none"으로 게이트웨이 HTTP API 도달 가능 | gateway.auth.mode, gateway.http.endpoints.* | 아니오 |
gateway.tools_invoke_http.dangerous_allow | warn/critical | HTTP API를 통해 위험한 도구 다시 활성화 | gateway.tools.allow | 아니오 |
gateway.nodes.allow_commands_dangerous | warn/critical | 영향이 큰 노드 명령 활성화 (카메라/화면/연락처/캘린더/SMS) | gateway.nodes.allowCommands | 아니오 |
gateway.tailscale_funnel | critical | 공개 인터넷 노출 | gateway.tailscale.mode | 아니오 |
gateway.control_ui.allowed_origins_required | critical | 명시적 브라우저 오리진 허용 목록 없이 비루프백 Control UI | gateway.controlUi.allowedOrigins | 아니오 |
gateway.control_ui.host_header_origin_fallback | warn/critical | Host-header 오리진 대체 활성화 (DNS 리바인딩 강화 수준 하락) | gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback | 아니오 |
gateway.control_ui.insecure_auth | warn | 비보안 인증 호환성 토글 활성화 | gateway.controlUi.allowInsecureAuth | 아니오 |
gateway.control_ui.device_auth_disabled | critical | 디바이스 ID 검사 비활성화 | gateway.controlUi.dangerouslyDisableDeviceAuth | 아니오 |
gateway.real_ip_fallback_enabled | warn/critical | X-Real-IP 대체를 신뢰하면 프록시 설정 오류로 소스 IP 스푸핑 가능 | gateway.allowRealIpFallback, gateway.trustedProxies | 아니오 |
discovery.mdns_full_mode | warn/critical | mDNS 풀 모드가 로컬 네트워크에 cliPath/sshPort 메타데이터 광고 | discovery.mdns.mode, gateway.bind | 아니오 |
config.insecure_or_dangerous_flags | warn | 비보안/위험 디버그 플래그 활성화 | 여러 키 (발견 세부 정보 참고) | 아니오 |
hooks.token_too_short | warn | 훅 인그레스에 대한 쉬운 무차별 대입 | hooks.token | 아니오 |
hooks.request_session_key_enabled | warn/critical | 외부 호출자가 sessionKey를 선택할 수 있음 | hooks.allowRequestSessionKey | 아니오 |
hooks.request_session_key_prefixes_missing | warn/critical | 외부 세션 키 형태에 대한 제한 없음 | hooks.allowedSessionKeyPrefixes | 아니오 |
logging.redact_off | warn | 민감한 값이 로그/상태에 누출 | logging.redactSensitive | 예 |
sandbox.docker_config_mode_off | warn | 샌드박스 Docker 설정이 존재하지만 비활성 | agents.*.sandbox.mode | 아니오 |
sandbox.dangerous_network_mode | critical | 샌드박스 Docker 네트워크가 host 또는 container:* 네임스페이스 합류 모드 | agents.*.sandbox.docker.network | 아니오 |
tools.exec.host_sandbox_no_sandbox_defaults | warn | 샌드박스 꺼져 있을 때 exec host=sandbox가 호스트 exec로 해석 | tools.exec.host, agents.defaults.sandbox.mode | 아니오 |
tools.exec.host_sandbox_no_sandbox_agents | warn | 에이전트별 exec host=sandbox가 샌드박스 꺼져 있을 때 호스트 exec로 해석 | agents.list[].tools.exec.host, agents.list[].sandbox.mode | 아니오 |
tools.exec.safe_bins_interpreter_unprofiled | warn | 명시적 프로필 없이 safeBins의 인터프리터/런타임 바이너리가 exec 위험 확대 | tools.exec.safeBins, tools.exec.safeBinProfiles, agents.list[].tools.exec.* | 아니오 |
skills.workspace.symlink_escape | warn | 작업 공간 skills/**/SKILL.md가 작업 공간 루트 밖으로 해석 (심볼릭 링크) | 작업 공간 skills/** 파일시스템 상태 | 아니오 |
security.exposure.open_groups_with_elevated | critical | 개방 그룹 + 엘리베이티드 도구가 고영향 프롬프트 인젝션 경로 생성 | channels.*.groupPolicy, tools.elevated.* | 아니오 |
security.exposure.open_groups_with_runtime_or_fs | critical/warn | 개방 그룹이 샌드박스/작업 공간 가드 없이 명령/파일 도구에 도달 가능 | channels.*.groupPolicy, tools.profile/deny, tools.fs.workspaceOnly, agents.*.sandbox.mode | 아니오 |
security.trust_model.multi_user_heuristic | warn | 게이트웨이 신뢰 모델이 개인 비서인데 설정이 다중 사용자로 보임 | 신뢰 경계 분리 또는 공유 사용자 강화 | 아니오 |
tools.profile_minimal_overridden | warn | 에이전트 재정의가 전역 minimal 프로필을 우회 | agents.list[].tools.profile | 아니오 |
plugins.tools_reachable_permissive_policy | warn | 허용적 컨텍스트에서 확장 도구 도달 가능 | tools.profile + 도구 허용/거부 | 아니오 |
models.small_params | critical/info | 소형 모델 + 안전하지 않은 도구 표면이 인젝션 위험 증가 | 모델 선택 + 샌드박스/도구 정책 | 아니오 |
HTTP를 통한 Control UI
Control UI는 디바이스 ID를 생성하기 위해 보안 컨텍스트 (HTTPS 또는 localhost)가 필요합니다.
gateway.controlUi.allowInsecureAuth는 로컬 호환성 토글입니다:
- localhost에서 페이지가 비보안 HTTP로 로드될 때 디바이스 ID 없이 Control UI 인증을 허용합니다.
- 페어링 확인을 우회하지 않습니다.
- 원격(비localhost) 디바이스 ID 요구사항을 완화하지 않습니다.
HTTPS(Tailscale Serve) 또는 127.0.0.1에서 UI를 여는 것을 선호하세요.
긴급 상황에서만, gateway.controlUi.dangerouslyDisableDeviceAuth가 디바이스 ID 검사를 완전히 비활성화합니다. 이는 심각한 보안 수준 하락입니다. 적극적으로 디버깅 중이고 빠르게 되돌릴 수 있는 경우에만 사용하세요.
openclaw security audit는 이 설정이 활성화되면 경고합니다.
비보안 또는 위험한 플래그 요약
openclaw security audit는 알려진 비보안/위험 디버그 스위치가 활성화되면 config.insecure_or_dangerous_flags를 포함합니다. 현재 해당 검사가 집계하는 항목:
gateway.controlUi.allowInsecureAuth=truegateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=truegateway.controlUi.dangerouslyDisableDeviceAuth=truehooks.gmail.allowUnsafeExternalContent=truehooks.mappings[<index>].allowUnsafeExternalContent=truetools.exec.applyPatch.workspaceOnly=false
OpenClaw 설정 스키마에 정의된 전체 dangerous* / dangerously* 설정 키:
gateway.controlUi.dangerouslyAllowHostHeaderOriginFallbackgateway.controlUi.dangerouslyDisableDeviceAuthbrowser.ssrfPolicy.dangerouslyAllowPrivateNetworkchannels.discord.dangerouslyAllowNameMatchingchannels.discord.accounts.<accountId>.dangerouslyAllowNameMatchingchannels.slack.dangerouslyAllowNameMatchingchannels.slack.accounts.<accountId>.dangerouslyAllowNameMatchingchannels.googlechat.dangerouslyAllowNameMatchingchannels.googlechat.accounts.<accountId>.dangerouslyAllowNameMatchingchannels.msteams.dangerouslyAllowNameMatchingchannels.zalouser.dangerouslyAllowNameMatching(확장 채널)channels.irc.dangerouslyAllowNameMatching(확장 채널)channels.irc.accounts.<accountId>.dangerouslyAllowNameMatching(확장 채널)channels.mattermost.dangerouslyAllowNameMatching(확장 채널)channels.mattermost.accounts.<accountId>.dangerouslyAllowNameMatching(확장 채널)agents.defaults.sandbox.docker.dangerouslyAllowReservedContainerTargetsagents.defaults.sandbox.docker.dangerouslyAllowExternalBindSourcesagents.defaults.sandbox.docker.dangerouslyAllowContainerNamespaceJoinagents.list[<index>].sandbox.docker.dangerouslyAllowReservedContainerTargetsagents.list[<index>].sandbox.docker.dangerouslyAllowExternalBindSourcesagents.list[<index>].sandbox.docker.dangerouslyAllowContainerNamespaceJoin
리버스 프록시 설정
게이트웨이를 리버스 프록시(nginx, Caddy, Traefik 등) 뒤에서 실행하는 경우, 올바른 클라이언트 IP 감지를 위해 gateway.trustedProxies를 설정해야 합니다.
게이트웨이가 trustedProxies에 없는 주소에서 프록시 헤더를 감지하면, 해당 연결을 로컬 클라이언트로 취급하지 않습니다. 게이트웨이 인증이 비활성화된 경우, 해당 연결은 거부됩니다. 이는 프록시된 연결이 localhost에서 온 것처럼 보여 자동 신뢰를 받는 인증 우회를 방지합니다.
gateway:
trustedProxies:
- "127.0.0.1" # 프록시가 localhost에서 실행되는 경우
# 선택. 기본값 false.
# 프록시가 X-Forwarded-For를 제공할 수 없는 경우에만 활성화.
allowRealIpFallback: false
auth:
mode: password
password: ${OPENCLAW_GATEWAY_PASSWORD}
trustedProxies가 설정되면, 게이트웨이는 X-Forwarded-For를 사용하여 클라이언트 IP를 결정합니다. X-Real-IP는 gateway.allowRealIpFallback: true가 명시적으로 설정되지 않는 한 기본적으로 무시됩니다.
올바른 리버스 프록시 동작 (들어오는 포워딩 헤더 덮어쓰기):
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Real-IP $remote_addr;
잘못된 리버스 프록시 동작 (신뢰할 수 없는 포워딩 헤더 추가/보존):
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
HSTS 및 오리진 참고
- OpenClaw 게이트웨이는 로컬/루프백 우선입니다. 리버스 프록시에서 TLS를 종단하는 경우, 프록시 대상 HTTPS 도메인에 HSTS를 설정하세요.
- 게이트웨이 자체가 HTTPS를 종단하는 경우,
gateway.http.securityHeaders.strictTransportSecurity를 설정하여 OpenClaw 응답에서 HSTS 헤더를 생성할 수 있습니다. - 자세한 배포 가이드는 신뢰할 수 있는 프록시 인증에 있습니다.
- 비루프백 Control UI 배포에서는 기본적으로
gateway.controlUi.allowedOrigins가 필수입니다. gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true는 Host-header 오리진 대체 모드를 활성화합니다. 위험한 운영자 선택 정책으로 취급하세요.- DNS 리바인딩 및 프록시 호스트 헤더 동작을 배포 강화 관심사로 취급하세요.
trustedProxies를 타이트하게 유지하고 게이트웨이를 공개 인터넷에 직접 노출하지 마세요.
로컬 세션 로그는 디스크에 저장됨
OpenClaw는 ~/.openclaw/agents/<agentId>/sessions/*.jsonl에 세션 기록을 디스크에 저장합니다.
이는 세션 연속성과 (선택적으로) 세션 메모리 인덱싱에 필요하지만, 파일시스템 접근 권한이 있는 모든 프로세스/사용자가 해당 로그를 읽을 수 있다는 것을 의미합니다. 디스크 접근을 신뢰 경계로 취급하고 ~/.openclaw에 대한 권한을 잠그세요 (아래 감사 섹션 참고). 에이전트 간 더 강력한 격리가 필요하면, 별도 OS 사용자 또는 별도 호스트에서 실행하세요.
노드 실행 (system.run)
macOS 노드가 페어링된 경우, 게이트웨이는 해당 노드에서 system.run을 호출할 수 있습니다. 이는 Mac에서의 원격 코드 실행입니다:
- 노드 페어링(승인 + 토큰)이 필요합니다.
- Mac에서 설정 → 실행 승인 (보안 + 확인 + 허용 목록)으로 제어됩니다.
- 승인 모드는 정확한 요청 컨텍스트를 바인딩하고, 가능한 경우 하나의 구체적인 로컬 스크립트/파일 피연산자도 바인딩합니다. 인터프리터/런타임 명령에 대해 정확히 하나의 직접 로컬 파일을 식별할 수 없으면, 완전한 의미적 커버리지를 약속하기보다 승인 기반 실행이 거부됩니다.
- 원격 실행을 원하지 않으면, 보안을 deny로 설정하고 해당 Mac에 대한 노드 페어링을 제거하세요.
동적 스킬 (워처 / 원격 노드)
OpenClaw는 세션 중간에 스킬 목록을 갱신할 수 있습니다:
- 스킬 워처:
SKILL.md변경 시 다음 에이전트 턴에서 스킬 스냅샷을 업데이트할 수 있습니다. - 원격 노드: macOS 노드를 연결하면 (바이너리 프로빙 기반으로) macOS 전용 스킬이 적격해질 수 있습니다.
스킬 폴더를 신뢰할 수 있는 코드로 취급하고 수정할 수 있는 사람을 제한하세요.
위협 모델
AI 비서는 다음을 할 수 있습니다:
- 임의의 셸 명령 실행
- 파일 읽기/쓰기
- 네트워크 서비스 접근
- (WhatsApp 접근 권한을 주면) 누구에게나 메시지 전송
여러분에게 메시지를 보내는 사람들은 다음을 할 수 있습니다:
- AI를 속여 나쁜 행동을 하게 시도
- 데이터에 대한 접근을 사회공학적으로 확보
- 인프라 세부 정보 탐색
핵심 개념: 지능보다 접근 제어가 먼저
여기서 대부분의 실패는 정교한 익스플로잇이 아닙니다 - “누군가 봇에 메시지를 보냈고 봇이 요청한 대로 했다”는 것입니다.
OpenClaw의 입장:
- ID 우선: 봇과 대화할 수 있는 사람을 결정 (DM 페어링 / 허용 목록 / 명시적 “open”).
- 범위 다음: 봇이 행동할 수 있는 곳을 결정 (그룹 허용 목록 + 멘션 게이팅, 도구, 샌드박싱, 디바이스 권한).
- 모델 마지막: 모델은 조작될 수 있다고 가정; 조작의 폭발 반경이 제한되도록 설계.
명령 인증 모델
슬래시 명령과 디렉티브는 인증된 발신자에게만 적용됩니다. 인증은 채널 허용 목록/페어링과 commands.useAccessGroups에서 파생됩니다 (설정 및 슬래시 명령 참고). 채널 허용 목록이 비어 있거나 "*"를 포함하면, 해당 채널에서 명령이 사실상 개방됩니다.
/exec는 인증된 운영자를 위한 세션 전용 편의 기능입니다. 설정을 쓰거나 다른 세션을 변경하지 않습니다.
제어 평면 도구 위험
두 가지 내장 도구가 영구적인 제어 평면 변경을 할 수 있습니다:
gateway는config.apply,config.patch,update.run을 호출할 수 있습니다.cron은 원래 채팅/작업이 끝난 후에도 계속 실행되는 예약 작업을 생성할 수 있습니다.
신뢰할 수 없는 콘텐츠를 처리하는 에이전트/표면에 대해서는 기본적으로 거부하세요:
{
tools: {
deny: ["gateway", "cron", "sessions_spawn", "sessions_send"],
},
}
commands.restart=false는 재시작 작업만 차단합니다. gateway 설정/업데이트 작업은 비활성화하지 않습니다.
플러그인/확장
플러그인은 게이트웨이와 동일 프로세스에서 실행됩니다. 신뢰할 수 있는 코드로 취급하세요:
- 신뢰하는 소스의 플러그인만 설치.
- 명시적
plugins.allow허용 목록 선호. - 활성화 전 플러그인 설정 검토.
- 플러그인 변경 후 게이트웨이 재시작.
- npm에서 플러그인을 설치하는 경우(
openclaw plugins install <npm-spec>), 신뢰할 수 없는 코드 실행과 동일하게 취급:- 설치 경로는
~/.openclaw/extensions/<pluginId>/(또는$OPENCLAW_STATE_DIR/extensions/<pluginId>/). - OpenClaw는
npm pack을 사용한 후 해당 디렉터리에서npm install --omit=dev를 실행합니다 (npm 라이프사이클 스크립트가 설치 중 코드를 실행할 수 있음). - 고정된 정확한 버전(
@scope/[email protected])을 선호하고, 활성화 전에 디스크에 풀린 코드를 검사하세요.
- 설치 경로는
세부 정보: 플러그인
DM 접근 모델 (페어링 / 허용 목록 / open / disabled)
현재 DM 지원 채널은 모두 인바운드 DM을 메시지 처리 전에 게이트하는 DM 정책(dmPolicy 또는 *.dm.policy)을 지원합니다:
pairing(기본값): 알 수 없는 발신자에게 짧은 페어링 코드가 전송되고, 승인될 때까지 봇이 메시지를 무시합니다. 코드는 1시간 후 만료되며, 새 요청이 생성될 때까지 반복 DM으로 코드가 재전송되지 않습니다. 대기 요청은 채널당 3개로 기본 제한됩니다.allowlist: 알 수 없는 발신자가 차단됩니다 (페어링 핸드셰이크 없음).open: 누구나 DM 가능 (공개). 채널 허용 목록에"*"가 포함되어야 합니다 (명시적 옵트인).disabled: 인바운드 DM을 완전히 무시.
CLI를 통한 승인:
openclaw pairing list <channel>
openclaw pairing approve <channel> <code>
세부 정보 + 디스크 파일: 페어링
DM 세션 격리 (다중 사용자 모드)
기본적으로 OpenClaw는 모든 DM을 메인 세션으로 라우팅하여 디바이스와 채널 간 연속성을 유지합니다. 여러 사람이 봇에 DM을 보낼 수 있으면 (개방 DM 또는 다중 사용자 허용 목록), DM 세션 격리를 고려하세요:
{
session: { dmScope: "per-channel-peer" },
}
이는 그룹 채팅을 격리된 상태로 유지하면서 사용자 간 컨텍스트 누출을 방지합니다.
이는 메시징 컨텍스트 경계이며, 호스트 관리자 경계가 아닙니다. 사용자들이 서로 적대적이고 동일한 게이트웨이 호스트/설정을 공유하는 경우, 신뢰 경계별로 별도 게이트웨이를 실행하세요.
보안 DM 모드 (권장)
위의 스니펫을 보안 DM 모드로 취급하세요:
- 기본값:
session.dmScope: "main"(모든 DM이 연속성을 위해 하나의 세션 공유). - 로컬 CLI 온보딩 기본값: 미설정 시
session.dmScope: "per-channel-peer"를 기록 (기존 명시적 값 유지). - 보안 DM 모드:
session.dmScope: "per-channel-peer"(각 채널+발신자 쌍이 격리된 DM 컨텍스트를 가짐).
동일 채널에서 여러 계정을 실행하는 경우 per-account-channel-peer를 대신 사용하세요. 동일 사람이 여러 채널에서 연락하는 경우, session.identityLinks를 사용하여 해당 DM 세션을 하나의 정규 ID로 통합하세요. 세션 관리 및 설정을 참고하세요.
허용 목록 (DM + 그룹) — 용어
OpenClaw에는 두 가지 별도의 “누가 나를 트리거할 수 있는가?” 레이어가 있습니다:
- DM 허용 목록 (
allowFrom/channels.discord.allowFrom/channels.slack.allowFrom; 레거시:channels.discord.dm.allowFrom,channels.slack.dm.allowFrom): 다이렉트 메시지에서 봇과 대화할 수 있는 사람.dmPolicy="pairing"일 때, 승인은~/.openclaw/credentials/아래의 계정 범위 페어링 허용 목록 저장소에 기록됩니다 (기본 계정은<channel>-allowFrom.json, 비기본 계정은<channel>-<accountId>-allowFrom.json), 설정 허용 목록과 병합됩니다.
- 그룹 허용 목록 (채널별): 봇이 메시지를 수용하는 그룹/채널/길드.
- 일반 패턴:
channels.whatsapp.groups,channels.telegram.groups,channels.imessage.groups:requireMention과 같은 그룹별 기본값; 설정 시 그룹 허용 목록으로도 작동 (모든 허용 동작을 유지하려면"*"포함).groupPolicy="allowlist"+groupAllowFrom: 그룹 세션 내에서 봇을 트리거할 수 있는 사람 제한 (WhatsApp/Telegram/Signal/iMessage/Microsoft Teams).channels.discord.guilds/channels.slack.channels: 표면별 허용 목록 + 멘션 기본값.
- 그룹 검사는 다음 순서로 실행:
groupPolicy/그룹 허용 목록 먼저, 멘션/응답 활성화 다음. - 봇 메시지에 응답(암시적 멘션)해도
groupAllowFrom과 같은 발신자 허용 목록을 우회하지 않습니다. - 보안 참고:
dmPolicy="open"과groupPolicy="open"을 최후의 수단으로 취급하세요. 방의 모든 구성원을 완전히 신뢰하지 않는 한 거의 사용하지 않아야 합니다. 페어링 + 허용 목록을 선호하세요.
- 일반 패턴:
프롬프트 인젝션 (정의와 중요성)
프롬프트 인젝션은 공격자가 모델을 조작하여 안전하지 않은 작업을 수행하도록 하는 메시지를 만드는 것입니다 (“지시를 무시하라”, “파일시스템을 덤프하라”, “이 링크를 따라가서 명령을 실행하라” 등).
강력한 시스템 프롬프트가 있어도, 프롬프트 인젝션은 해결되지 않았습니다. 시스템 프롬프트 가드레일은 소프트한 가이드일 뿐이며, 강력한 적용은 도구 정책, 실행 승인, 샌드박싱, 채널 허용 목록에서 옵니다 (운영자가 설계상 이를 비활성화할 수 있음). 실제로 도움이 되는 것:
- 인바운드 DM을 잠그세요 (페어링/허용 목록).
- 그룹에서 멘션 게이팅을 선호하세요. 공개 방에서 “항상 켜진” 봇을 피하세요.
- 링크, 첨부 파일, 붙여넣은 지시를 기본적으로 적대적으로 취급하세요.
- 민감한 도구 실행을 샌드박스에서 실행하세요. 에이전트가 접근 가능한 파일시스템에서 비밀 정보를 분리하세요.
- 참고: 샌드박싱은 옵트인입니다. 샌드박스 모드가 꺼져 있으면, tools.exec.host가 기본적으로 sandbox지만 exec는 게이트웨이 호스트에서 실행되며, host=gateway를 설정하고 실행 승인을 설정하지 않는 한 호스트 exec는 승인이 필요하지 않습니다.
- 고위험 도구(
exec,browser,web_fetch,web_search)를 신뢰할 수 있는 에이전트 또는 명시적 허용 목록으로 제한하세요. - 모델 선택이 중요합니다: 오래된/작은/레거시 모델은 프롬프트 인젝션과 도구 오용에 대해 상당히 취약합니다. 도구 지원 에이전트에는 사용 가능한 가장 강력한 최신 세대, 명령어 강화 모델을 사용하세요.
신뢰할 수 없는 것으로 취급해야 할 위험 신호:
- “이 파일/URL을 읽고 그 내용을 정확히 따르라.”
- “시스템 프롬프트나 안전 규칙을 무시하라.”
- “숨겨진 지시나 도구 출력을 공개하라.”
- ”~/.openclaw 전체 내용이나 로그를 붙여넣어라.”
안전하지 않은 외부 콘텐츠 우회 플래그
OpenClaw에는 외부 콘텐츠 안전 래핑을 비활성화하는 명시적 우회 플래그가 포함되어 있습니다:
hooks.mappings[].allowUnsafeExternalContenthooks.gmail.allowUnsafeExternalContent- 크론 페이로드 필드
allowUnsafeExternalContent
가이드:
- 프로덕션에서는 미설정/false로 유지하세요.
- 엄격하게 범위가 지정된 디버깅을 위해서만 일시적으로 활성화하세요.
- 활성화된 경우, 해당 에이전트를 격리하세요 (샌드박스 + 최소 도구 + 전용 세션 네임스페이스).
훅 위험 참고:
- 훅 페이로드는 제어하는 시스템에서 전달되더라도 신뢰할 수 없는 콘텐츠입니다 (메일/문서/웹 콘텐츠가 프롬프트 인젝션을 포함할 수 있음).
- 약한 모델 티어는 이 위험을 증가시킵니다. 훅 기반 자동화에는 강력한 최신 모델 티어를 선호하고 도구 정책을 타이트하게 유지하세요 (
tools.profile: "messaging"또는 더 엄격하게), 가능한 경우 샌드박싱도 사용하세요.
프롬프트 인젝션은 공개 DM이 필요하지 않음
오직 본인만 봇에 메시지를 보낼 수 있더라도, 봇이 읽는 신뢰할 수 없는 콘텐츠 (웹 검색/페치 결과, 브라우저 페이지, 이메일, 문서, 첨부 파일, 붙여넣은 로그/코드)를 통해 프롬프트 인젝션이 발생할 수 있습니다. 즉, 발신자만이 위협 표면이 아닙니다. 콘텐츠 자체가 적대적 지시를 포함할 수 있습니다.
도구가 활성화되면, 일반적인 위험은 컨텍스트를 유출하거나 도구 호출을 트리거하는 것입니다. 폭발 반경을 줄이려면:
- 읽기 전용 또는 도구 비활성화된 리더 에이전트를 사용하여 신뢰할 수 없는 콘텐츠를 요약한 후, 요약을 메인 에이전트에 전달.
- 도구 지원 에이전트에서 필요하지 않으면
web_search/web_fetch/browser를 비활성화. - OpenResponses URL 입력(
input_file/input_image)의 경우,gateway.http.endpoints.responses.files.urlAllowlist와gateway.http.endpoints.responses.images.urlAllowlist를 타이트하게 설정하고,maxUrlParts를 낮게 유지. - 신뢰할 수 없는 입력을 다루는 에이전트에 샌드박싱과 엄격한 도구 허용 목록 활성화.
- 비밀 정보를 프롬프트에서 분리; 게이트웨이 호스트의 env/config를 통해 전달.
모델 강도 (보안 참고)
프롬프트 인젝션 저항은 모델 티어에 따라 균일하지 않습니다. 작은/저렴한 모델은 일반적으로 도구 오용과 명령어 하이재킹에 더 취약하며, 특히 적대적 프롬프트에서 그렇습니다.
경고: 도구 지원 에이전트나 신뢰할 수 없는 콘텐츠를 읽는 에이전트의 경우, 오래된/작은 모델의 프롬프트 인젝션 위험은 종종 너무 높습니다. 약한 모델 티어에서 해당 워크로드를 실행하지 마세요.
권장사항:
- 도구를 실행하거나 파일/네트워크에 접근하는 봇에는 최신 세대, 최고 티어 모델을 사용하세요.
- 도구 지원 에이전트나 신뢰할 수 없는 수신함에 오래된/약한/작은 티어를 사용하지 마세요; 프롬프트 인젝션 위험이 너무 높습니다.
- 더 작은 모델을 사용해야 한다면, 폭발 반경을 줄이세요 (읽기 전용 도구, 강력한 샌드박싱, 최소한의 파일시스템 접근, 엄격한 허용 목록).
- 소형 모델을 실행할 때는 모든 세션에 대해 샌드박싱을 활성화하고, 입력이 엄격하게 제어되지 않으면 web_search/web_fetch/browser를 비활성화하세요.
- 도구가 없고 신뢰할 수 있는 입력만 있는 채팅 전용 개인 비서에는 작은 모델이 보통 괜찮습니다.
그룹에서의 추론 및 상세 출력
/reasoning과 /verbose는 공개 채널용이 아닌 내부 추론이나 도구 출력을 노출할 수 있습니다. 그룹 설정에서는 디버그 전용으로 취급하고, 명시적으로 필요하지 않으면 꺼두세요.
가이드:
- 공개 방에서
/reasoning과/verbose를 비활성화 상태로 유지하세요. - 활성화하는 경우, 신뢰할 수 있는 DM이나 엄격하게 제어되는 방에서만 하세요.
- 기억하세요: 상세 출력에는 도구 인수, URL, 모델이 본 데이터가 포함될 수 있습니다.
설정 강화 (예시)
0) 파일 권한
게이트웨이 호스트에서 설정 + 상태를 비공개로 유지하세요:
~/.openclaw/openclaw.json:600(사용자 읽기/쓰기 전용)~/.openclaw:700(사용자 전용)
openclaw doctor가 경고하고 이 권한을 강화하도록 제안할 수 있습니다.
0.4) 네트워크 노출 (바인딩 + 포트 + 방화벽)
게이트웨이는 단일 포트에서 WebSocket + HTTP를 다중화합니다:
- 기본값:
18789 - 설정/플래그/환경 변수:
gateway.port,--port,OPENCLAW_GATEWAY_PORT
이 HTTP 표면에는 Control UI와 캔버스 호스트가 포함됩니다:
- Control UI (SPA 에셋) (기본 기본 경로
/) - 캔버스 호스트:
/__openclaw__/canvas/및/__openclaw__/a2ui/(임의의 HTML/JS; 신뢰할 수 없는 콘텐츠로 취급)
일반 브라우저에서 캔버스 콘텐츠를 로드하는 경우, 다른 신뢰할 수 없는 웹 페이지와 동일하게 취급하세요:
- 캔버스 호스트를 신뢰할 수 없는 네트워크/사용자에 노출하지 마세요.
- 의미를 완전히 이해하지 않는 한, 캔버스 콘텐츠가 권한 있는 웹 표면과 동일한 오리진을 공유하지 않게 하세요.
바인딩 모드는 게이트웨이가 수신하는 위치를 제어합니다:
gateway.bind: "loopback"(기본값): 로컬 클라이언트만 연결 가능.- 비루프백 바인딩 (
"lan","tailnet","custom")은 공격 표면을 확대합니다. 공유 토큰/비밀번호와 실제 방화벽과 함께만 사용하세요.
경험 법칙:
- LAN 바인딩보다 Tailscale Serve를 선호하세요 (Serve는 게이트웨이를 루프백에 유지하고 Tailscale이 접근을 처리).
- LAN에 바인딩해야 한다면, 포트를 소스 IP의 타이트한 허용 목록으로 방화벽 처리하세요. 광범위하게 포트 포워딩하지 마세요.
0.0.0.0에 인증 없이 게이트웨이를 노출하지 마세요.
0.4.1) Docker 포트 퍼블리싱 + UFW (DOCKER-USER)
VPS에서 Docker로 OpenClaw를 실행하는 경우, 퍼블리시된 컨테이너 포트(-p HOST:CONTAINER 또는 Compose ports:)가 호스트 INPUT 규칙뿐만 아니라 Docker의 포워딩 체인을 통해 라우팅된다는 점을 기억하세요.
Docker 트래픽을 방화벽 정책과 일치시키려면, DOCKER-USER에서 규칙을 적용하세요 (이 체인은 Docker 자체의 수락 규칙 전에 평가됨).
많은 최신 배포판에서 iptables/ip6tables는 iptables-nft 프런트엔드를 사용하며 여전히 nftables 백엔드에 이 규칙을 적용합니다.
최소 허용 목록 예시 (IPv4):
# /etc/ufw/after.rules (별도의 *filter 섹션으로 추가)
*filter
:DOCKER-USER - [0:0]
-A DOCKER-USER -m conntrack --ctstate ESTABLISHED,RELATED -j RETURN
-A DOCKER-USER -s 127.0.0.0/8 -j RETURN
-A DOCKER-USER -s 10.0.0.0/8 -j RETURN
-A DOCKER-USER -s 172.16.0.0/12 -j RETURN
-A DOCKER-USER -s 192.168.0.0/16 -j RETURN
-A DOCKER-USER -s 100.64.0.0/10 -j RETURN
-A DOCKER-USER -p tcp --dport 80 -j RETURN
-A DOCKER-USER -p tcp --dport 443 -j RETURN
-A DOCKER-USER -m conntrack --ctstate NEW -j DROP
-A DOCKER-USER -j RETURN
COMMIT
IPv6에는 별도 테이블이 있습니다. Docker IPv6가 활성화된 경우 /etc/ufw/after6.rules에 일치하는 정책을 추가하세요.
문서 스니펫에서 eth0과 같은 인터페이스 이름을 하드코딩하지 마세요. 인터페이스 이름은 VPS 이미지에 따라 다릅니다 (ens3, enp* 등) 불일치로 인해 거부 규칙이 우연히 건너뛰어질 수 있습니다.
리로드 후 빠른 확인:
ufw reload
iptables -S DOCKER-USER
ip6tables -S DOCKER-USER
nmap -sT -p 1-65535 <public-ip> --open
예상되는 외부 포트는 의도적으로 노출한 것만이어야 합니다 (대부분의 설정에서: SSH + 리버스 프록시 포트).
0.4.2) mDNS/Bonjour 디스커버리 (정보 공개)
게이트웨이는 로컬 디바이스 디스커버리를 위해 mDNS(_openclaw-gw._tcp, 포트 5353)로 존재를 브로드캐스트합니다. 풀 모드에서는 운영 세부 정보를 노출할 수 있는 TXT 레코드가 포함됩니다:
cliPath: CLI 바이너리의 전체 파일시스템 경로 (사용자 이름과 설치 위치 노출)sshPort: 호스트에서 SSH 가용성 광고displayName,lanHost: 호스트명 정보
운영 보안 고려사항: 인프라 세부 정보를 브로드캐스트하면 로컬 네트워크의 누구에게나 정찰이 더 쉬워집니다. 파일시스템 경로나 SSH 가용성과 같은 “무해한” 정보조차 공격자가 환경을 매핑하는 데 도움이 됩니다.
권장사항:
-
최소 모드 (기본값, 노출된 게이트웨이에 권장): mDNS 브로드캐스트에서 민감한 필드 생략:
{ discovery: { mdns: { mode: "minimal" }, }, } -
로컬 디바이스 디스커버리가 필요 없으면 완전히 비활성화:
{ discovery: { mdns: { mode: "off" }, }, } -
풀 모드 (옵트인): TXT 레코드에
cliPath+sshPort포함:{ discovery: { mdns: { mode: "full" }, }, } -
환경 변수 (대안): 설정 변경 없이 mDNS를 비활성화하려면
OPENCLAW_DISABLE_BONJOUR=1을 설정하세요.
최소 모드에서 게이트웨이는 여전히 디바이스 디스커버리에 충분한 정보를 브로드캐스트하지만 (role, gatewayPort, transport) cliPath와 sshPort는 생략합니다. CLI 경로 정보가 필요한 앱은 인증된 WebSocket 연결을 통해 가져올 수 있습니다.
0.5) 게이트웨이 WebSocket 잠금 (로컬 인증)
게이트웨이 인증은 기본적으로 필수입니다. 토큰/비밀번호가 설정되지 않으면, 게이트웨이는 WebSocket 연결을 거부합니다 (폐쇄적 실패).
온보딩 마법사는 기본적으로 (루프백에서도) 토큰을 생성하므로 로컬 클라이언트도 인증해야 합니다.
모든 WS 클라이언트가 인증하도록 토큰을 설정하세요:
{
gateway: {
auth: { mode: "token", token: "your-token" },
},
}
Doctor가 생성해줄 수 있습니다: openclaw doctor --generate-gateway-token.
참고: gateway.remote.token / .password는 클라이언트 인증 정보 소스입니다. 그 자체로 로컬 WS 접근을 보호하지는 않습니다.
로컬 호출 경로에서 gateway.auth.*가 미설정인 경우에만 gateway.remote.*를 대체로 사용할 수 있습니다.
gateway.auth.token / gateway.auth.password가 SecretRef로 명시적 설정되었지만 확인되지 않으면, 확인이 폐쇄적으로 실패합니다 (원격 대체로 마스킹하지 않음).
선택: wss:// 사용 시 gateway.remote.tlsFingerprint로 원격 TLS를 고정하세요.
평문 ws://는 기본적으로 루프백 전용입니다. 신뢰할 수 있는 사설 네트워크 경로의 경우, 클라이언트 프로세스에 OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1을 설정하세요 (긴급 조치).
로컬 디바이스 페어링:
- 로컬 연결(루프백 또는 게이트웨이 호스트 자체의 Tailnet 주소)에 대해 디바이스 페어링이 자동 승인되어 동일 호스트 클라이언트를 원활하게 합니다.
- 다른 Tailnet 피어는 로컬로 취급되지 않습니다. 페어링 승인이 여전히 필요합니다.
인증 모드:
gateway.auth.mode: "token": 공유 bearer 토큰 (대부분의 설정에 권장).gateway.auth.mode: "password": 비밀번호 인증 (환경 변수로 설정 선호:OPENCLAW_GATEWAY_PASSWORD).gateway.auth.mode: "trusted-proxy": ID 인식 리버스 프록시가 사용자를 인증하고 헤더를 통해 ID를 전달하도록 신뢰 (신뢰할 수 있는 프록시 인증 참고).
순환 체크리스트 (토큰/비밀번호):
- 새 시크릿 생성/설정 (
gateway.auth.token또는OPENCLAW_GATEWAY_PASSWORD). - 게이트웨이 재시작 (또는 게이트웨이를 관리하는 macOS 앱 재시작).
- 원격 클라이언트 업데이트 (게이트웨이를 호출하는 머신의
gateway.remote.token/.password). - 이전 인증 정보로 더 이상 연결할 수 없는지 확인.
0.6) Tailscale Serve ID 헤더
gateway.auth.allowTailscale이 true(Serve 기본값)이면, OpenClaw는 Control UI/WebSocket 인증을 위해 Tailscale Serve ID 헤더(tailscale-user-login)를 수용합니다. OpenClaw는 x-forwarded-for 주소를 로컬 Tailscale 데몬(tailscale whois)을 통해 확인하고 헤더와 매칭하여 ID를 검증합니다. 이는 루프백에 도달하고 Tailscale이 삽입하는 x-forwarded-for, x-forwarded-proto, x-forwarded-host를 포함하는 요청에서만 트리거됩니다.
HTTP API 엔드포인트(예: /v1/*, /tools/invoke, /api/channels/*)는 여전히 토큰/비밀번호 인증이 필요합니다.
중요 경계 참고:
- 게이트웨이 HTTP bearer 인증은 사실상 전부 또는 전무(all-or-nothing) 운영자 접근입니다.
/v1/chat/completions,/v1/responses,/tools/invoke,/api/channels/*를 호출할 수 있는 인증 정보를 해당 게이트웨이의 전체 접근 운영자 시크릿으로 취급하세요.- 이 인증 정보를 신뢰할 수 없는 호출자와 공유하지 마세요. 신뢰 경계별로 별도 게이트웨이를 선호하세요.
신뢰 가정: 토큰 없는 Serve 인증은 게이트웨이 호스트를 신뢰한다고 가정합니다. 적대적 동일 호스트 프로세스에 대한 보호로 취급하지 마세요. 게이트웨이 호스트에서 신뢰할 수 없는 로컬 코드가 실행될 수 있으면, gateway.auth.allowTailscale을 비활성화하고 토큰/비밀번호 인증을 요구하세요.
보안 규칙: 자체 리버스 프록시에서 이 헤더를 포워딩하지 마세요. 게이트웨이 앞에서 TLS를 종단하거나 프록시하는 경우, gateway.auth.allowTailscale을 비활성화하고 토큰/비밀번호 인증(또는 신뢰할 수 있는 프록시 인증)을 사용하세요.
신뢰할 수 있는 프록시:
- 게이트웨이 앞에서 TLS를 종단하는 경우,
gateway.trustedProxies를 프록시 IP로 설정하세요. - OpenClaw는 해당 IP의
x-forwarded-for(또는x-real-ip)를 신뢰하여 로컬 페어링 확인 및 HTTP 인증/로컬 확인을 위한 클라이언트 IP를 결정합니다. - 프록시가
x-forwarded-for를 덮어쓰고 게이트웨이 포트에 대한 직접 접근을 차단하는지 확인하세요.
0.6.1) 노드 호스트를 통한 브라우저 제어 (권장)
게이트웨이가 원격이지만 브라우저가 다른 머신에서 실행되는 경우, 브라우저 머신에서 노드 호스트를 실행하고 게이트웨이가 브라우저 작업을 프록시하게 하세요 (브라우저 도구 참고). 노드 페어링을 관리자 접근과 동일하게 취급하세요.
권장 패턴:
- 게이트웨이와 노드 호스트를 동일한 Tailnet(Tailscale)에 유지.
- 의도적으로 노드를 페어링하세요. 필요하지 않으면 브라우저 프록시 라우팅을 비활성화하세요.
피해야 할 것:
- LAN이나 공개 인터넷을 통한 릴레이/제어 포트 노출.
- 브라우저 제어 엔드포인트에 Tailscale Funnel 사용 (공개 노출).
0.7) 디스크의 시크릿 (민감한 것)
~/.openclaw/ (또는 $OPENCLAW_STATE_DIR/) 아래의 모든 것에 시크릿이나 비공개 데이터가 포함될 수 있다고 가정하세요:
openclaw.json: 설정에 토큰(게이트웨이, 원격 게이트웨이), 프로바이더 설정, 허용 목록이 포함될 수 있음.credentials/**: 채널 인증 정보(예: WhatsApp 인증 정보), 페어링 허용 목록, 레거시 OAuth 가져오기.agents/<agentId>/agent/auth-profiles.json: API 키, 토큰 프로필, OAuth 토큰, 선택적keyRef/tokenRef.secrets.json(선택):fileSecretRef 프로바이더(secrets.providers)에서 사용하는 파일 기반 시크릿 페이로드.agents/<agentId>/agent/auth.json: 레거시 호환성 파일. 정적api_key항목은 발견 시 스크럽됨.agents/<agentId>/sessions/**: 비공개 메시지와 도구 출력을 포함할 수 있는 세션 기록(*.jsonl) + 라우팅 메타데이터(sessions.json).extensions/**: 설치된 플러그인 (및node_modules/).sandboxes/**: 도구 샌드박스 작업 공간; 샌드박스 내에서 읽기/쓰기한 파일의 복사본이 축적될 수 있음.
강화 팁:
- 권한을 타이트하게 유지하세요 (디렉터리
700, 파일600). - 게이트웨이 호스트에서 전체 디스크 암호화를 사용하세요.
- 호스트가 공유되는 경우 게이트웨이를 위한 전용 OS 사용자 계정을 선호하세요.
0.8) 로그 + 기록 (수정 + 보존)
로그와 기록은 접근 제어가 올바르더라도 민감한 정보를 누출할 수 있습니다:
- 게이트웨이 로그에 도구 요약, 오류, URL이 포함될 수 있음.
- 세션 기록에 붙여넣은 시크릿, 파일 내용, 명령 출력, 링크가 포함될 수 있음.
권장사항:
- 도구 요약 수정을 유지하세요 (
logging.redactSensitive: "tools"; 기본값). logging.redactPatterns를 통해 환경에 맞는 커스텀 패턴을 추가하세요 (토큰, 호스트명, 내부 URL).- 진단 정보 공유 시 원시 로그보다
openclaw status --all(붙여넣기 가능, 시크릿 수정됨)을 선호하세요. - 긴 보존이 필요 없으면 오래된 세션 기록과 로그 파일을 정리하세요.
세부 정보: 로깅
1) DM: 기본값으로 페어링
{
channels: { whatsapp: { dmPolicy: "pairing" } },
}
2) 그룹: 모든 곳에서 멘션 필요
{
"channels": {
"whatsapp": {
"groups": {
"*": { "requireMention": true }
}
}
},
"agents": {
"list": [
{
"id": "main",
"groupChat": { "mentionPatterns": ["@openclaw", "@mybot"] }
}
]
}
}
그룹 채팅에서는 명시적으로 멘션될 때만 응답합니다.
3. 번호 분리
AI를 개인 번호와 별도의 전화번호에서 실행하는 것을 고려하세요:
- 개인 번호: 대화가 비공개로 유지
- 봇 번호: AI가 적절한 경계와 함께 처리
4. 읽기 전용 모드 (현재, 샌드박스 + 도구 활용)
다음을 결합하여 이미 읽기 전용 프로필을 구축할 수 있습니다:
agents.defaults.sandbox.workspaceAccess: "ro"(또는 작업 공간 접근 없이"none")write,edit,apply_patch,exec,process등을 차단하는 도구 허용/거부 목록
향후 이 설정을 단순화하기 위해 단일 readOnlyMode 플래그를 추가할 수 있습니다.
추가 강화 옵션:
tools.exec.applyPatch.workspaceOnly: true(기본값): 샌드박싱이 꺼져 있어도apply_patch가 작업 공간 디렉터리 밖에 쓰기/삭제할 수 없도록 합니다. 의도적으로apply_patch가 작업 공간 밖 파일을 건드리게 하려는 경우에만false로 설정하세요.tools.fs.workspaceOnly: true(선택):read/write/edit/apply_patch경로와 네이티브 프롬프트 이미지 자동 로드 경로를 작업 공간 디렉터리로 제한합니다 (현재 절대 경로를 허용하고 있으며 단일 가드레일이 필요한 경우 유용).- 파일시스템 루트를 좁게 유지하세요: 에이전트 작업 공간/샌드박스 작업 공간에 홈 디렉터리와 같은 광범위한 루트를 피하세요. 광범위한 루트는 파일시스템 도구에 민감한 로컬 파일(예:
~/.openclaw아래의 상태/설정)을 노출할 수 있습니다.
5) 보안 기본 설정 (복사/붙여넣기)
게이트웨이를 비공개로 유지하고, DM 페어링을 요구하며, 항상 켜진 그룹 봇을 피하는 하나의 “안전한 기본값” 설정:
{
gateway: {
mode: "local",
bind: "loopback",
port: 18789,
auth: { mode: "token", token: "your-long-random-token" },
},
channels: {
whatsapp: {
dmPolicy: "pairing",
groups: { "*": { requireMention: true } },
},
},
}
“기본적으로 더 안전한” 도구 실행도 원한다면, 비소유자 에이전트에 대해 샌드박스 + 위험한 도구 거부를 추가하세요 (아래 “에이전트별 접근 프로필” 예시 참고).
채팅 기반 에이전트 턴의 내장 기본: 비소유자 발신자는 cron 또는 gateway 도구를 사용할 수 없습니다.
샌드박싱 (권장)
전용 문서: 샌드박싱
두 가지 보완적 접근:
- 전체 게이트웨이를 Docker에서 실행 (컨테이너 경계): Docker
- 도구 샌드박스 (
agents.defaults.sandbox, 호스트 게이트웨이 + Docker 격리 도구): 샌드박싱
참고: 에이전트 간 접근을 방지하려면, agents.defaults.sandbox.scope를 "agent" (기본값) 또는 더 엄격한 세션별 격리를 위해 "session"으로 유지하세요. scope: "shared"는 단일 컨테이너/작업 공간을 사용합니다.
샌드박스 내의 에이전트 작업 공간 접근도 고려하세요:
agents.defaults.sandbox.workspaceAccess: "none"(기본값) 에이전트 작업 공간을 접근 불가로 유지; 도구는~/.openclaw/sandboxes아래의 샌드박스 작업 공간에서 실행agents.defaults.sandbox.workspaceAccess: "ro"에이전트 작업 공간을/agent에 읽기 전용으로 마운트 (write/edit/apply_patch비활성화)agents.defaults.sandbox.workspaceAccess: "rw"에이전트 작업 공간을/workspace에 읽기/쓰기로 마운트
중요: tools.elevated는 호스트에서 exec를 실행하는 전역 기본 탈출구입니다. tools.elevated.allowFrom을 타이트하게 유지하고 낯선 사람에게 활성화하지 마세요. agents.list[].tools.elevated를 통해 에이전트별로 엘리베이티드를 추가 제한할 수 있습니다. 엘리베이티드 모드를 참고하세요.
서브에이전트 위임 가드레일
세션 도구를 허용하는 경우, 위임된 서브에이전트 실행을 또 다른 경계 결정으로 취급하세요:
- 에이전트가 위임이 정말 필요하지 않으면
sessions_spawn을 거부하세요. agents.list[].subagents.allowAgents를 알려진 안전한 대상 에이전트로 제한하세요.- 샌드박스가 유지되어야 하는 워크플로우의 경우,
sessions_spawn을sandbox: "require"로 호출하세요 (기본값은inherit). sandbox: "require"는 대상 자식 런타임이 샌드박스 처리되지 않으면 즉시 실패합니다.
브라우저 제어 위험
브라우저 제어를 활성화하면 모델에게 실제 브라우저를 제어하는 능력을 부여합니다. 해당 브라우저 프로필에 로그인된 세션이 이미 있으면, 모델이 해당 계정과 데이터에 접근할 수 있습니다. 브라우저 프로필을 민감한 상태로 취급하세요:
- 에이전트를 위한 전용 프로필을 선호하세요 (기본값
openclaw프로필). - 에이전트에 개인 일상 사용 프로필을 가리키지 마세요.
- 신뢰하지 않는 한 샌드박스 에이전트에 호스트 브라우저 제어를 비활성화하세요.
- 브라우저 다운로드를 신뢰할 수 없는 입력으로 취급하세요. 격리된 다운로드 디렉터리를 선호하세요.
- 가능하면 에이전트 프로필에서 브라우저 동기화/비밀번호 관리자를 비활성화하세요 (폭발 반경 감소).
- 원격 게이트웨이의 경우, “브라우저 제어”는 해당 프로필이 도달할 수 있는 모든 것에 대한 “운영자 접근”과 동등하다고 가정하세요.
- 게이트웨이와 노드 호스트를 Tailnet 전용으로 유지하세요. 릴레이/제어 포트를 LAN이나 공개 인터넷에 노출하지 마세요.
- Chrome 확장 릴레이의 CDP 엔드포인트는 인증으로 보호됩니다. OpenClaw 클라이언트만 연결할 수 있습니다.
- 필요하지 않으면 브라우저 프록시 라우팅을 비활성화하세요 (
gateway.nodes.browser.mode="off"). - Chrome 확장 릴레이 모드는 “더 안전한” 것이 아닙니다. 기존 Chrome 탭을 장악할 수 있습니다. 해당 탭/프로필이 도달할 수 있는 모든 곳에서 당신으로서 행동할 수 있다고 가정하세요.
브라우저 SSRF 정책 (신뢰된 네트워크 기본값)
OpenClaw의 브라우저 네트워크 정책은 신뢰된 운영자 모델을 기본으로 합니다: 명시적으로 비활성화하지 않는 한 사설/내부 대상이 허용됩니다.
- 기본값:
browser.ssrfPolicy.dangerouslyAllowPrivateNetwork: true(미설정 시 암시적). - 레거시 별칭:
browser.ssrfPolicy.allowPrivateNetwork이 호환성을 위해 여전히 수용됩니다. - 엄격 모드: 기본적으로 사설/내부/특수 용도 대상을 차단하려면
browser.ssrfPolicy.dangerouslyAllowPrivateNetwork: false를 설정하세요. - 엄격 모드에서는 명시적 예외를 위해
hostnameAllowlist(*.example.com과 같은 패턴) 및allowedHostnames(localhost를 포함한 정확한 호스트 예외)를 사용하세요. - 내비게이션은 요청 전에 확인되고, 리다이렉트 기반 피벗을 줄이기 위해 내비게이션 후 최종
http(s)URL에서 최선 노력으로 재확인됩니다.
엄격 정책 예시:
{
browser: {
ssrfPolicy: {
dangerouslyAllowPrivateNetwork: false,
hostnameAllowlist: ["*.example.com", "example.com"],
allowedHostnames: ["localhost"],
},
},
}
에이전트별 접근 프로필 (다중 에이전트)
다중 에이전트 라우팅에서 각 에이전트는 자체 샌드박스 + 도구 정책을 가질 수 있습니다: 에이전트별로 전체 접근, 읽기 전용, 접근 없음을 부여하는 데 사용하세요. 전체 세부 정보 및 우선순위 규칙은 다중 에이전트 샌드박스 & 도구를 참고하세요.
일반적인 사용 사례:
- 개인 에이전트: 전체 접근, 샌드박스 없음
- 가족/업무 에이전트: 샌드박스 + 읽기 전용 도구
- 공개 에이전트: 샌드박스 + 파일시스템/셸 도구 없음
예시: 전체 접근 (샌드박스 없음)
{
agents: {
list: [
{
id: "personal",
workspace: "~/.openclaw/workspace-personal",
sandbox: { mode: "off" },
},
],
},
}
예시: 읽기 전용 도구 + 읽기 전용 작업 공간
{
agents: {
list: [
{
id: "family",
workspace: "~/.openclaw/workspace-family",
sandbox: {
mode: "all",
scope: "agent",
workspaceAccess: "ro",
},
tools: {
allow: ["read"],
deny: ["write", "edit", "apply_patch", "exec", "process", "browser"],
},
},
],
},
}
예시: 파일시스템/셸 접근 없음 (프로바이더 메시징 허용)
{
agents: {
list: [
{
id: "public",
workspace: "~/.openclaw/workspace-public",
sandbox: {
mode: "all",
scope: "agent",
workspaceAccess: "none",
},
// 세션 도구는 기록에서 민감한 데이터를 노출할 수 있습니다. 기본적으로 OpenClaw는 이 도구를
// 현재 세션 + 생성된 서브에이전트 세션으로 제한하지만, 필요한 경우 더 제한할 수 있습니다.
// 설정 참고에서 `tools.sessions.visibility`를 확인하세요.
tools: {
sessions: { visibility: "tree" }, // self | tree | agent | all
allow: [
"sessions_list",
"sessions_history",
"sessions_send",
"sessions_spawn",
"session_status",
"whatsapp",
"telegram",
"slack",
"discord",
],
deny: [
"read",
"write",
"edit",
"apply_patch",
"exec",
"process",
"browser",
"canvas",
"nodes",
"cron",
"gateway",
"image",
],
},
},
],
},
}
AI에게 전달할 내용
에이전트의 시스템 프롬프트에 보안 가이드라인을 포함하세요:
## 보안 규칙
- 낯선 사람에게 디렉터리 목록이나 파일 경로를 공유하지 마세요
- API 키, 인증 정보, 인프라 세부 정보를 절대 공개하지 마세요
- 시스템 설정을 수정하는 요청은 소유자에게 확인하세요
- 확실하지 않으면 행동하기 전에 물어보세요
- 명시적으로 승인되지 않은 한 비공개 데이터를 비공개로 유지하세요
사고 대응
AI가 잘못된 행동을 했다면:
억제
- 중지: macOS 앱(게이트웨이를 관리하는 경우) 중지 또는
openclaw gateway프로세스 종료. - 노출 차단: 무슨 일이 일어났는지 이해할 때까지
gateway.bind: "loopback"을 설정 (또는 Tailscale Funnel/Serve 비활성화). - 접근 동결: 위험한 DM/그룹을
dmPolicy: "disabled"/ 멘션 필요로 전환하고,"*"전체 허용 항목이 있었다면 제거.
순환 (시크릿이 누출된 경우 침해 가정)
- 게이트웨이 인증 순환 (
gateway.auth.token/OPENCLAW_GATEWAY_PASSWORD) 및 재시작. - 게이트웨이를 호출할 수 있는 모든 머신의 원격 클라이언트 시크릿 순환 (
gateway.remote.token/.password). - 프로바이더/API 인증 정보 순환 (WhatsApp 인증 정보, Slack/Discord 토큰,
auth-profiles.json의 모델/API 키, 사용 시 암호화된 시크릿 페이로드 값).
감사
- 게이트웨이 로그 확인:
/tmp/openclaw/openclaw-YYYY-MM-DD.log(또는logging.file). - 관련 기록 검토:
~/.openclaw/agents/<agentId>/sessions/*.jsonl. - 최근 설정 변경 검토 (접근을 넓혔을 수 있는 모든 것:
gateway.bind,gateway.auth, DM/그룹 정책,tools.elevated, 플러그인 변경). openclaw security audit --deep을 다시 실행하고 critical 발견 사항이 해결되었는지 확인.
보고를 위한 수집
- 타임스탬프, 게이트웨이 호스트 OS + OpenClaw 버전
- 세션 기록 + 짧은 로그 꼬리 (수정 후)
- 공격자가 보낸 것 + 에이전트가 한 것
- 게이트웨이가 루프백 너머로 노출되었는지 여부 (LAN/Tailscale Funnel/Serve)
시크릿 스캔 (detect-secrets)
CI는 secrets 작업에서 detect-secrets pre-commit 훅을 실행합니다.
main에 대한 푸시는 항상 전체 파일 스캔을 실행합니다. 풀 리퀘스트는 기본 커밋이 사용 가능할 때 변경된 파일 빠른 경로를 사용하고, 그렇지 않으면 전체 파일 스캔으로 대체합니다. 실패하면, 아직 기준선에 없는 새 후보가 있습니다.
CI가 실패하면
-
로컬에서 재현:
pre-commit run --all-files detect-secrets -
도구 이해:
- pre-commit의
detect-secrets는 저장소의 기준선과 제외를 사용하여detect-secrets-hook을 실행합니다. detect-secrets audit는 각 기준선 항목을 실제 또는 거짓 긍정으로 표시하는 대화형 검토를 엽니다.
- pre-commit의
-
실제 시크릿의 경우: 순환/제거한 후 스캔을 다시 실행하여 기준선을 업데이트합니다.
-
거짓 긍정의 경우: 대화형 감사를 실행하고 거짓으로 표시합니다:
detect-secrets audit .secrets.baseline -
새 제외가 필요하면,
.detect-secrets.cfg에 추가하고 일치하는--exclude-files/--exclude-lines플래그로 기준선을 재생성하세요 (설정 파일은 참고용입니다; detect-secrets가 자동으로 읽지 않습니다).
기준선이 의도한 상태를 반영하면 업데이트된 .secrets.baseline을 커밋하세요.
보안 문제 보고
OpenClaw에서 취약점을 발견했나요? 책임감 있게 보고해 주세요:
- 이메일: [email protected]
- 수정될 때까지 공개하지 마세요
- 크레딧을 드립니다 (익명을 선호하지 않는 한)