Secrets management
OpenClaw는 지원되는 자격 증명을 구성 파일의 평문으로 저장하지 않아도 되도록 가산적 SecretRef를 지원합니다. 평문 자격 증명도 계속 동작합니다. SecretRef는 자격 증명별 opt-in입니다.목표와 런타임 모델
시크릿은 메모리 내 런타임 스냅샷으로 해석됩니다.- 해석은 요청 경로에서 지연 수행되지 않고 activation 시 eager하게 수행됩니다.
- 실제로 활성인 SecretRef를 해석할 수 없으면 시작이 즉시 실패합니다.
- reload는 원자적 교체를 사용합니다. 전체 성공이거나 마지막 정상 스냅샷을 유지합니다.
- 런타임 요청은 활성 메모리 스냅샷만 읽습니다.
- outbound delivery 경로도 이 활성 스냅샷만 읽습니다 (예: Discord reply/thread delivery, Telegram action send). 전송마다 SecretRef를 다시 해석하지 않습니다.
활성 surface 필터링
SecretRef는 실제로 활성인 surface에서만 검증됩니다.- 활성 surface: 해석 불가 ref는 시작/reload를 막습니다.
- 비활성 surface: 해석 불가 ref는 시작/reload를 막지 않습니다.
- 비활성 ref는
SECRETS_REF_IGNORED_INACTIVE_SURFACE진단만 남깁니다.
- 비활성화된 채널/계정
- 어떤 활성 계정도 상속하지 않는 상위 채널 자격 증명
- 비활성 도구/기능 surface
tools.web.search.provider로 선택되지 않은 web search 프로바이더 키
Gateway 인증 surface 진단
gateway.auth.password, gateway.remote.token, gateway.remote.password에 SecretRef가 설정되면, 시작과 reload 시 해당 surface 상태를 명시적으로 기록합니다.
active: 실제 인증 surface에 포함되며 반드시 해석돼야 함inactive: 다른 인증 surface가 우선하거나 remote auth가 비활성이라 이번 런타임에서 무시됨
SECRETS_GATEWAY_AUTH_SURFACE입니다.
온보딩 preflight
대화형 온보딩에서 SecretRef 저장을 선택하면 저장 전에 preflight 검증을 수행합니다.- env ref: 환경 변수 이름과 비어 있지 않은 값을 확인
- provider ref(
file,exec): provider 선택,id, 해석된 값 타입 확인
SecretRef 계약
모든 곳에서 동일한 객체 형태를 사용합니다.source: "env"
provider:^[a-z][a-z0-9_-]{0,63}$id:^[A-Z][A-Z0-9_]{0,127}$
source: "file"
provider:^[a-z][a-z0-9_-]{0,63}$id: 절대 JSON pointer (/...)
source: "exec"
provider:^[a-z][a-z0-9_-]{0,63}$id:^[A-Za-z0-9][A-Za-z0-9._:/-]{0,255}$
Provider 구성
secrets.providers 아래에 provider를 정의합니다.
Env provider
- 선택적 allowlist 지원
- 값이 없거나 비어 있으면 해석 실패
File provider
path에서 로컬 파일 읽기mode: "json"은 JSON 객체에서 pointer로 해석mode: "singleValue"는id: "value"를 기대하고 파일 전체 내용을 반환
Exec provider
- 셸 없이 절대 경로 바이너리를 실행
- 기본적으로 일반 파일만 허용하며 심볼릭 링크는 불가
allowSymlinkCommand: true로 Homebrew shim 같은 경로 허용 가능- timeout, output 바이트 제한, env allowlist, trusted dirs를 지원
Exec 통합 예시
다음 CLI와 쉽게 연동할 수 있습니다.- 1Password CLI
- HashiCorp Vault CLI
sops
지원되는 자격 증명 surface
표준적으로 지원/비지원되는 자격 증명 목록은 다음 문서에 정리되어 있습니다. 회전형 자격 증명이나 OAuth refresh material처럼 런타임에서 생성되는 값은 의도적으로 제외됩니다.요구 동작과 우선순위
- ref가 없는 필드는 그대로 둡니다.
- ref가 있는 필드는 활성 surface에서 activation 시 필수입니다.
- 평문과 ref가 둘 다 있으면, 지원되는 우선순위 경로에서는 ref가 우선합니다.
SECRETS_REF_OVERRIDES_PLAINTEXTREF_SHADOWED
serviceAccountRef가 평문serviceAccount보다 우선합니다.
Activation 트리거
시크릿 activation은 다음에서 실행됩니다.- 시작 시
- config reload hot-apply 경로
- config reload restart-check 경로
- 수동
secrets.reload
- 성공 시 스냅샷을 원자적으로 교체
- 시작 실패 시 게이트웨이 시작 중단
- 런타임 reload 실패 시 마지막 정상 스냅샷 유지
저하 및 복구 시그널
reload 시 activation이 실패하면 OpenClaw는 degraded secrets 상태로 들어갑니다.SECRETS_RELOADER_DEGRADEDSECRETS_RELOADER_RECOVERED
- degraded: 마지막 정상 스냅샷 유지
- recovered: 다음 성공 activation 이후 한 번만 발생
Command-path 해석
원격 메모리 경로나openclaw qr --remote처럼 opt-in한 명령 경로는 게이트웨이 스냅샷 RPC를 통해 지원되는 SecretRef를 해석할 수 있습니다.
- 게이트웨이가 실행 중이면 활성 스냅샷을 읽습니다.
- 필요한 SecretRef가 있지만 게이트웨이가 없으면 즉시 실패하고 진단을 제공합니다.
- 백엔드 시크릿 회전 후 스냅샷 갱신은
openclaw secrets reload로 처리합니다.
secrets.resolve
Audit 및 configure 워크플로
기본 운영 흐름:secrets audit
다음 항목을 찾습니다.
- 평문 값(
openclaw.json,auth-profiles.json,.env) - 해석되지 않는 ref
- 우선순위 shadowing
- 레거시 잔여물(
auth.json, OAuth reminder)
secrets configure
대화형 도우미가 다음을 수행합니다.
secrets.providers를 먼저 설정openclaw.json과auth-profiles.json의 지원 대상 필드 선택- SecretRef 상세값(
source,provider,id) 수집 - preflight 해석 실행
- 즉시 적용 가능
openclaw secrets configure --providers-onlyopenclaw secrets configure --skip-provider-setupopenclaw secrets configure --agent <id>
secrets apply
저장된 계획 적용:
단방향 안전 정책
OpenClaw는 과거 평문 시크릿 값을 담는 rollback 백업을 의도적으로 작성하지 않습니다.- write 모드 전에 preflight가 성공해야 함
- 커밋 전에 런타임 activation이 검증됨
- 적용은 원자적 파일 교체와 best-effort 복구를 사용
레거시 인증 호환 참고
정적 자격 증명의 경우 런타임은 더 이상 평문 레거시 auth 저장소에 의존하지 않습니다.- 런타임 자격 증명 소스는 해석된 메모리 스냅샷
- 레거시 정적
api_key항목은 발견 시 스크럽 - OAuth 관련 호환성은 별도 처리