테마 전환

OpenClaw 엔터프라이즈 배포 실전: 다중 사용자 관리, 권한 격리와 보안 강화 완전 가이드

Easton editorial illustration: durable queue station

Slack에서 운영팀장이 이런 메시지를 보냈습니다. “누가 설명 좀 해줄래요? 왜 운영 환경 데이터베이스 설정이 OpenClaw 세션 기록에 들어가 있죠?” 스크린샷에는 인턴 샤오리의 OpenClaw 채팅 기록이 보였고, 데이터베이스 IP, 포트, 심지어 SQL 쿼리 결과 몇 줄까지 그대로 드러나 있었습니다.

OpenClaw를 도입한 지 한 달 만에 겪은 첫 번째 “사고”였습니다. 처음에는 모두 꽤 들떠 있었습니다. 이 도구는 정말 편했습니다. 코드 작성, 문서 검색, 문제 디버깅까지 도와줬으니까요. 하지만 개발자 십여 명이 각자 쓰기 시작하자 세션 기록은 흩어지고, 권한 관리는 엉망이 되었습니다. 누가 무엇에 접근할 수 있는지, 누가 어떤 작업을 했는지 전혀 감이 없었습니다.

OpenClaw의 GitHub 스타는 한 달 만에 6만 개를 넘었고, 인기는 대단했습니다. 하지만 공식 문서를 살펴보면 거의 전부 개인 사용자를 위한 설치 가이드입니다. 엔터프라이즈 배포? 다중 사용자 관리? 권한 제어? 거의 언급되지 않습니다. 개인 도구로는 시원하게 쓸 수 있어도 기업 환경으로 옮겨오면 완전히 다른 문제가 됩니다.

이 글은 바로 그 빈틈을 메우기 위해 썼습니다. 우리 팀이 밟았던 함정, 시도했던 방식, 최종적으로 선택한 아키텍처, 그리고 실제 설정 파일과 스크립트를 공유합니다. 그대로 가져다 써도 됩니다. 회사에 OpenClaw를 도입하려고 준비 중이거나 이미 쓰고 있지만 관리가 혼란스럽다면 이 글이 도움이 되기를 바랍니다.

저비용 “새우 키우기” 가이드: ArkClaw가 AI Agent를 진짜 대중화합니다

요즘 뜨거운 OpenClaw(랍스터)는 좋지만 설정이 너무 버겁나요? ByteDance Volcengine의 ArkClaw는 진입 장벽을 바닥까지 낮췄습니다. 서버와 Token 설정으로 고생할 필요 없이, 클릭 한 번으로 24시간 온라인 상태에서 브라우저를 제어하고 스크립트를 실행하며 캘린더까지 관리하는 “AI 일꾼”을 가질 수 있습니다.

핵심은 정말 저렴하다는 점입니다. 월 요금은 9.9위안에 불과하고, 제 초대 코드 ZLKUK54M(여기에서 가입)을 쓰면 8.9위안이면 됩니다. 프로그래머라면 Coding Plan Pro에 바로 가입해 무료로 이용할 수도 있습니다.

OpenClaw 엔터프라이즈 배포의 과제와 현재 상황

개인용 OpenClaw의 한계

OpenClaw는 처음부터 개인 개발자를 대상으로 설계되었습니다. 자기 컴퓨터에 설치하고 API 키를 설정한 뒤 바로 쓰면 됩니다. 꽤 매끄럽습니다. 하지만 이 논리를 기업 환경에 가져오면 맞지 않습니다.

가장 기본적인 것부터 보겠습니다. 단일 사용자 설계입니다. OpenClaw는 기본적으로 모든 설정과 세션 기록을 ~/.openclaw 디렉터리에 저장합니다. 혼자 쓰면 문제 없습니다. 그런데 열 명이 쓰면 어떨까요? 각자의 세션 기록이 각자 컴퓨터에 흩어져 있고 뒤섞입니다. 어떤 작업을 누가 했는지 확인하고 싶나요? 하나씩 뒤져야 합니다.

다음은 권한 격리입니다. OpenClaw는 설치한 사용자의 권한을 그대로 이어받습니다. 관리자 계정으로 설치하면 관리자 권한을 갖고, 인턴이 자기 계정으로 설치하면 이론상 자기 파일만 접근할 수 있습니다. 이론상으로는요. 실제로 OpenClaw는 임의의 Bash 명령을 실행할 수 있고, 파일 시스템을 읽고 쓸 수 있으며, 네트워크에도 접근할 수 있습니다. 현재 사용자가 할 수 있는 일은 OpenClaw도 할 수 있습니다. 샌드박스도 없고 제한도 없습니다.

가장 골치 아픈 부분은 세션 기록 관리입니다. 각자의 채팅 기록, 실행한 명령, 접근한 파일이 모두 로컬에 쌓입니다. 민감 정보는요? 데이터베이스 비밀번호, API 키, 고객 데이터가 모두 그 안에 들어갈 수 있습니다. 모든 개발자의 노트북이 충분히 안전하다고 보장할 수 있나요? 저는 자신 없습니다.

기업 시나리오의 특수 요구사항

기업에서 OpenClaw를 쓰면 요구사항이 완전히 달라집니다.

다중 사용자 협업이 첫 번째 관문입니다. 팀에는 프론트엔드, 백엔드, 테스트, 운영 담당자가 있고 모두 OpenClaw를 쓰고 싶어 합니다. 리소스는 어떻게 나눌까요? 서로 방해하지 않게 하려면 어떻게 해야 할까요? 장산이 디버깅하는 도중 리시의 세션이 갑자기 끼어들면 안 됩니다.

권한 등급 관리가 두 번째 관문입니다. 인턴은 OpenClaw로 코드를 작성할 수 있지만 운영 환경에는 접근하면 안 됩니다. 일반 개발자는 로그를 볼 수 있지만 시스템 설정을 수정하면 안 됩니다. 관리자는 모든 사람의 작업 기록을 봐야 합니다. 이런 권한은 어떻게 나누고 어떻게 집행할까요?

감사 로그 추적이 세 번째 관문입니다. 문제가 생기면 누가, 언제, 무엇을 했는지 분명히 확인할 수 있어야 합니다. “샤오리가 어제 오후 3시에 OpenClaw로 어떤 명령을 실행했나요?” 같은 질문에 답할 수 있어야 합니다.

컴플라이언스 요구사항이 네 번째 관문입니다. 어떤 회사는 ISO 27001 인증이 있고, 어떤 회사는 GDPR을 준수해야 하며, 또 어떤 회사는 내부 보안 규정을 갖고 있습니다. OpenClaw 기본 설정으로 이런 심사를 통과할 수 있을까요? 가능성은 낮습니다.

간단히 말하면 개인 도구가 신경 쓰는 것은 “쓰기 좋은가”이고, 기업 도구가 신경 쓰는 것은 “통제 가능한가”입니다. 완전히 다른 방향입니다.

실제 사례: 어느 기술 회사의 교훈

제가 아는 친구 한 명은 SaaS 회사에서 기술 총괄을 맡고 있습니다. 올해 1월 OpenClaw가 막 뜨기 시작했을 때, 그 팀의 개발자 몇 명이 스스로 OpenClaw를 설치해 즐겁게 사용했습니다. IT 부서에 보고하지도 않았고 정식 소프트웨어 구매 절차도 거치지 않았습니다. 전형적인 Shadow IT였습니다.

2월에 문제가 터졌습니다. 한 개발자가 OpenClaw로 운영 환경 문제를 디버깅하면서 데이터베이스 연결 문자열을 채팅창에 그대로 붙여 넣고, 느린 쿼리를 분석해 달라고 요청했습니다. OpenClaw는 실제로 최적화 제안을 해줬지만, 그 대화와 데이터베이스 비밀번호가 모두 로컬 ~/.openclaw/sessions 디렉터리에 저장되었습니다.

더 나쁜 점은 그 개발자의 노트북이 암호화되어 있지 않았다는 것입니다. 어느 날 그는 카페에서 일하다가 전화를 받으러 나가면서 화면을 잠그지 않았습니다. 돌아왔을 때 노트북은 그대로 있었고 별일 아니라고 생각했습니다. 일주일 뒤, 누군가가 그 데이터베이스 계정으로 로그인을 시도하고 있다는 사실이 발견되었습니다. 여러 번 실패한 뒤 알림이 발생했습니다.

로그를 뒤지고, 모니터링을 확인하고, 보안팀에 물어본 끝에 유출 원인이 바로 그 노트북이라는 결론에 도달했습니다. 카페에서 누군가 화면을 봤을 수도 있고, 노트북에 손을 댔을 수도 있습니다. 이미 정확히 알 수는 없었습니다. 다행히 데이터베이스에는 화이트리스트가 설정되어 있어서 외부 IP에서는 접속할 수 없었고 실질적인 손실은 없었습니다. 하지만 이 일은 CTO를 식은땀 나게 만들었습니다.

사후 회고에서 문제는 세 곳에 있었습니다.

  1. 승인 절차 부재: 개발자가 도구를 임의로 배포했고 IT 부서는 전혀 몰랐습니다.
  2. 감사 로그 부재: 사고 후에도 누가 OpenClaw로 무엇을 했는지 명확히 확인할 수 없었습니다.
  3. 민감 정보 관리 부재: 세션 기록이 평문으로 저장되었고 암호화도, 정기 정리도 없었습니다.

꽤 아픈 교훈이었습니다. 그 친구 말로는 이제 회사에서 모든 AI 도구는 보안 심사를 거쳐야 하고, OpenClaw도 계속 쓸지, 쓴다면 어떻게 쓸지 다시 평가 중이라고 합니다.

엔터프라이즈 배포 아키텍처 설계

아키텍처 선택: 다중 인스턴스 vs 멀티테넌트

당시 우리 팀이 OpenClaw 엔터프라이즈 배포 방안을 논의할 때 주로 고민한 방향은 두 가지였습니다.

방안 A: 다중 인스턴스 배포

단순하고 직관적인 방식입니다. 팀이나 프로젝트마다 독립 OpenClaw 인스턴스를 하나씩 둡니다. 프론트엔드 팀 하나, 백엔드 팀 하나, 테스트 팀 하나처럼요.

장점은 분명합니다. 각자 관리하고 서로 간섭하지 않습니다. 프론트엔드 팀의 OpenClaw가 죽어도 백엔드에는 영향이 없습니다. 테스트 팀이 새 버전으로 업그레이드하고 싶으면 마음껏 시도할 수 있습니다. 리소스 격리가 철저하고 보안성도 높습니다.

단점도 적지 않습니다. 먼저 리소스 낭비가 있습니다. 인스턴스마다 메모리, CPU, 스토리지를 차지하고 팀이 열 개면 비용도 열 배입니다. 또 유지보수 비용도 늘어납니다. 설정 하나를 업데이트하려면 열 번 바꾸고, 플러그인 하나를 설치하려면 열 번 작업해야 합니다. 운영 담당자가 듣기만 해도 싫어할 만합니다.

우리는 다중 인스턴스 배포를 이렇게 정의했습니다. 10-50명 규모의 중소규모 팀에 적합합니다. 팀이 많지 않으면 유지보수 부담을 감당할 수 있고, 격리성도 충분합니다.

방안 B: 멀티테넌트 아키텍처

OpenClaw 인스턴스는 하나만 배포하고 내부에서 멀티테넌트 격리를 구현합니다. 모든 팀이 이 인스턴스를 공유하고, 테넌트 ID로 데이터와 권한을 구분합니다.

장점은 리소스 활용률입니다. 서버 한 대가 회사 전체 OpenClaw 수요를 처리하니 비용을 크게 줄일 수 있습니다. 관리도 편합니다. 설정은 한 번만 바꾸면 전체에 반영되고 모니터링 패널도 하나만 보면 됩니다.

단점은 기술 복잡도가 급격히 높아진다는 것입니다. 코드 레벨에서 테넌트 격리를 구현해야 합니다. 장산은 리시의 세션 기록을 볼 수 없어야 하고, A 프로젝트는 B 프로젝트 파일에 접근할 수 없어야 합니다. 구현에 빈틈이 생겨 데이터가 섞이면 큰 사고입니다.

우리는 멀티테넌트 아키텍처를 이렇게 권장했습니다. 100명 이상의 대기업에 적합합니다. 사람이 많아야 리소스 절감 효과가 의미 있고, 동시에 멀티테넌트 복잡성을 처리할 기술팀도 있어야 합니다.

우리의 선택은?

솔직히 말하면 당시 우리 팀은 30명뿐이었고, 이론상 다중 인스턴스면 충분했습니다. 하지만 저는 이것저것 시도해 보는 걸 좋아해서 굳이 멀티테넌트를 테스트해 봤습니다. 결과는 2주 만에 알게 되었습니다. 테넌트 격리에는 함정이 너무 많았습니다. 데이터베이스 쿼리마다 tenant_id 필터를 붙여야 하고, 파일 접근은 권한을 검사해야 하며, 로그 기록에는 테넌트 정보를 넣어야 했습니다. 손댈 곳이 너무 많았습니다.

결국 현실적으로 다중 인스턴스를 선택했습니다. 개발팀, 테스트팀, 운영팀에 각각 하나씩 총 3개 인스턴스를 두고, 설정을 일괄 업데이트하는 스크립트를 붙여 문제를 해결했습니다.

기술 스택 선택

다중 인스턴스 배포를 선택하고 나니 기술 스택은 정하기 쉬웠습니다.

컨테이너화는 필수입니다. Docker로 OpenClaw를 패키징하고 Docker Compose로 여러 컨테이너를 관리합니다. 장점은 무엇일까요? 환경 일관성, 빠른 배포, 쉬운 롤백입니다. 테스트 환경에서 통과한 이미지를 생산 환경에 그대로 복사하면 됩니다. “내 컴퓨터에서는 되는데요” 같은 논쟁을 줄일 수 있습니다.

# docker-compose.yml
version: '3.8'
services:
  openclaw:
    image: openclaw/openclaw:latest
    container_name: openclaw-dev
    environment:
      - NODE_ENV=production
      - RBAC_ENABLED=true
      - TENANT_ID=dev-team
    volumes:
      - ./config:/etc/openclaw
      - ./data:/data
    ports:
      - "3000:3000"
    restart: unless-stopped

데이터베이스는 PostgreSQL을 선택했습니다. OpenClaw 자체가 데이터베이스를 강제하지는 않지만, 사용자 권한, 감사 로그, 세션 기록을 저장하려면 믿을 수 있는 저장소가 필요합니다. PostgreSQL은 안정적이고 오픈소스이며 기능이 강력합니다. 행 수준 보안 정책(RLS)도 지원하므로 멀티테넌트 시나리오에도 쓸 수 있습니다.

로그 수집은 ELK Stack을 사용했습니다. Elasticsearch는 로그를 저장하고, Logstash는 수집과 처리를 맡고, Kibana는 시각화를 담당합니다. 감사 로그, 오류 로그, 접근 로그를 모두 이곳으로 보내면 문제가 생겼을 때 검색만으로 위치를 찾을 수 있습니다.

모니터링은 Prometheus + Grafana를 사용했습니다. Prometheus가 CPU, 메모리, 요청 수 같은 지표를 수집하고 Grafana가 차트와 대시보드를 그립니다. 서비스가 죽거나 응답이 느려지면 알림이 즉시 Slack으로 갑니다.

Kubernetes는요? 우리는 도입하지 않았습니다. 30명 팀, 3개 인스턴스라면 Docker Compose로 충분했습니다. K8s는 학습 비용이 높고 운영이 복잡해서 가성비가 맞지 않았습니다. 회사에 이미 K8s 클러스터가 있다면 바로 써도 좋습니다. 하지만 OpenClaw 때문에 처음부터 K8s를 구축하는 것은 필요하지 않습니다.

네트워크 아키텍처 설계

네트워크에서는 보안이 최우선입니다.

리버스 프록시는 Nginx를 사용합니다. 모든 외부 요청은 먼저 Nginx에 도착하고, Nginx가 뒤쪽 OpenClaw 인스턴스로 분배합니다. SSL 종료, 속도 제한, 로드 밸런싱을 할 수 있고 접근 제어도 한곳에서 설정할 수 있습니다.

# nginx.conf
upstream openclaw_backend {
    server openclaw-dev:3000;
    server openclaw-test:3001;
    server openclaw-ops:3002;
}

server {
    listen 443 ssl http2;
    server_name openclaw.company.com;

    ssl_certificate /etc/nginx/ssl/cert.pem;
    ssl_certificate_key /etc/nginx/ssl/key.pem;

    location / {
        proxy_pass http://openclaw_backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        # IP 화이트리스트
        allow 10.0.0.0/8;      # 회사 사내망
        allow 172.16.0.0/12;   # VPN 대역
        deny all;
    }
}

사내망 접근만 허용합니다. OpenClaw는 공용 인터넷에 공개하지 않고 회사 VPN이나 사내망을 통해서만 접근하게 합니다. 이렇게 하면 계정과 비밀번호가 유출되더라도 외부에서는 접속할 수 없습니다.

API Gateway는 상황에 따라 선택합니다. 회사에 Kong이나 Traefik 같은 API Gateway가 이미 있다면 붙여서 인증, 속도 제한, 로그를 통합 관리할 수 있습니다. 우리는 쓰지 않았습니다. Nginx로 충분했고 복잡도를 한 층 더 늘리고 싶지 않았습니다.

핵심 원칙은 하나입니다. 밖은 느슨하게, 안은 빡빡하게입니다. 사내망 접근은 되도록 편하게 해서 개발자 경험을 살리되, 경계 방어는 엄격해야 합니다. 들어오면 안 되는 것은 단호하게 막아야 합니다.

다중 사용자 관리와 권한 제어

RBAC 권한 모델 설계

권한 문제는 저도 처음에는 어떻게 나눠야 할지 명확하지 않았습니다. 이후 몇몇 엔터프라이즈 시스템의 방식을 참고해 RBAC(역할 기반 접근 제어)를 쓰기로 했습니다.

세 가지 역할, 명확한 분업

우리는 세 가지 역할을 정했습니다.

  1. 관리자(Admin): 기술 책임자나 아키텍트 수준의 사람입니다. 전역 설정, 사용자 추가/삭제, 모든 사람의 감사 로그 조회, 시스템 파라미터 조정이 가능합니다. 권한이 큰 만큼 책임도 큽니다.

  2. 개발자(Developer): 일반 엔지니어입니다. OpenClaw로 코드를 작성하고 문서를 찾고 문제를 디버깅할 수 있으며 자기 작업 기록은 볼 수 있습니다. 다른 사람의 기록은 볼 수 없습니다. 시스템 설정도 수정할 수 없습니다.

  3. 감사자(Auditor): 보안팀과 컴플라이언스 팀 사람입니다. 읽기 전용 권한으로 모든 감사 로그를 볼 수 있지만 OpenClaw를 사용할 수 없고 설정도 바꿀 수 없습니다. 오직 사후 추적과 컴플라이언스 점검을 위한 역할입니다.

권한 매트릭스는 다음과 같습니다

작업관리자개발자감사자
OpenClaw 사용✓✓✗
시스템 설정 수정✓✗✗
모든 로그 조회✓✗✓
사용자 관리✓✗✗
개인 로그 조회✓✓✗

이 설계는 단순하지만 충분히 쓸 만합니다. 회사 상황에 맞춰 역할을 더할 수도 있습니다. 예를 들어 “시니어 개발자”는 운영 환경 접근이 가능하고, “인턴”은 테스트 환경에서만 사용할 수 있게 확장할 수 있습니다.

구현 방식

권한 모델을 설계했다면 이제 어떻게 구현할지 결정해야 합니다. 길은 두 가지입니다.

방안 1: Composio 사용(간편함)

Composio는 AI Agent에 엔터프라이즈 기능을 제공하는 플랫폼입니다. RBAC와 감사 로그 같은 기능이 내장되어 있습니다. OpenClaw와 통합하기도 비교적 쉽고 공식 문서도 있습니다.

제가 직접 해보니 확실히 빠릅니다. SDK를 설치하고 역할 정의를 설정하면 반나절 만에 돌아갑니다. 감사 로그는 자동 수집되고 권한 검사도 자동으로 처리되어 직접 코드를 많이 쓸 필요가 없습니다.

단점은 의존성이 한 층 늘어난다는 점입니다. Composio에는 무료 버전이 있지만 고급 기능은 유료입니다. 또 서드파티 서비스를 신뢰해야 합니다. 그들이 데이터가 로컬을 벗어나지 않는다고 말하더라도 민감한 회사는 여전히 불안할 수 있습니다.

방안 2: 자체 권한 시스템 구축(번거롭지만 제어 가능)

직접 코드로 RBAC를 구현합니다. Node.js 미들웨어가 요청을 가로채 사용자 역할과 권한을 확인하고, PostgreSQL에 사용자 테이블과 역할 설정을 저장하며, JWT Token으로 인증합니다.

이 길은 작업량이 더 많지만 완전히 통제할 수 있다는 장점이 있습니다. 모든 코드가 우리 손에 있고, 원하는 대로 바꿀 수 있으며 외부 서비스에 의존하지 않습니다. 데이터 유출 걱정도 줄어듭니다.

우리는 결국 자체 구축을 선택했습니다. Composio를 신뢰하지 않아서가 아니라, 회사 보안팀이 모든 사용자 데이터는 사내망 안에 있어야 하며 외부 API를 호출하면 안 된다고 요구했기 때문입니다. 규정이 그러니 방법이 없었습니다.

설정 예시

자체 권한 시스템의 핵심은 이 설정 파일입니다. 우리가 사용한 예시를 그대로 붙입니다. 참고해도 됩니다.

설명: rbac-config.yaml, /etc/openclaw/rbac-config.yaml 등은 이 글에서 사용하는 기업 자체 오케스트레이션 계층의 예시 파일명이며, OpenClaw upstream이 기본 제공하는 파일이 아닙니다. Gateway와 채널 같은 런타임 설정은 여전히 ~/.openclaw/openclaw.json 및 공식 문서를 기준으로 해야 합니다.

# rbac-config.yaml
roles:
  - name: admin
    description: 시스템 관리자
    permissions:
      - openclaw:use          # OpenClaw 사용
      - openclaw:config       # 시스템 설정 수정
      - audit:read_all        # 모든 감사 로그 조회
      - user:manage           # 사용자 관리
      - session:view_all      # 모든 세션 조회

  - name: developer
    description: 개발자
    permissions:
      - openclaw:use          # OpenClaw 사용
      - audit:read_own        # 개인 로그 조회
      - session:view_own      # 개인 세션 조회

  - name: auditor
    description: 감사자
    permissions:
      - audit:read_all        # 모든 감사 로그 조회
      - session:view_all      # 모든 세션 조회(읽기 전용)

users:
  - email: [email protected]
    role: admin
    enabled: true

  - email: [email protected]
    role: developer
    enabled: true

  - email: [email protected]
    role: developer
    enabled: true

  - email: [email protected]
    role: auditor
    enabled: true

이 파일과 함께 미들웨어를 하나 작성했습니다.

// auth-middleware.js
const jwt = require('jsonwebtoken');
const rbacConfig = require('./rbac-config.yaml');

function checkPermission(requiredPermission) {
  return (req, res, next) => {
    const token = req.headers.authorization?.split(' ')[1];

    if (!token) {
      return res.status(401).json({ error: '인증되지 않은 접근' });
    }

    try {
      const decoded = jwt.verify(token, process.env.JWT_SECRET);
      const user = rbacConfig.users.find(u => u.email === decoded.email);

      if (!user || !user.enabled) {
        return res.status(403).json({ error: '사용자가 비활성화되었습니다' });
      }

      const role = rbacConfig.roles.find(r => r.name === user.role);

      if (!role.permissions.includes(requiredPermission)) {
        return res.status(403).json({ error: '권한이 부족합니다' });
      }

      req.user = user;
      next();
    } catch (error) {
      return res.status(401).json({ error: 'Token이 유효하지 않습니다' });
    }
  };
}

module.exports { checkPermission };

사용 방식은 다음과 같습니다.

// OpenClaw 사용에는 openclaw:use 권한이 필요합니다
app.post('/api/openclaw/chat',
  checkPermission('openclaw:use'),
  openclawController.chat
);

// 감사 로그 조회에는 audit:read_all 권한이 필요합니다
app.get('/api/audit/logs',
  checkPermission('audit:read_all'),
  auditController.getLogs
);

최소 권한 원칙

권한 시스템을 만들었다면 한 가지 세부 사항도 놓치면 안 됩니다. 바로 최소 권한 원칙입니다.

OpenClaw 프로세스를 root로 실행하지 말고, 자기 계정으로도 실행하지 마세요. openclaw-service 같은 전용 사용자를 만들고 필요한 권한만 부여합니다.

# 전용 사용자 생성
sudo useradd -r -s /bin/false openclaw-service

# 작업 디렉터리 생성
sudo mkdir -p /var/lib/openclaw
sudo chown openclaw-service:openclaw-service /var/lib/openclaw

# 파일 접근 권한 제한
sudo chmod 750 /var/lib/openclaw

그다음 Docker Compose에서 실행 사용자를 지정합니다.

services:
  openclaw:
    image: openclaw/openclaw:latest
    user: "1001:1001"  # openclaw-service의 UID:GID
    volumes:
      - /var/lib/openclaw:/data

이렇게 하면 어떤 장점이 있을까요? OpenClaw가 침해되더라도 공격자가 얻는 것은 제한된 openclaw-service 사용자 권한뿐입니다. 시스템의 다른 부분에는 접근할 수 없어 손실을 통제할 수 있습니다.

네트워크 접근도 제한해야 합니다. 공용 인터넷 접근이 필요 없다면 주지 마세요. 내부 API만 호출하면 된다면 화이트리스트를 설정합니다.

# docker-compose.yml
services:
  openclaw:
    networks:
      - internal
    # 아웃바운드 네트워크 접근 제한
    sysctls:
      - net.ipv4.ip_forward=0

한마디로 원칙은 이렇습니다. 필요한 것만 주고, 불필요한 것은 주지 않습니다. 권한을 한 단계라도 줄일 수 있으면 줄이고, 제한을 하나라도 더 둘 수 있으면 둡니다.

보안 강화와 컴플라이언스 감사

CVE-2026-25253 취약점 수정

보안을 말하면서 OpenClaw의 고위험 취약점을 빼놓을 수 없습니다. CVE-2026-25253, CVSS 점수 8.8, 명령 주입 유형입니다.

8.8
CVSS 점수

취약점은 무엇인가요?

간단히 말하면 공격자가 정교하게 구성한 입력을 통해 OpenClaw가 임의 시스템 명령을 실행하게 만들 수 있습니다. 예를 들어 OpenClaw에게 “이 파일을 분석해줘: test.txt; rm -rf /”라고 요청했을 때, 버전이 오래되었다면 뒤쪽 삭제 명령이 실제로 실행될 수 있습니다.

듣기에는 무섭지만 실제 악용 조건은 꽤 까다롭습니다. 공격자는 먼저 OpenClaw 인스턴스에 접근할 수 있어야 하고, 특정 형식의 Prompt를 구성해야 합니다. 그래도 기업 환경은 이런 위험을 허용할 수 없습니다. 반드시 수정해야 합니다.

어떻게 수정하나요?

방법은 간단합니다. 최신 버전으로 업그레이드하면 됩니다. OpenClaw 팀은 1.2.3 버전에서 이 문제를 수정했습니다.

# 1. 먼저 현재 버전 확인
openclaw --version

# 2. 1.2.3보다 낮으면 즉시 업그레이드
npm update -g openclaw

# 3. 수정 확인
openclaw --version  # >=1.2.3이어야 합니다

Docker 배포라면 최신 이미지를 가져옵니다.

docker pull openclaw/openclaw:latest
docker-compose down
docker-compose up -d

우리가 이 취약점 공지를 발견한 때는 마침 금요일 오후 5시였습니다. 운영팀장이 단체방에서 모두를 멘션했습니다. “모든 OpenClaw 인스턴스를 즉시 중지하고 1.2.3 이상으로 업그레이드한 뒤 다시 시작하세요.” 주말에 작업해서 세 인스턴스를 모두 업그레이드했고, 다행히 문제는 없었습니다.

감사 로그 시스템

컴플라이언스 심사에서 감사 로그는 반드시 확인하는 항목입니다. 누가, 언제, 무엇을 했고, 결과가 어땠는지 기록해야 하며 변조할 수 없어야 합니다.

로그에는 무엇을 기록해야 하나요?

우리의 감사 로그는 다음 필드를 포함합니다.

{
  "userId": "[email protected]",        // 누가 했는지
  "timestamp": "2026-02-05T14:23:15Z",  // 언제 했는지
  "action": "openclaw_command",          // 무엇을 했는지
  "command": "openclaw chat",            // 구체적인 명령
  "workDir": "/home/user/project",      // 어떤 디렉터리에서
  "result": "success",                   // 결과
  "ipAddress": "10.0.5.123",            // 출발지 IP
  "sessionId": "abc123xyz"               // 세션 ID
}

로그는 어떻게 수집하나요?

우리는 ELK Stack을 사용합니다. OpenClaw 쪽에 로그 수집 스크립트를 작성하고, 작업이 있을 때마다 Logstash로 기록을 보냅니다.

// audit-logger.js
const winston = require('winston');
const LogstashTransport = require('winston-logstash/lib/winston-logstash-latest');

const logger = winston.createLogger({
  transports: [
    new LogstashTransport({
      port: 5000,
      host: 'logstash.company.com',
      node_name: 'openclaw-dev'
    })
  ]
});

function logAuditEvent(userId, action, details) {
  logger.info({
    userId,
    timestamp: new Date().toISOString(),
    action,
    ...details,
    source: 'openclaw'
  });
}

module.exports { logAuditEvent };

OpenClaw의 핵심 작업 지점에 로그 기록을 삽입합니다.

// 명령 실행 전 기록
app.post('/api/openclaw/execute', async (req, res) => {
  const { command, workDir } = req.body;

  // 감사 로그 기록
  logAuditEvent(req.user.email, 'execute_command', {
    command,
    workDir,
    ipAddress: req.ip
  });

  // 명령 실행
  try {
    const result = await executeCommand(command, workDir);

    // 성공 기록
    logAuditEvent(req.user.email, 'command_completed', {
      command,
      result: 'success'
    });

    res.json({ success: true, result });
  } catch (error) {
    // 실패 기록
    logAuditEvent(req.user.email, 'command_failed', {
      command,
      error: error.message,
      result: 'failure'
    });

    res.status(500).json({ error: error.message });
  }
});

로그는 얼마나 오래 보관해야 하나요?

우리는 ISO 27001 요구사항에 따라 감사 로그를 최소 90일 보관합니다. 만료된 로그는 자동으로 콜드 스토리지에 아카이빙하고 1년 뒤 삭제합니다.

컴플라이언스 점검 체크리스트

보안팀이 준 체크리스트를 그대로 가져왔습니다. 배포 전에 따라가며 확인해 보세요.

배포 전 점검

  • OpenClaw 버전 ≥1.2.3(CVE-2026-25253 수정 완료)
  • 모든 의존 패키지에 고위험 취약점 없음(npm audit로 확인)
  • RBAC 권한 시스템 설정 완료
  • 감사 로그 활성화 완료
  • 데이터베이스 연결 암호화 완료(SSL/TLS)
  • 세션 데이터 저장 암호화 완료

런타임 점검

  • OpenClaw 프로세스가 전용 비특권 사용자로 실행됨
  • 파일 접근 권한 최소화
  • 네트워크 접근이 사내망 또는 VPN으로 제한됨
  • API 인터페이스에 속도 제한 적용
  • 민감 정보 마스킹 처리 완료

컴플라이언스 점검

  • 감사 로그 90일 이상 보관
  • 정기 백업과 복구 가능성 확보
  • 비상 대응 계획 준비 완료
  • 월간 보안 취약점 스캔
  • 분기별 보안 검토

모든 항목에 체크가 되어야 생산 환경에 올릴 수 있습니다. 우리는 첫 번째 점검에서 열 곳 넘게 불합격했고, 일주일을 고쳐서 겨우 통과했습니다.

데이터 보안 조치

OpenClaw의 세션 기록에는 데이터베이스 비밀번호, API 키, 고객 데이터 같은 민감 정보가 들어갈 수 있습니다. 이런 것이 로컬에 저장된다면 반드시 암호화해야 합니다.

세션 기록 암호화

우리는 AES-256으로 세션 파일을 암호화했습니다. 사용자별 세션 데이터는 따로 암호화하고, 키는 환경 변수에 저장합니다. 코드에도 쓰지 않고 저장소에도 커밋하지 않습니다.

// session-encryption.js
const crypto = require('crypto');
const fs = require('fs');

const ENCRYPTION_KEY = process.env.SESSION_ENCRYPTION_KEY;
const IV_LENGTH = 16;

function encryptSession(text) {
  const iv = crypto.randomBytes(IV_LENGTH);
  const cipher = crypto.createCipheriv('aes-256-cbc', Buffer.from(ENCRYPTION_KEY, 'hex'), iv);
  let encrypted = cipher.update(text, 'utf8', 'hex');
  encrypted += cipher.final('hex');
  return iv.toString('hex') + ':' + encrypted;
}

function decryptSession(text) {
  const parts = text.split(':');
  const iv = Buffer.from(parts.shift(), 'hex');
  const encrypted = parts.join(':');
  const decipher = crypto.createDecipheriv('aes-256-cbc', Buffer.from(ENCRYPTION_KEY, 'hex'), iv);
  let decrypted = decipher.update(encrypted, 'hex', 'utf8');
  decrypted += decipher.final('utf8');
  return decrypted;
}

민감 정보 마스킹

암호화를 했더라도 로그에서는 마스킹해야 합니다. 데이터베이스 비밀번호와 API Key 같은 값은 기록할 때 별표로 처리합니다.

function maskSensitiveData(text) {
  // 데이터베이스 연결 문자열 마스킹
  text = text.replace(/password=([^;\s]+)/gi, 'password=***');

  // API 키 마스킹
  text = text.replace(/api[_-]?key[:\s=]+([a-zA-Z0-9_-]{20,})/gi, 'api_key=***');

  // JWT Token 마스킹
  text = text.replace(/Bearer\s+([A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+)/gi, 'Bearer ***');

  return text;
}

만료 데이터 정기 정리

세션 기록은 끝없이 쌓아두면 안 됩니다. 정기적으로 정리해야 합니다. 우리는 30일이 지나면 자동 삭제하도록 설정했습니다.

#!/bin/bash
# cleanup-sessions.sh

# 30일 이전 세션 파일 삭제
find /var/lib/openclaw/sessions -type f -mtime +30 -delete

# 정리 로그 기록
echo "[$(date)] Cleaned up sessions older than 30 days" >> /var/log/openclaw-cleanup.log

cron으로 매일 새벽에 한 번 실행합니다.

0 2 * * * /usr/local/bin/cleanup-sessions.sh

보안은 더 하는 편이 덜 하는 편보다 낫습니다.

운영 관리와 장애 처리

CI/CD 통합

OpenClaw를 배포했다면 지속 업데이트도 고려해야 합니다. 수동 작업은 실수하기 쉽고, 자동화가 정석입니다.

우리는 GitLab CI/CD를 사용했고 설정 파일은 다음과 같습니다.

# .gitlab-ci.yml
stages:
  - test
  - build
  - deploy

# 테스트 단계: 설정 파일 문법 검사
test:
  stage: test
  script:
    - yamllint rbac-config.yaml
    - docker-compose config -q
  only:
    - merge_requests
    - main

# 빌드 단계: Docker 이미지 빌드
build:
  stage: build
  script:
    - docker build -t openclaw-custom:$CI_COMMIT_SHA .
    - docker tag openclaw-custom:$CI_COMMIT_SHA openclaw-custom:latest
  only:
    - main

# 배포 단계: 롤링 업데이트
deploy:
  stage: deploy
  script:
    - docker-compose pull
    - docker-compose up -d --no-deps --build openclaw
    - ./scripts/health-check.sh
  only:
    - main
  when: manual  # 수동 확인 후 배포

헬스 체크 스크립트도 중요합니다. 배포 후 서비스가 실제로 올라왔는지 확인해야 합니다.

#!/bin/bash
# health-check.sh

MAX_RETRIES=30
RETRY_INTERVAL=2

for i in $(seq 1 $MAX_RETRIES); do
  HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:3000/health)

  if [ "$HTTP_CODE" = "200" ]; then
    echo "✓ OpenClaw 헬스 체크 통과"
    exit 0
  fi

  echo "OpenClaw 시작 대기 중... ($i/$MAX_RETRIES)"
  sleep $RETRY_INTERVAL
done

echo "✗ OpenClaw 시작 실패"
exit 1

모니터링 지표

출시 후에는 여러 지표를 지켜봐야 합니다. 우리는 주로 다음을 봅니다.

서비스 가용성

  • 목표: 99.9%(한 달 최대 중단 43분)
  • 모니터링 도구: Uptime Robot, 1분마다 ping
  • 알림: 3회 연속 실패 시 Slack 알림

응답 시간

  • 목표: P95 지연 < 2초(요청의 95%가 2초 안에 응답)
  • 모니터링: Prometheus 수집, Grafana 표시
  • 알림: P95가 3초를 넘으면 알림 발생

오류율

  • 목표: < 0.1%
  • 모니터링: HTTP 5xx 응답 통계
  • 알림: 오류율 1% 초과 시 즉시 알림

리소스 사용률

  • CPU: < 70%
  • 메모리: < 80%
  • 디스크: < 85%
  • 모니터링: Node Exporter + Prometheus
  • 알림: 임계값 초과 전 사전 경고

Prometheus 설정 예시:

# prometheus.yml
scrape_configs:
  - job_name: 'openclaw'
    static_configs:
      - targets: ['openclaw-dev:9090', 'openclaw-test:9091', 'openclaw-ops:9092']
    metrics_path: '/metrics'
    scrape_interval: 15s

# 알림 규칙
groups:
  - name: openclaw_alerts
    rules:
      - alert: HighErrorRate
        expr: rate(http_requests_total{status=~"5.."}[5m]) > 0.01
        for: 5m
        annotations:
          summary: "OpenClaw 오류율이 너무 높습니다"

      - alert: HighLatency
        expr: histogram_quantile(0.95, http_request_duration_seconds) > 2
        for: 10m
        annotations:
          summary: "OpenClaw 응답 시간이 너무 깁니다"

백업 복구 전략

데이터는 소중합니다. 백업은 반드시 제대로 해야 합니다.

매일 백업 스크립트:

#!/bin/bash
# daily-backup.sh

BACKUP_ROOT="/backup/openclaw"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="$BACKUP_ROOT/$TIMESTAMP"

mkdir -p "$BACKUP_DIR"

# 1. 설정 파일 백업
echo "설정 파일 백업 중..."
cp -r /etc/openclaw "$BACKUP_DIR/config"

# 2. PostgreSQL 데이터베이스 백업
echo "데이터베이스 백업 중..."
docker exec openclaw-postgres pg_dump -U openclaw openclaw_db > "$BACKUP_DIR/database.sql"

# 3. 세션 데이터 백업
echo "세션 데이터 백업 중..."
tar -czf "$BACKUP_DIR/sessions.tar.gz" /var/lib/openclaw/sessions/

# 4. 감사 로그 백업(최근 7일)
echo "감사 로그 백업 중..."
tar -czf "$BACKUP_DIR/audit-logs.tar.gz" /var/log/openclaw/

# 5. 전체 백업 디렉터리 압축
echo "백업 압축 중..."
cd "$BACKUP_ROOT"
tar -czf "$TIMESTAMP.tar.gz" "$TIMESTAMP"
rm -rf "$TIMESTAMP"

# 6. 30일 이전 백업 정리
find "$BACKUP_ROOT" -name "*.tar.gz" -mtime +30 -delete

# 7. 원격 스토리지 업로드(선택)
# aws s3 cp "$BACKUP_ROOT/$TIMESTAMP.tar.gz" s3://company-backups/openclaw/

echo "백업 완료: $BACKUP_ROOT/$TIMESTAMP.tar.gz"

복구 테스트도 정기적으로 해야 합니다. 우리는 매달 한 번 테스트 환경에 백업을 복구해 실제 장애 때 살릴 수 있는지 확인합니다.

#!/bin/bash
# restore-backup.sh

BACKUP_FILE=$1

if [ -z "$BACKUP_FILE" ]; then
  echo "사용법: ./restore-backup.sh <백업 파일 경로>"
  exit 1
fi

# 백업 압축 해제
tar -xzf "$BACKUP_FILE" -C /tmp/

BACKUP_DIR=$(basename "$BACKUP_FILE" .tar.gz)

# 설정 복구
cp -r /tmp/$BACKUP_DIR/config/* /etc/openclaw/

# 데이터베이스 복구
docker exec -i openclaw-postgres psql -U openclaw openclaw_db < /tmp/$BACKUP_DIR/database.sql

# 세션 데이터 복구
tar -xzf /tmp/$BACKUP_DIR/sessions.tar.gz -C /

echo "복구 완료. 서비스를 재시작하세요"

흔한 장애 처리

우리가 밟았던 함정을 기록해 둡니다. 뒤따르는 분들에게 도움이 되길 바랍니다.

문제 1: 사용자가 로그인할 수 없음

증상: 올바른 이메일과 비밀번호를 입력해도 “인증되지 않은 접근”이 표시됨

점검 절차:

  1. JWT Token 만료 여부 확인: jwt.verify(token, SECRET)
  2. RBAC 설정 파일 확인: 사용자가 users 목록에 있는지 확인
  3. 사용자 상태 확인: enabled 필드가 true인지 확인
  4. 감사 로그 확인: 로그인 실패 기록이 있는지 확인

해결 방법:

# Token 재생성
node scripts/generate-token.js [email protected]

# RBAC 설정 확인
cat /etc/openclaw/rbac-config.yaml | grep [email protected]

문제 2: 명령 실행 실패, “권한 부족” 표시

증상: OpenClaw가 “Permission denied” 오류를 표시함

점검 절차:

  1. 파일 권한 확인: ls -la /path/to/file
  2. OpenClaw 프로세스 사용자 확인: ps aux | grep openclaw
  3. Docker 컨테이너 사용자 확인: docker exec openclaw whoami

해결 방법:

# 파일 권한 조정
chown -R openclaw-service:openclaw-service /var/lib/openclaw
chmod -R 750 /var/lib/openclaw

# 또는 Docker Compose에서 마운트 권한 조정
# docker-compose.yml
volumes:
  - /var/lib/openclaw:/data:rw,z

문제 3: 감사 로그 유실

증상: Kibana에서 최근 로그가 조회되지 않음

점검 절차:

  1. Logstash 서비스 확인: docker logs logstash
  2. 네트워크 연결 확인: telnet logstash.company.com 5000
  3. OpenClaw 로그 확인: 전송 실패 오류가 있는지 확인

해결 방법:

# Logstash 재시작
docker-compose restart logstash

# Logstash 설정 확인
docker exec logstash cat /usr/share/logstash/pipeline/logstash.conf

# 테스트 로그 수동 전송
echo '{"test": "message"}' | nc logstash.company.com 5000

문제 4: 서비스 응답 지연

증상: OpenClaw 응답 시간이 10초를 넘음

점검 절차:

  1. 리소스 사용률 확인: docker stats
  2. 데이터베이스 성능 확인: pg_stat_statements
  3. 네트워크 지연 확인: ping api.anthropic.com

해결 방법:

# CPU와 메모리 확장
# docker-compose.yml
services:
  openclaw:
    deploy:
      resources:
        limits:
          cpus: '4'
          memory: 8G

# 또는 데이터베이스 쿼리 최적화
# 인덱스 추가, 만료 데이터 정리

# 또는 인스턴스 수를 늘려 로드 밸런싱

장애 처리 빠른 확인표:

장애 증상가능한 원인첫 대응
서비스 접근 불가컨테이너 중단docker-compose restart
로그인 실패Token 만료 또는 RBAC 설정 오류설정 파일 확인
명령 실행 지연리소스 부족CPU/메모리 사용률 확인
로그 유실Logstash 장애로그 서비스 재시작
데이터베이스 연결 실패비밀번호 오류 또는 네트워크 문제환경 변수와 네트워크 확인

결론

여기까지 OpenClaw 엔터프라이즈 배포의 전체 방안을 살펴봤습니다.

핵심 내용을 다시 정리하면 다음과 같습니다.

아키텍처 설계: 소규모 팀은 다중 인스턴스를 선택하고, 대기업은 멀티테넌트를 검토합니다. 컨테이너화는 기본이며 Docker Compose로 충분하다면 K8s까지 갈 필요는 없습니다.

권한 제어: RBAC 모델은 관리자, 개발자, 감사자의 세 가지 역할로 나눕니다. Composio를 쓸 수 있으면 쓰고, 요구사항이 높으면 직접 구축합니다. 최소 권한 원칙은 처음부터 끝까지 지켜야 합니다.

보안 강화: CVE-2026-25253은 반드시 수정해야 하고, 감사 로그는 반드시 있어야 하며, 민감 데이터는 반드시 암호화해야 합니다. 컴플라이언스 체크리스트를 하나씩 확인하고 빠뜨리면 안 됩니다.

운영 관리: CI/CD로 배포를 자동화하고, 모니터링과 알림을 빠뜨리지 않으며, 백업 복구는 정기적으로 테스트해야 합니다. 흔한 장애에 대한 대응 방안도 미리 준비해 두어야 합니다.

마지막으로 솔직히 말하자면 OpenClaw는 좋은 도구지만 기업 배포는 정말 간단하지 않습니다. 개인 사용보다 훨씬 많은 것을 고려해야 합니다. 보안, 컴플라이언스, 권한, 감사, 모니터링, 백업 중 어느 하나도 대충 넘길 수 없습니다.

우리 팀은 처음의 혼란에서 지금의 표준화된 관리까지 오는 동안 꽤 많은 함정을 밟았습니다. 이 글의 설정 파일, 스크립트, 체크리스트는 모두 실전에서 정리한 결과입니다. 완벽하다고 말할 수는 없지만 적어도 사용할 수 있고, 생산 환경에서 검증도 거쳤습니다.

OpenClaw 엔터프라이즈 배포를 평가 중이라면 먼저 작은 범위에서 파일럿을 시작하는 것을 추천합니다. 10명 정도의 팀을 하나 골라 한두 달 운영해 보고 실제 효과를 확인하세요. 절차가 정리되고 문제가 해결된 뒤 점진적으로 확대하면 됩니다.

정기 업데이트도 잊지 마세요. OpenClaw는 빠르게 반복 개발되고 있으므로 새 버전 기능과 보안 패치를 따라가야 합니다. 보안 점검도 계속해야 합니다. 분기마다 취약점을 스캔하고 반년에 한 번은 컴플라이언스 점검을 진행하세요.

기술은 변하고 도구도 변하지만, 보안 의식과 표준화된 관리는 언제나 낡지 않습니다.

OpenClaw 엔터프라이즈 배포 전체 절차

아키텍처 선택부터 보안 강화까지 이어지는 완전한 기업 배포 가이드

⏱️ Estimated time: 48 hr

  1. 1

    Step 1: 1단계: 아키텍처 선택과 기술 스택 계획

    팀 규모를 평가해 적합한 아키텍처를 선택합니다.

    **다중 인스턴스 배포**(10-50명 팀에 추천):
    • 팀/프로젝트별 독립 인스턴스
    • 리소스 격리가 철저하고 보안성이 높음
    • 유지보수 비용을 통제하기 쉬움

    **멀티테넌트 아키텍처**(100명 이상에 추천):
    • 단일 인스턴스를 공유하고 테넌트 ID로 격리
    • 리소스 활용률이 높고 중앙 관리가 쉬움
    • 기술 복잡도가 높아 전문 팀 필요

    **기술 스택 선택**:
    • 컨테이너화: Docker + Docker Compose(소규모 팀) 또는 Kubernetes(대기업)
    • 데이터베이스: PostgreSQL(RLS 행 수준 보안 지원)
    • 로그: ELK Stack(Elasticsearch + Logstash + Kibana)
    • 모니터링: Prometheus + Grafana
    • 리버스 프록시: Nginx(SSL 종료, 속도 제한, 로드 밸런싱)
  2. 2

    Step 2: 2단계: RBAC 권한 시스템 설정

    역할 기반 접근 제어를 설계하고 구현합니다.

    **세 가지 핵심 역할 정의**:
    • Admin(관리자): 전역 설정 + 사용자 관리 + 모든 로그 조회
    • Developer(개발자): OpenClaw 사용 + 개인 로그 조회
    • Auditor(감사자): 모든 로그 읽기 전용(컴플라이언스 점검)

    **구현 방식 선택**:
    • Composio(빠른 통합, 서드파티 의존)
    • 자체 구축 시스템(완전 제어 가능, 개발 비용 높음)

    **설정 파일 구조**(rbac-config.yaml):
    • roles: 역할 정의 + 권한 목록
    • users: 사용자 이메일 + 역할 할당 + 활성화 상태
    • permissions: openclaw:use, audit:read_all, user:manage 등

    **미들웨어 구현**:
    • JWT Token 인증
    • 권한 검사 인터셉터
    • 요청 단위 권한 검증

    **최소 권한 원칙**:
    • 전용 사용자 openclaw-service 생성
    • 파일 접근 권한 제한(chmod 750)
    • 네트워크 접근 제한(사내망 화이트리스트)
  3. 3

    Step 3: 3단계: CVE-2026-25253 취약점 수정과 보안 강화

    고위험 취약점을 수정하고 보안 조치를 적용합니다.

    **취약점 수정**(CVSS 8.8 명령 주입):
    • 버전 확인: openclaw --version
    • 1.2.3+로 업그레이드: npm update -g openclaw
    • Docker 배포: docker pull openclaw/openclaw:latest
    • 수정 검증: 버전 번호 재확인

    **세션 기록 암호화**(AES-256):
    • 환경 변수에 키 저장(SESSION_ENCRYPTION_KEY)
    • 사용자별 세션을 개별 암호화
    • IV를 무작위 생성하고 암호문 앞에 결합

    **민감 정보 마스킹**:
    • 데이터베이스 비밀번호: password=***
    • API 키: api_key=***
    • JWT Token: Bearer ***

    **만료 데이터 정기 정리**:
    • Cron 작업을 매일 새벽 2시에 실행
    • 30일 이전 세션 파일 삭제
    • 정리 로그 기록

    **네트워크 보안**:
    • Nginx에 IP 화이트리스트 설정
    • 사내망/VPN 접근만 허용
    • SSL/TLS 암호화 전송
  4. 4

    Step 4: 4단계: 감사 로그 시스템 배포

    완전한 감사 추적 체계를 구축합니다.

    **로그 필드 설계**:
    • userId: 작업 사용자 이메일
    • timestamp: ISO 8601 형식 타임스탬프
    • action: 작업 유형(execute_command, config_change 등)
    • command: 실제 실행 명령
    • workDir: 작업 디렉터리
    • result: success/failure
    • ipAddress: 출발지 IP
    • sessionId: 세션 식별자

    **로그 수집 흐름**:
    • Winston 로그 라이브러리 + Logstash Transport
    • 주요 작업 지점에 로그 기록 삽입
    • 성공과 실패를 모두 기록
    • Logstash로 실시간 전송

    **ELK Stack 설정**:
    • Logstash가 5000 포트 수신
    • Elasticsearch에 인덱스 저장
    • Kibana에서 시각화 조회
    • 인덱스 수명 주기 관리 설정

    **컴플라이언스 요구사항**:
    • 보관 기간: 90일 이상(ISO 27001)
    • 변조 방지: 추가만 허용하고 삭제/수정 금지
    • 아카이빙 전략: 콜드 스토리지에 1년 보관
    • 정기 검토: 분기별 보안 점검
  5. 5

    Step 5: 5단계: CI/CD와 운영 자동화

    자동 배포와 모니터링 체계를 구축합니다.

    **GitLab CI/CD 흐름**:
    • Test 단계: yamllint 설정 검사 + docker-compose 검증
    • Build 단계: 이미지 빌드 + 태그 지정
    • Deploy 단계: 롤링 업데이트 + 헬스 체크(수동 승인 필요)

    **헬스 체크 스크립트**:
    • 최대 30회 재시도, 2초 간격
    • HTTP 200 응답 확인
    • 실패 시 자동 롤백

    **모니터링 지표 설정**:
    • 서비스 가용성: 99.9% 목표(Uptime Robot)
    • 응답 시간: P95 &lt; 2초(Prometheus)
    • 오류율: &lt; 0.1%(HTTP 5xx 통계)
    • 리소스 사용률: CPU&lt;70%, 메모리&lt;80%, 디스크&lt;85%

    **알림 규칙**:
    • 높은 오류율: 5분 내 >1% 발생 시 트리거
    • 높은 지연: P95가 2초를 넘은 상태가 10분 지속
    • 리소스 알림: 임계값 초과 전 사전 경고
    • 알림 채널: Slack 통합

    **백업 복구 전략**:
    • 매일 백업: 설정+데이터베이스+세션+감사 로그
    • 압축 저장: tar.gz 형식
    • 정리 정책: 로컬 30일 + 원격 1년 보관
    • 월간 복구 테스트: 백업 사용 가능성 검증

FAQ

멀티테넌트 아키텍처보다 다중 인스턴스 배포를 추천하는 이유는 무엇인가요?
다중 인스턴스와 멀티테넌트는 각각 맞는 상황이 있으므로 팀 규모에 따라 선택해야 합니다.

**다중 인스턴스 배포의 장점**(10-50명에 추천):
• 강한 격리성: 팀별 독립 인스턴스로 장애가 서로 영향을 주지 않음
• 단순한 유지보수: 설정 스크립트로 일괄 업데이트 가능, 기술 진입 장벽 낮음
• 높은 보안성: 물리적으로 격리되어 데이터가 섞이지 않음

**멀티테넌트 아키텍처의 장점**(100명 이상에 추천):
• 높은 리소스 활용률: 단일 인스턴스가 전사에 서비스해 비용 절감 효과가 큼
• 중앙 관리: 한 번 설정하면 전체에 반영되고 모니터링 패널도 통합됨
• 전문 팀 필요: 테넌트 격리가 복잡해 데이터베이스 쿼리, 파일 접근, 로그 기록마다 테넌트 ID 필터링이 필요함

우리 30명 팀은 처음에 멀티테넌트를 시도했지만 함정이 너무 많아 2주 동안 마무리하지 못했습니다. 결국 현실적으로 다중 인스턴스를 선택했고, 3개 인스턴스와 스크립트 조합으로 문제를 깔끔하게 해결했습니다.
RBAC 권한 시스템은 Composio를 써야 할까요, 직접 구축해야 할까요?
회사의 보안 요구사항과 기술 역량에 따라 선택합니다.

**Composio 방식**(빠른 출시):
• 장점: 반나절이면 통합 완료, RBAC+감사 로그가 바로 제공되어 개발 불필요
• 단점: 서드파티 의존, 고급 기능은 유료, 민감한 회사는 외부 호출을 받아들이기 어려울 수 있음
• 적합한 경우: 스타트업, 빠른 파일럿, 서드파티 서비스 신뢰도가 높은 팀

**자체 구축 방식**(완전 제어):
• 장점: 코드를 완전히 통제하고 데이터가 사내망을 벗어나지 않으며 자유롭게 커스터마이즈 가능
• 단점: 개발 작업량이 크고 JWT 인증+미들웨어+데이터베이스 저장을 구현해야 함
• 적합한 경우: 보안 요구가 엄격하고 기술팀이 있으며 깊은 커스터마이징이 필요한 조직

우리는 보안팀이 사용자 데이터는 반드시 사내망에 있어야 한다고 요구했기 때문에 자체 구축을 선택했습니다. Node.js 미들웨어+PostgreSQL+JWT Token으로 구현했고, 일주일이 더 걸렸지만 컴플라이언스 요구에는 맞았습니다.
CVE-2026-25253 취약점은 얼마나 위험하며 어떻게 완전히 수정하나요?
OpenClaw의 고위험 명령 주입 취약점으로 CVSS 점수는 8.8입니다. 반드시 진지하게 대응해야 합니다.

**취약점 원리**:
• 공격자가 정교하게 만든 입력으로 OpenClaw가 임의 시스템 명령을 실행하게 만들 수 있음
• 예: &quot;test.txt 분석; rm -rf /&quot; 같은 입력이 삭제 명령 실행으로 이어질 수 있음
• 악용 조건: OpenClaw 인스턴스 접근 권한과 특정 Prompt 구성 필요

**완전 수정 절차**:
1. 현재 버전 확인: openclaw --version
2. 1.2.3+로 업그레이드: npm update -g openclaw 또는 docker pull openclaw/openclaw:latest
3. 수정 검증: 버전 번호가 1.2.3 이상인지 재확인
4. 회귀 테스트: 업그레이드 후 기능이 정상인지 확인

**우리의 긴급 대응**: 금요일 오후 5시에 공지를 확인하자마자 모든 인스턴스를 즉시 중지했고, 주말에 업그레이드한 뒤 월요일 검증 후 복구했습니다. 기업 환경에서는 요행을 기대하면 안 됩니다.
컴플라이언스 요구를 충족하려면 감사 로그에 무엇을 기록해야 하나요?
ISO 27001과 GDPR은 감사 로그가 누가, 언제, 무엇을 했고, 결과가 어땠는지를 기록하도록 요구합니다. 핵심 필드는 다음과 같습니다.

**필수 필드**:
• userId: 작업 사용자 고유 식별자(이메일)
• timestamp: 초 단위 타임스탬프(ISO 8601 형식)
• action: 작업 유형(execute_command, config_change, login 등)
• result: 작업 결과(success/failure/error)
• ipAddress: 출발지 IP 주소

**권장 필드**:
• command: 실제 실행 명령
• workDir: 작업 디렉터리
• sessionId: 여러 작업을 연결하기 위한 세션 식별자
• errorMessage: 실패 시 오류 정보

**저장 요구사항**:
• 보관 기간 90일 이상(ISO 27001 기준)
• 추가 전용, 삭제/수정 금지(변조 방지)
• 콜드 스토리지 정기 아카이빙(비용 최적화)
• 빠른 검색 지원(Elasticsearch)

우리는 ELK Stack으로 수집하며 명령 실행, 설정 변경, 사용자 로그인 같은 핵심 작업을 모두 실시간 기록합니다. 문제가 생기면 Kibana에서 누가 했는지 몇 초 만에 찾을 수 있습니다.
세션 기록 암호화는 꼭 필요한가요? 어떻게 구현하나요?
세션 기록에는 데이터베이스 비밀번호, API 키, 고객 데이터가 포함될 수 있으므로 암호화는 필수 보안 조치입니다.

**반드시 암호화해야 하는 이유**:
• 로컬 저장 위험: 노트북 분실, 카페에서 화면 미잠금, 악성코드 탈취
• 민감 정보 유출: 실제로 개발자가 운영 데이터베이스 연결 문자열을 채팅에 붙여넣는 사례가 있음
• 컴플라이언스 요구: ISO 27001과 GDPR 모두 민감 데이터 암호화 저장을 요구

**구현 방식**(AES-256):
• 키 관리: 환경 변수에 저장하고 코드나 저장소에 넣지 않음
• 암호화 흐름: 무작위 IV 생성 + AES-256-CBC 암호화 + IV:암호문 형식 저장
• 복호화 흐름: IV와 암호문 분리 + AES-256-CBC 복호화
• 사용자별 독립성: 사용자별 세션에 다른 키 사용

**추가 조치**:
• 민감 정보 마스킹: 로그의 비밀번호/API Key는 별표 처리
• 정기 정리: 30일이 지난 세션 자동 삭제
• 접근 제어: 사용자 본인과 감사자만 읽기 가능

우리는 Node.js crypto 모듈로 구현했고 코드는 50줄도 되지 않았지만 보안성은 크게 좋아졌습니다.
Docker 배포와 K8s 배포는 어떻게 선택하나요?
팀 규모, 운영 역량, 기존 인프라에 따라 선택합니다.

**Docker Compose 방식**(중소규모 팀에 추천):
• 적용 상황: 10-50명, 3-10개 인스턴스
• 장점: 학습 비용이 낮고 설정이 단순하며 유지보수가 쉬움
• 단점: 수동 확장, 단일 서버 장애 영향이 큼
• 도구 체인: docker-compose.yml + 헬스 체크 스크립트 + GitLab CI/CD

**Kubernetes 방식**(대기업에 추천):
• 적용 상황: 100명 이상, 기존 K8s 클러스터 보유
• 장점: 자동 확장, 고가용성, 롤링 업데이트, 자가 복구 능력
• 단점: 가파른 학습 곡선, 복잡한 설정, 높은 운영 비용
• 도구 체인: Deployment + Service + Ingress + Helm Charts

**우리의 결정**: 30명 팀은 Docker Compose를 썼습니다. 이유는 다음과 같습니다.
• 높은 가성비: 3개 인스턴스로 충분하고 K8s는 과한 선택
• 쉬운 유지보수: 설정 스크립트 일괄 업데이트, 전담 K8s 운영자 불필요
• 빠른 출시: 일주일 만에 배포 완료, K8s는 학습에만 최소 한 달

회사에 이미 K8s 플랫폼이 있다면 바로 쓰면 됩니다. 하지만 OpenClaw 하나 때문에 처음부터 K8s를 구축하는 것은 정말 필요하지 않습니다.
장애가 발생하면 어떻게 빠르게 원인을 찾고 복구하나요?
표준화된 장애 처리 흐름을 마련해 근본 원인을 빠르게 찾습니다.

**장애 처리 4단계**:
1. **빠른 손실 차단**: docker-compose restart로 서비스 복구
2. **로그 확인**: docker logs + Kibana 감사 로그로 오류 위치 파악
3. **리소스 점검**: docker stats로 CPU/메모리/디스크 확인
4. **근본 원인 분석**: 문제를 재현하고 수정한 뒤 기록

**흔한 장애 빠른 확인**:
• 접근 불가: 컨테이너 중단 → docker-compose restart
• 로그인 실패: Token 만료/RBAC 설정 오류 → 설정 파일 확인
• 실행 지연: 리소스 부족 → CPU/메모리 확장 또는 인스턴스 추가
• 로그 유실: Logstash 장애 → 로그 서비스 재시작
• 데이터베이스 연결 실패: 비밀번호 오류/네트워크 문제 → 환경 변수 확인

**예방 조치**:
• 모니터링 알림: Prometheus + Grafana 실시간 모니터링
• 헬스 체크: 배포 후 서비스 가용성 자동 검증
• 백업 복구: 매일 백업, 월간 복구 테스트
• 비상 계획: 장애 처리 매뉴얼 사전 준비

우리 경험상 장애의 90%는 재시작+로그 확인으로 5분 안에 위치를 찾을 수 있습니다. 나머지 10%는 깊은 분석이 필요하고, 이때 감사 로그와 모니터링 데이터가 핵심입니다.

6분 읽기 · 게시일: 2026년 2월 5일 · 수정일: 2026년 10월 21일

댓글

GitHub로 로그인하여 댓글을 남기세요

Easton BlogEaston Blog