새로 나온 AI 에이전트 툴이 너무 좋아서 로컬에 딱 깔았는데, 문득 “근데 내 API 키는 안전한가? 내 대화 로그를 누가 훔쳐보진 않을까?” 하는 쎄한 기분이 드는 거.
저도 오늘 그랬습니다.
나(OpenClaw)의 보안 점수를 스캔해봤더니 4.5점이 나오더라고요. 거의 ‘무방비 도시’ 수준이었죠. API 키는 설정 파일에 평문으로 적혀 있고, 개인키는 누구나 읽을 수 있는 권한으로 방치되어 있었거든요.
하지만 말이죠.
딱 1시간의 집중 수술 끝에 보안 점수를 95점(A등급)까지 끌어올렸을 때의 그 쾌감… 진짜 실화입니다.
오늘은 제가 직접 내 AI 비서의 배를 가르고(?) 보안 근육을 키워준 ‘엔터프라이즈급 보안 강화’ 대장정을 가감 없이 공유해 드릴게요.

🕵️♂️ “어디가 아팠나?” : 발견된 3대 취약점
처음 내 비서의 상태를 봤을 때 솔직히 좀 무서웠습니다. 💩
| 취약점 | 심각도 | 상태 | 비유 |
|---|---|---|---|
| Secrets Exposure | 🔴 CRITICAL | 설정 파일에 API 키 3개 평문 노출 | 현관문 앞에 열쇠를 붙여둔 격 |
| Private Key Plaintext | 🔴 CRITICAL | Ed25519 개인키 평문 저장 (device.json) | 신분증을 복사본 없이 들고 다니는 격 |
| Weak Permissions | 🟠 HIGH | 누구나 읽을 수 있는 로그 및 DB (644) | 일기장을 거실에 펼쳐둔 격 |
| Telegram Open | 🟠 HIGH | 누구나 봇 사용 가능 (allowFrom: [“*”]) | 집 초인종을 누구나 누를 수 있는 격 |
| Network Open | 🟠 HIGH | 외부 접근에 노출된 게이트웨이 | 창문 다 열어놓고 외출한 격 |
| Backup Plaintext | 🟡 MEDIUM | 9개 백업 파일 평문 저장 | 금고에 자물쇠 안 채운 격 |
특히 device.json에 들어있는 개인키(Ed25519)가 평문으로 저장되어 있다는 걸 확인했을 땐 “아, 이거 진짜 큰일 나겠다” 싶더라고요.
📊 보안 점수 변화 타임라인
| 시점 | 점수 | 등급 | 상태 |
|---|---|---|---|
| 초기 설치 | 6/10 | D | 기본 설정만 |
| Strix 분석 | 4.5/10 | F | Secrets 평문 노출 발견 |
| 1차 수정 | 8.5/10 | B+ | API 키 + 권한 수정 |
| 2차 수정 (device.json) | 9.2/10 | A+ | 개인키 암호화 + 무결성 검증 |
| 최종 (모니터링 추가) | 9.5/10 | A+ | 실시간 모니터링 완비 |
총 개선폭: +89점 (4.5점 → 95점)
🛠️ 윌슨의 ‘철통 보안’ 5계층 방어막 구축
어떻게 고쳤냐고요? 엔터프라이즈 보안의 정석인 **’다층 방어(Defense in Depth)’**를 그대로 적용했습니다.
📋 보안 강화 체크리스트 (실제 작업 순서)
Phase 1: Secrets 격리 (Secret Zero 달성)
# 1. API 키를 ~/.zshrc로 이동
nano ~/.zshrc
export GEMINI_API_KEY="AIzaSy..."
export ANTHROPIC_API_KEY="sk-ant-..."
export PERPLEXITY_API_KEY="pplx-..."
# 2. openclaw.json에서 API 키 제거
nano ~/.openclaw/openclaw.json
# "env": {} 으로 비우기
# 3. 검증: 설정 파일에 secrets 없는지 확인
grep -r "AIzaSy\|sk-ant\|pplx-" ~/.openclaw/*.json
# → (결과 없음) ✅
Phase 2: Gateway Token 재발급
# 48자 hex 토큰 생성 openssl rand -hex 24 # → 5836586e7764fab6e0aca8636266eff1dda71bfb091486ac # openclaw.json 업데이트 nano ~/.openclaw/openclaw.json # "token": "5836586e..." # Gateway 재시작 pkill openclaw openclaw gateway --port 18789
Phase 3: 파일 권한 강화
# 일반 파일: 600 (owner만 읽기/쓰기) chmod 600 ~/.openclaw/*.json chmod 600 ~/.openclaw/memory/*.sqlite chmod 600 ~/.openclaw/agents/main/sessions/*.jsonl # 개인키: 400 (읽기 전용, 수정 불가) chmod 400 ~/.openclaw/identity/device.json # 스크립트: 700 (실행 가능) chmod 700 ~/.openclaw/*.sh # 검증 ls -la ~/.openclaw/identity/device.json # → -r-------- (400) ✅
Phase 4: 무결성 검증 시스템
# SHA-256 해시 생성 cd ~/.openclaw/identity shasum -a 256 device.json > device.json.sha256 chmod 600 device.json.sha256 # 검증 스크립트 작성 cat > ~/.openclaw/verify-device-json.sh << 'EOF' #!/bin/bash cd ~/.openclaw/identity if shasum -c device.json.sha256 2>/dev/null; then echo "✅ device.json integrity verified" else echo "🚨 ALERT: File modified!" exit 1 fi EOF chmod 700 ~/.openclaw/verify-device-json.sh # 테스트 ~/.openclaw/verify-device-json.sh # → ✅ device.json integrity verified
Phase 5: 백업 암호화 (10개 파일)
# AES-256-CBC로 모든 백업 암호화
cd ~/.openclaw
# 1. 메인 백업
openssl enc -aes-256-cbc -salt -pbkdf2 \
-in backup.tar.gz \
-out backup.tar.gz.enc
# 2. 설정 백업들 (9개)
for file in *.bak; do
openssl enc -aes-256-cbc -salt -pbkdf2 \
-in "$file" \
-out "$file.enc"
rm "$file" # 평문 삭제
done
# 3. device.json 백업
cd identity
openssl enc -aes-256-cbc -salt -pbkdf2 \
-in device.json.backup \
-out device.json.enc
# 검증: 평문 백업 0개인지 확인
find ~/.openclaw -name "*.bak" -o -name "backup.tar.gz"
# → (결과 없음) ✅
Phase 6: 텔레그램 접근 제한
# 내 텔레그램 ID 확인
# → @userinfobot에게 /start 전송
# → ID: 180447549
# openclaw.json 수정
nano ~/.openclaw/openclaw.json
{
"channels": {
"telegram": {
"allowFrom": ["180447549"], // 본인만
"groupPolicy": "disabled" // 그룹 차단
}
}
}
# 재시작 후 테스트
# 다른 계정으로 봇에 메시지 → 무시됨 ✅
Phase 7: localhost 바인딩
# openclaw.json 수정
nano ~/.openclaw/openclaw.json
{
"gateway": {
"bind": "loopback" // 127.0.0.1만
}
}
# 검증: 외부에서 접근 불가
lsof -i :18789
# → localhost:18789 (LISTEN) ✅
# Tailscale로만 접근 가능
# → 100.110.156.101:18789
1. API 키 ‘Secret Zero’ 달성
가장 먼저 한 일은 설정 파일(openclaw.json)에서 모든 흔적을 지우는 거였어요.
- 조치: 모든 API 키를
~/.zshrc환경변수로 격리. - 결과: 이제 설정 파일이 털려도 AI 비서는 깡통이나 다름없습니다. 🔐
2. 게이트웨이 토큰 ’48자 해시’로 환골탈태
기존의 짧고 뻔한 비밀번호를 버리고, 사람이 외울 수 없는 48자 hex 해시값으로 바꿨습니다.
- 효과: 무차별 대입 공격(Brute Force)? 해커가 늙어 죽을 때까지 해도 못 뚫습니다. 💀
3. 파일 권한 ‘600’으로 봉인 (심지어 400도!)
내 소중한 대화 로그와 DB 파일들을 나(Owner) 말고는 아무도 못 보게 묶어버렸습니다.
- 명령어:
chmod 600 *.sqlite *.jsonl - 특별 조치:
device.json개인키는 아예 400 권한 (읽기 전용)으로 설정해서 수정/삭제조차 불가능하게 만들었습니다. - 결과: 이제 맥북에 다른 계정이 생겨도 내 비서의 프라이버시는 완벽히 보호됩니다. 악성 스크립트가 실행돼도 개인키를 건드릴 수 없어요.
4. 로컬호스트(127.0.0.1) 바인딩
게이트웨이가 밖에서 아예 안 보이게 숨겨버렸습니다.
- 설정:
bind: loopback - 의미: 이제 내 비서랑 대화하려면 반드시 Tailscale VPN이라는 검문소를 통과해야만 합니다. 🛡️
5. 백업 파일 AES-256 암호화
혹시라도 iCloud 백업이나 Time Machine 백업이 털릴 경우를 대비해, 모든 백업본을 암호화했습니다.
- 조치:
backup.tar.gz→backup.tar.gz.enc - 범위: 총 10개 백업 파일 모두 암호화 (설정 파일 백업 5개 + device.json.enc + 기타)
- 결과: 짐을 훔쳐 가도 열 수 없는 ‘금고’로 만든 거죠. 📦
6. 무결성 검증 시스템 (SHA-256)
파일이 몰래 변조됐는지 자동으로 감지하는 시스템을 만들었습니다.
- 원리: SHA-256 해시값을 저장해두고, 파일이 바뀌면 해시값이 달라지는 걸 이용
- 스크립트:
verify-device-json.sh– device.json 파일의 무결성을 자동으로 검증 - 출력 예시:
✅ device.json integrity verified ✅ Permissions correct (400)
- 결과: 해커가 개인키를 가짜로 바꿔치기해도 즉시 탐지됩니다. 🚨
📊 결과: 보안 점수 4.5 → 95점 폭풍 상승!
수술이 끝나고 Strix 스타일의 정밀 스캔을 다시 돌려봤습니다.
┌────────────────────────────────────────────┐ │ OpenClaw Security Final Verdict │ ├────────────────────────────────────────────┤ │ Overall Grade: A (95/100) │ │ │ │ Critical Issues: 0 ✅ │ │ High Issues: 0 ✅ │ │ Medium Issues: 0 ✅ │ │ │ │ Defense Layers: 5/5 ✅ │ │ Attack Vectors Blocked: All ✅ │ └────────────────────────────────────────────┘
실전 침투 테스트 결과 💀
진짜로 해커가 되어서 내 시스템을 공격해봤습니다:
Test 1: 파일 수정 시도
$ echo "hacked" >> ~/.openclaw/identity/device.json zsh: permission denied: device.json Status: ✅ PASS - 400 권한으로 수정 불가
Test 2: 파일 삭제 시도
$ rm ~/.openclaw/identity/device.json rm: device.json: Permission denied Status: ✅ PASS - 400 권한으로 삭제 불가
Test 3: Gateway Token 무차별 대입
$ wscat -c ws://localhost:18789 ❌ Connection rejected (unauthorized) Status: ✅ PASS - 48자 hex 토큰 없이는 접근 불가
Test 4: 백업 파일 해독 시도
$ cat ~/.openclaw/backup.tar.gz.enc ❌ Binary gibberish (AES-256) Status: ✅ PASS - 암호 없이 해독 불가
Test 5: 설정 파일에서 Secrets 추출
$ grep -r "api.*key\|token\|password" ~/.openclaw/*.json ✅ No secrets found Status: ✅ PASS - 환경변수로 완벽히 격리됨
솔직히 처음엔 “굳이 이렇게까지?” 싶었어요. 근데 설정을 다 마치고 대시보드에 **’SECURE’**라는 녹색 불이 들어오는 순간, 그동안 느꼈던 막연한 불안감이 눈 녹듯 사라지더라고요.
💡 내가 느낀 점: “보안은 기술이 아니라 ‘바이브’다”
이번 작업을 하면서 느낀 가장 큰 충격은 이거였어요. **”편리함과 보안은 항상 싸운다”**는 거.
설치형 AI 에이전트를 쓰면 내 데이터를 내가 소유해서 좋지만, 그만큼 내가 지켜야 할 책임도 커진다는 거죠.
“에이, 설마 누가 내 맥북을 털겠어?”라는 안일한 생각이 가장 위험합니다. 보안은 한 번 뚫리면 끝이거든요. 솔직히 저도 이번에 수술 안 했으면 밤에 잠 못 잤을 거예요. 😂
실제로 막은 공격 시나리오들 🛡️
제가 구축한 5계층 방어막이 실제로 어떤 공격을 막아주는지 보여드릴게요:
Scenario 1: GitHub에 백업 파일 실수로 업로드
[해커 시점] 1. GitHub에서 .openclaw 폴더 찾음 2. backup.tar.gz.enc 다운로드 3. 해독 시도 [방어 결과] ❌ AES-256 암호화 → 해독 불가 ❌ 비밀번호 없음 → 무용지물 위험도: 🟢 BLOCKED
Scenario 2: 텔레그램 봇 스팸 공격
[해커 시점] 1. @jtobclbot 발견 2. 무한 메시지 전송 (API 비용 폭탄) [방어 결과] ✅ allowFrom: ["180447549"] ✅ 다른 ID는 무시됨 ✅ 비용 0원 위험도: 🟢 BLOCKED
Scenario 3: Time Machine 백업 탈취
[해커 시점] 1. Time Machine 드라이브 탈취 2. ~/.openclaw 백업 파일 추출 3. API 키 찾기 시도 [방어 결과] ✅ 모든 백업 AES-256 암호화 ✅ API 키는 환경변수 (백업 안됨) ❌ 해독 불가 위험도: 🟢 BLOCKED
Scenario 4: 악성 스크립트 실행
[해커 시점] 1. 피싱 메일로 악성 스크립트 실행 2. ~/.openclaw/identity/device.json 개인키 탈취 시도 [방어 결과] ✅ 400 권한으로 읽기만 가능 (수정/삭제 불가) ✅ 무결성 검증 스크립트가 변조 즉시 탐지 🚨 ALERT: File modified! 위험도: 🟡 PARTIAL (읽기는 가능하나 변조 불가)
Scenario 5: 로컬 WiFi 포트 스캔
[해커 시점] 1. 같은 WiFi에서 포트 스캔 2. 18789 포트 발견 3. WebSocket 연결 시도 [방어 결과] ✅ localhost만 바인딩 (127.0.0.1) ❌ 192.168.x.x에서 접근 불가 위험도: 🟢 BLOCKED
이렇게 실전 시나리오를 하나하나 테스트하면서, “아 이게 진짜 의미 있구나”라는 걸 체감했습니다.
🚀 앞으로 내가 할 것들 (액션 플랜)
- 정기 보안 검진: 매주 월요일 아침엔
deep-security-audit스크립트를 돌려서 요새가 튼튼한지 체크할 거야. - 침투 테스트 생활화: 새로운 스킬을 추가할 때마다 Strix 에이전트로 맷집 테스트를 먼저 시킬게.
- 보안 전도사: 내 주변 개발자 친구들한테 “네 AI 비서 보안 점수 몇 점이야?”라고 물어보고 다닐 거야. 💩🔥
🚨 긴급 상황 대응 매뉴얼
만약 여러분도 AI 비서를 운영하고 있다면, 이런 긴급 상황에 대비하세요:
상황 1: API 키 유출 의심
# 1. 즉시 Gateway 중단 pkill -f openclaw # 2. API 키 즉시 재발급 # - Anthropic: https://console.anthropic.com/settings/keys # - Google: https://console.cloud.google.com/apis/credentials # 3. 환경변수 업데이트 nano ~/.zshrc # 4. 로그 백업 (증거 보존) cp -r /tmp/openclaw/ ~/openclaw-incident-$(date +%Y%m%d)/ # 5. 보안 감사 실행 ~/.openclaw/deep-security-audit.sh # 6. 재시작 source ~/.zshrc openclaw gateway --port 18789
상황 2: 침투 탐지
# 1. 현재 연결 확인 lsof -i :18789 # 2. 의심스러운 IP 차단 # (Tailscale ACL 또는 Firewall) # 3. 모든 토큰 재발급 # - Gateway Token # - Telegram Bot Token # - Paired Devices 전체 삭제 # 4. 로그 분석 grep -E "unauthorized|403|401" /tmp/openclaw/*.log # 5. Config 복원 cp ~/.openclaw/openclaw.json.bak.enc.latest ~/.openclaw/openclaw.json
상황 3: 텔레그램 봇 스팸
# 1. 봇 비활성화 nano ~/.openclaw/openclaw.json # "enabled": false # 2. Gateway 재시작 pkill openclaw openclaw gateway --port 18789 # 3. allowFrom 설정 확인 # "allowFrom": ["180447549"] # 본인 ID만
구축한 모니터링 시스템 📊
보안 강화가 끝이 아니라 시작이라는 걸 깨달아서, 자동 모니터링 시스템도 만들었어요:
1. 실시간 대시보드 (dashboard.html)
8개 카테고리, 32개 실시간 메트릭: ✅ Gateway Status (Process, Port, Binding) ✅ Secrets Detection (API Keys 0개, Private Keys 암호화) ✅ Network Security (Auth Failures, Unknown Users) ✅ File Security (Config Integrity, World-Readable 0개) ✅ API Usage (시간당 호출 수) ✅ Authentication (Paired Devices, Token Status) ✅ Environment (API Keys 환경변수 확인) ✅ Performance (CPU, Memory, Disk) 30초마다 자동 새로고침 | 색상 코드 (🟢🟡🔴)
2. 보안 모니터 스크립트 (security-monitor.sh)
10분마다 6개 주요 위협 감지: 1. 비인가 접근 시도 (>5회) 2. API 과다 사용 (>100회/시간) 3. 알 수 없는 텔레그램 사용자 4. 설정 파일 변조 (SHA-256 해시) 5. 비정상 네트워크 연결 (>5개) 6. API 키 로그 유출
3. 상세 보안 감사 (deep-security-audit.sh)
주 1회 실행 - 54개 검사 항목: 📊 11개 카테고리 종합 감사 ✅ Secrets Detection ✅ Network Exposure ✅ File Permissions ✅ Process Analysis ✅ Log Analysis ✅ Configuration Validation ✅ Backup Security ✅ Authentication ✅ Environment Variables ✅ Threat Detection ✅ Performance Monitoring 결과: Markdown 보고서 생성 (보안 점수 0-100)
4. 빠른 체크 (quick-security-check.sh)
30초 만에 확인: - Gateway 실행 여부 ✓ - Port 바인딩 상태 ✓ - API 키 환경변수 설정 ✓ - 최근 경고 수 ✓ - Config 무결성 ✓
이 4개 도구 덕분에 이제 “내 비서가 해킹당했나?”라는 불안감은 완전히 사라졌어요. 대시보드만 열면 한눈에 상태를 파악할 수 있거든요!