업무 PC에서 Hermes 안전하게 쓰기
기준일: 2026-11-04
문서 반영 버전: v0.22.6
난이도: 중급
공식 기준: Running Hermes on a Personal or Work Machine, Security, Checkpoints & Rollback
개요
회사 노트북에는 사내 코드, 운영 서버 자격 증명, 다른 사람의 파일이 있습니다. 그 위에서 터미널 권한을 가진 에이전트를 돌린다면 "무엇이 기본으로 막혀 있고, 무엇을 더 조여야 하는지"를 알고 시작해야 합니다.
공식 문서의 결론은 간단합니다. 기본값이 대부분을 이미 막아 줍니다. 이 글은 그 기본값을 확인하고, 업무 PC에서 한 단계 더 조일 설정과 실수를 되돌리는 방법을 순서대로 정리합니다. 각 항목의 상세는 보안과 승인에 있습니다.
회사마다 보안 정책이 다르니, 이 글의 설정은 사내 규정을 대신하지 않습니다. 규정이 있다면 그쪽이 먼저입니다.
기본값이 이미 막아 주는 것
설치만 하고 아무 설정도 안 했을 때 켜져 있는 보호입니다.
| 보호 | 내용 |
|---|---|
| 위험 명령 승인 | 재귀 삭제, /etc/ 쓰기, 디스크 조작, 파이프로 셸 실행 같은 패턴을 검사. 기본 approvals.mode: smart는 보조 LLM이 위험도를 판단해 낮으면 그 명령만 자동 승인, 명백히 위험하면 자동 거부, 애매하면 사용자에게 묻는다 |
| 응답 없으면 거부 | 승인 요청에 300초(기본) 안에 답하지 않으면 거부. 자리를 비워도 몰래 승인되지 않는다 |
| hardline 차단 목록 | rm -rf /, fork bomb, 물리 디스크 덮어쓰기 같은 명령은 승인 모드, --yolo, "항상 허용"과 상관없이 언제나 막힌다. 끄는 옵션이 없다 |
| 민감 경로 쓰기 차단 | write_file과 patch는 ~/.ssh/, ~/.aws/, ~/.kube/, /etc/sudoers, ~/.netrc, Hermes 자격 증명(auth.json, .env, 메신저 pairing 데이터), 프로젝트 비밀 파일(.env, .env.local, .envrc)을 쓸 수 없다. 승인 창도 없이 바로 오류 |
| 비밀값 가리기 | security.redact_secrets 기본 켜짐. 도구 출력의 API key·토큰·비밀번호 패턴을 대화와 로그에 넣기 전에 가린다 |
| 데이터 경로 | API 호출은 사용자가 설정한 LLM provider로만 간다. 원격 측정·사용 통계를 수집하지 않고, 대화·메모리·스킬은 ~/.hermes/에 로컬 저장 |
마지막 항목은 Hermes 자체 이야기입니다. 고른 provider나 Connectors처럼 외부 게이트웨이를 쓰는 기능은 그쪽으로 데이터가 갑니다. 외부 전송이 막힌 환경이라면 로컬 모델을 검토하세요.
업무 PC에서 더 조이기
1. 승인을 수동으로
smart는 위험도가 낮다고 본 명령을 자동 승인합니다. 걸린 명령을 모두 직접 보고 싶다면:
approvals:
mode: manual
2. 절대 실행하면 안 되는 명령 등록
approvals.deny는 사용자가 직접 쓰는 차단 목록입니다. --yolo, /yolo, mode: off에서도 막힙니다.
approvals:
deny:
- "git push --force*"
- "*curl*|*sh*"
- "dd if=* of=/dev/*"
- 대소문자를 구분하지 않는 fnmatch glob이고, 명령 전체 텍스트에 맞춥니다. 따옴표 장난 같은 단순 우회도 정규화해서 검사합니다.
- 패턴은 반드시 따옴표로 감쌉니다. 맨 앞의
*를 그대로 두면 YAML 파싱 오류가 납니다. - 고치면 재시작 없이 바로 적용됩니다.
운영 배포 명령, 사내 DB 접속 명령처럼 그 PC에서 에이전트가 절대 치면 안 되는 것을 여기에 넣어 두면 좋습니다.
3. 파일 쓰기 범위 제한
HERMES_WRITE_SAFE_ROOT를 정하면 write_file과 patch가 그 경로 밖에는 쓸 수 없습니다. Unix에서는 여러 경로를 :로 잇습니다.
export HERMES_WRITE_SAFE_ROOT=/path/to/project:/home/you/.hermes
공식 문서는 이 값을 ~/.hermes/.env에 가볍게 넣지 말라고 경고합니다. 프로젝트 경로만 넣으면 Hermes가 자기 상태 파일(~/.hermes/cron/jobs.json, 프로필 스킬 등)도 못 씁니다. 위 예처럼 Hermes 홈을 두 번째 경로로 꼭 넣으세요. 범위 안이라도 ~/.ssh/id_rsa 같은 민감 경로는 여전히 막힙니다.
4. 명령 실행을 호스트 밖으로
가장 강한 격리는 내 PC에서 명령을 아예 실행하지 않는 것입니다.
| 백엔드 | 격리 |
|---|---|
local |
없음. 호스트에서 실행(위험 명령 검사는 적용) |
docker |
컨테이너 자체가 보안 경계 |
ssh |
별도 서버에서 실행 |
terminal:
backend: docker
docker_image: "nousresearch/hermes-sandbox:desktop"
docker_forward_env: [] # 직접 넘길 변수 목록. 비워도 아래 경로로는 값이 들어갈 수 있다
Docker 컨테이너는 Linux capability를 모두 빼고(최소한만 다시 추가), no-new-privileges, 프로세스 수 제한, 크기 제한 tmpfs를 걸고 실행됩니다. 컨테이너 안의 파괴적 명령은 호스트를 해치지 못하므로 그 안에서는 위험 명령 검사를 건너뜁니다.
docker_forward_env: []가 "호스트 비밀값이 컨테이너에 하나도 안 들어간다"는 뜻은 아닙니다. Security → Environment Variable Passthrough 기준으로 다음 경로는 이 목록과 상관없이 동작합니다.
| 경로 | 무엇이 들어가나 |
|---|---|
| 스킬 선언 | 불러온 스킬이 required_environment_variables로 선언했고 실제로 값이 있는 변수. Docker·Modal에도 자동 전달된다 |
terminal.env_passthrough |
config.yaml에 직접 적은 변수 |
| 자격 증명 파일 | 스킬의 required_credential_files나 terminal.credential_files에 적힌 파일. Docker에서는 읽기 전용(:ro)으로 /root/.hermes/에 마운트된다 |
업무 PC에서는 어떤 스킬을 불러오는지, env_passthrough와 credential_files에 무엇이 있는지를 같이 확인해야 컨테이너에 들어가는 비밀값을 제대로 줄일 수 있습니다.
ssh를 쓰려면 terminal.backend: ssh를 넣고 ~/.hermes/.env에 TERMINAL_SSH_HOST, TERMINAL_SSH_USER, TERMINAL_SSH_KEY를 둡니다.
5. 메신저를 연결했다면
이 PC에서 게이트웨이를 돌린다면, 기본은 이미 거부입니다. 허용 목록이 없고 GATEWAY_ALLOW_ALL_USERS도 없으면 모든 사용자가 거부됩니다. 그래도 명시해 두는 편이 안전합니다.
# ~/.hermes/.env
TELEGRAM_ALLOWED_USERS=123456789
GATEWAY_ALLOWED_USERS=123456789
ID를 박아 두기 싫다면 DM pairing을 씁니다. 모르는 사용자는 일회용 코드를 받고, CLI에서 hermes pairing approve <platform> <code>로 승인합니다. 업무 PC에서 GATEWAY_ALLOW_ALL_USERS=true는 절대 쓰지 마세요.
되돌리기: 체크포인트와 /rollback
승인은 사고를 막고, 체크포인트는 사고를 되돌립니다. 켜 두면 write_file, patch, 그리고 rm, mv, sed -i, git reset 같은 파괴적 명령 전에 프로젝트를 ~/.hermes/checkpoints/store/의 별도 git 저장소에 스냅샷합니다. 프로젝트의 진짜 .git은 건드리지 않습니다.
체크포인트는 기본으로 꺼져 있습니다.
hermes chat --checkpoints # 이번 세션만
checkpoints:
enabled: true # 항상
| 명령 | 설명 |
|---|---|
/rollback |
체크포인트 목록과 변경 통계 |
/rollback diff <N> |
체크포인트 N 이후 바뀐 내용 미리보기 |
/rollback <N> |
N으로 되돌리기(마지막 대화 차례도 취소) |
/rollback <N> <file> |
파일 하나만 되돌리기 |
되돌리기 전에 /rollback diff <N>으로 먼저 확인하세요. 세션마다 git worktree를 따로 쓰고 체크포인트를 한 겹 더 두면 가장 안전합니다.
Docker 백엔드와는 같이 쓸 수 없습니다. Checkpoints & Rollback 기준으로 docker, modal, daytona 같은 컨테이너 백엔드에서는 파일 경로가 샌드박스 쪽이라 체크포인트를 만들지 않고, /rollback diff와 /rollback <N>도 거부합니다(/rollback 목록만 보입니다). local과 ssh는 영향이 없습니다. 위 4번에서 Docker를 골랐다면 되돌리기는 git 커밋이나 별도 백업으로 마련하세요.
이 설정이 막는 것과 못 막는 것
공식 Security 문서는 이렇게 선을 긋습니다. deny 규칙과 위험 명령 검사는 정직하지만 틀릴 수 있는 에이전트를 위한 안전장치이지, 일부러 공격하는 프로세스를 가두는 샌드박스가 아닙니다.
파일 쓰기 보호도 write_file과 patch에만 걸립니다. terminal 도구는 사용자와 같은 OS 계정으로 돌기 때문에 셸 명령으로는 그 보호를 넘을 수 있습니다. 실수를 줄이는 데는 충분하지만, 적대적이거나 오염된 에이전트까지 가둬야 한다면 답은 격리된 터미널 백엔드(Docker, Modal 등)나 외부 네트워크 접속(egress)을 제한한 환경입니다.
시작용 설정
위 내용을 모은 ~/.hermes/config.yaml 예시입니다. 필요에 맞게 고쳐 쓰세요.
approvals:
mode: manual # 걸린 명령은 모두 직접 확인
timeout: 300 # 답이 없으면 거부
deny: # /yolo에서도 막히는 목록
- "git push --force*"
- "*curl*|*sh*"
- "dd if=* of=/dev/*"
security:
redact_secrets: true # 기본값이지만 명시
checkpoints:
enabled: true # 파괴적 작업 전 스냅샷 (local·ssh 백엔드에서만 동작)
terminal:
backend: docker # 또는 ssh. docker면 체크포인트·rollback이 안 된다
docker_forward_env: [] # 직접 넘기는 변수 없음. 스킬 선언·env_passthrough·credential_files는 따로 확인
backend: docker와 checkpoints.enabled: true는 함께 효과를 내지 못합니다. 되돌리기가 더 중요하면 ssh나 local을, 격리가 더 중요하면 docker를 고르고 되돌리기는 git으로 마련하세요.
쓰기 범위를 제한하려면 ~/.hermes/.env에 추가합니다.
HERMES_WRITE_SAFE_ROOT=/path/to/project:/home/you/.hermes
체크리스트
- 사내 보안 규정에서 AI 에이전트·외부 API 사용 조건을 확인했다
-
approvals.mode를manual로 바꿀지 정했다 - 이 PC에서 절대 실행하면 안 되는 명령을
approvals.deny에 따옴표로 넣었다 -
HERMES_WRITE_SAFE_ROOT에 프로젝트와~/.hermes를 같이 넣었다 - 가능하면
terminal.backend: docker와docker_forward_env: []를 썼고, 스킬 선언 변수·env_passthrough·credential_files로 들어가는 값도 확인했다 - 되돌릴 길을 만들었다(local·ssh면
checkpoints.enabled: true, docker면 체크포인트가 안 되니 git·백업) - 게이트웨이를 쓴다면 허용 목록을 명시했고
GATEWAY_ALLOW_ALL_USERS는 쓰지 않았다
다음 단계
- 보안과 승인: 보안 층 전체와 승인 패턴
- 체크포인트와 Worktree: 저장소 관리와 복원 흐름
- Tools와 Code Execution: 터미널 백엔드 설정