배포 전 점검(Node 버전·권한 모델)
Node LTS(2026년 기준 다수 팀은 22+)를 고정: node -v·npm -v, nvm 또는 공식 패키지로 재현 가능하게 설치합니다. 전용 사용자 openclawsvc로 디렉터리·로그 소유권을 맞추고, 관리자·무비번 sudo로 게이트웨이를 돌리지 마세요.
id openclawsvc ls -la ~/openclaw-gateway chmod 750 ~/openclaw-gateway chmod 600 ~/openclaw-gateway/.env.gateway
TCC는 최소 권한만. 스킬 자동화 시 뜨는 프롬프트를 Runbook에 기록하고, 전체 디스크 접근을 남용하지 마세요. launchd plist UserName으로 서비스 계정을 명시합니다.
게이트웨이 토큰·접근 제어 설정 단계
네트워크: 루프백 바인딩 + Caddy·nginx TLS·소스 IP 제한이 원격 Mac에서 흔한 패턴입니다.
CI·클라이언트가 쓰는 경로에는 Bearer 토큰 인증을 켭니다. 토큰은 .env.gateway(권한 600)에 두고 launchd EnvironmentVariables에서 참조합니다.
export OPENCLAW_GATEWAY_TOKEN="$(openssl rand -hex 32)" # launchd plist EnvironmentVariables: # OPENCLAW_GATEWAY_TOKEN = <시크릿 저장소 값>
CI는 Secrets 주입·로그 마스킹, git grep 가드로 평문 커밋을 막습니다.
openclaw.json 예시(버전에 맞게 키 조정):
{
"gateway": {
"listen": { "host": "127.0.0.1", "port": 18765 },
"auth": { "mode": "bearer", "header": "Authorization" },
"rateLimit": { "perMinute": 120 }
}
}
VPN·ssh -L 18765:127.0.0.1:18765 user@remote-mac·방화벽 기본 거부로 공인 노출 면을 줄입니다.
아웃바운드 도메인 화이트리스트·프록시 정책
임의 URL = SSRF 증폭. 필요 호스트를 문서화한 뒤 레이어로 강제합니다.
| 범주 | 예시 호스트(스택에 맞게 축소) | 비고 |
|---|---|---|
| 모델·추론 API | api.openai.com, api.anthropic.com, 사용 중인 리전 엔드포인트 | 설정에 API 베이스 URL을 고정·와일드카드 금지. |
| 패키지 레지스트리 | registry.npmjs.org, github.com, objects.githubusercontent.com | 설치·ClawHub류 풀에 필요. |
| ML 아티팩트 | huggingface.co, cdn-lfs.huggingface.co | 런타임 모델 풀 시에만 추가. |
| 내부 서비스 | 사설 레지스트리 FQDN | NO_PROXY에 넣어 사내 직통. |
서비스 계정 셸·launchd 환경에 프록시를 한 번만 설정합니다.
export HTTPS_PROXY="http://proxy.corp.example:8080" export NO_PROXY="127.0.0.1,localhost,.internal.corp,artifacts.internal"
프록시가 없으면 방화벽 출구 + 버전 관리 스킬로 변경을 리뷰합니다.
로그 감사·알림 임계값
stdout/stderr를 /var/log/openclaw/ 또는 launchd StandardOutPath/StandardErrorPath로 보내고 newsyslog·logrotate로 회전합니다. 아래는 단일 노드 최소 알림 후보(1주 베이스라인 후 조정).
- 401/403 비율: 단일 IP 기준 분당 N회 이상(N은 베이스라인 후 보통 10~30대) 실패 인증.
- 신규 아웃바운드 호스트: 최근 7일에 없던 DNS 이름이 하루 요약으로 급증.
- 오류 예산: 10분간 요청의 5% 이상이
ECONNRESET·TLS 핸드셰이크 실패. - 할당량 신호: API 429가 게이트웨이 User-Agent와 함께 묶여 나오면 토큰 유출·남용 의심.
흔한 오류(포트·TLS·권한)
| 증상 | 실행·점검 |
|---|---|
게이트웨이 포트 EADDRINUSE | lsof -nP -iTCP:18765 -sTCP:LISTEN로 점유 프로세스 종료 또는 openclaw.json·프록시 설정의 포트를 일관되게 변경. |
TLS UNABLE_TO_VERIFY_LEAF_SIGNATURE | 기업 SSL 검사: Mac 키체인에 루트 설치 또는 서비스 사용자만 NODE_EXTRA_CA_CERTS=/path/to/corp.pem 설정. |
| 외부 클라이언트 연결 리셋 | 리버스 프록시 proxy_read_timeout이 긴 스트림을 커버하는지, 방화벽이 established 반환 트래픽을 막지 않는지 확인. |
캐시·로그 EACCES | ls -la로 소유자를 openclawsvc에 맞추고, sudo npm -g와 사용자 설치를 섞지 않기. |
변경 후 openclaw doctor(지원 시)와 curl -sf -H "Authorization: Bearer $TOKEN" http://127.0.0.1:18765/health로 프록시 공개 전 확인합니다.
런칭 전 보안 체크리스트
- IP 허용·강한 인증 없이
0.0.0.0에 게이트웨이를 붙이지 않았는가. - 기본값이 아닌 토큰으로 로테이션했고 600 권한·git·CI 출력에 없는가.
- 아웃바운드 화이트리스트가 문서화되었고 데몬 사용자에
HTTPS_PROXY·NO_PROXY가 설정되었는가. - 디스크 로테이션과 함께 인증 실패 급증 최소 1종 자동 알림이 있는가.
- 깨끗한 홈에서 스크립트만으로 노드를 복구하는 리허설을 했는가.
보안 FAQ
원격 Mac에서 게이트웨이를 0.0.0.0에 바인딩해도 될까요? 가능하면 피하세요. 루프백 + 리버스 프록시(TLS·IP 제한) 또는 사설 인터페이스만 사용하세요. 공인 인터페이스에 무인증으로 열린 게이트웨이는 2025–2026 노출 통계에서 반복적으로 등장했습니다.
Bearer 토큰은 어디에 저장하나요? 권한 600인 env 파일이나 시크릿 저장소에 두고 launchd 등으로 주입합니다. 인력 변동 시 로테이션하고 CI 로그에 출력하지 마세요.
임의 URL 호출을 막으려면? 호스트 화이트리스트, 프록시·방화벽 출구, 스킬 설정의 URL 필터를 겹치고 예외는 승인·기록으로 관리합니다.
어떤 로그에 알림을 걸까요? 인증 실패 급증, TLS·핸드셰이크 스파이크, 기준 대비 신규 호스트, EACCES/EPERM, 429와 UA 상관 등을 후보로 삼습니다.
요약 및 원격 Mac 노드 선정
핵심은 슬로건이 아니라 운영입니다. Node·전용 계정·600 토큰·루프백+프록시·문서화된 아웃바운드 정책·실제 알림이 맞물려야 2025–2026 노출 패턴을 줄입니다.
노드 선정 시 Apple Silicon 전용·안정 출구·SSH/VNC 브레이크 글래스를 우선하세요. 요금·구매·고객 지원, 배포 글은 OpenClaw 코너.