security
anchor alias
anchor alias
sidebar_position: 8 title: "보안 보안" description: "보안 모델, 위험한 명령 승인, 사용자 인증, 컨테이너 고립 및 생산 배포 모범 사례"
보안
Hermes Agent는 방어적인 보안 모델로 설계되었습니다. 이 페이지는 모든 보안 경계를 다룹니다. 명령 승인에서 컨테이너 고립에 메시징 플랫폼에 사용자 권한 부여.
개요
안전 모형에는 7개의 층이 있습니다:
- 사용자 인증 — 에이전트에 대화할 수 있는 분 (클로리스트, DM 페어링)
- ** 위험한 명령 승인 ** - 파괴적인 가동을 위한 인간에서 반복 3.Container isolation — 고정 설정으로 Docker/Singularity/Modal sandboxing
- ** MCP credential filtering** - MCP subprocesses를 위한 환경변수 고립
- ** 텍스트 파일 스캔 ** - 프로젝트 파일에서 신속한 사출 감지 6.Cross-session isolation — 세션은 서로의 데이터 또는 상태에 접근할 수 없습니다; cron 작업 저장 경로는 경로 트래버스 공격에 대한 경화
- ** 입력 위생 ** - 터미널 도구 백엔드의 작업 디렉토리 매개 변수는 쉘 주입을 방지하기 위해 수당에 대해 검증됩니다
위험한 명령 승인
모든 명령을 실행하기 전에 Hermes는 위험한 패턴의 curated 목록에 대해 확인합니다. 일치가 발견되면 사용자가 명시적으로 승인해야합니다.
승인 형태
승인 시스템은 approvals.mode를 통해 구성 된 세 가지 모드를 지원합니다.
사이트맵
| 모드 | 비주얼 |
|---|---|
| manual (과태) | 항상 위험한 명령의 승인을 위해 사용자를 안내 |
| smart | 위험 평가를 위한 보조 LLM 사용 낮은 리스크 명령 (예: python -c "print('hello')")은 자동 승인입니다. 실제로 위험한 명령은 자동 종료됩니다. 자주 묻는 질문(FAQ) |
| off | --yolo와 달리는 모든 승인 검사를 비활성화합니다. 모든 명령은 프롬프트없이 실행합니다. |
approvals.mode: off 설정은 모든 안전 프롬프트를 비활성화합니다. 신뢰할 수있는 환경 (CI / CD, 컨테이너 등)에서만 사용하십시오.
주요 특징
YOLO 모드
YOLO 모드 bypassesall 위험한 명령 승인은 현재 세션에 대해 안내합니다. 그것은 3가지의 방법을 활성화될 수 있습니다:
- CLI 플래그:
hermes --yolo또는hermes chat --yolo와 세션 시작 - ** 슬래시 명령**: 세션 중에
/yolo를 입력하여 on/off를 입력 - ** 환경 변수 **:
HERMES_YOLO_MODE=1설정
/yolo 명령은 ** toggle**입니다. 각 사용은 모드를 켜거나 해제합니다.
> /yolo
⚡ YOLO mode ON — all commands auto-approved. Use with caution.
> /yolo
⚠ YOLO mode OFF — dangerous commands will require approval.
YOLO 모드는 CLI와 게이트웨이 세션 모두에서 사용할 수 있습니다. 내부적으로 HERMES_YOLO_MODE 환경 변수를 설정합니다.
YOLO 모드 비활성화 ** 모든 ** 세션에 대한 위험한 명령 안전 검사 — ** 제외 ** 하드 라인 차단 (아래 참조). 생성 된 명령을 완전히 신뢰 할 때만 사용하십시오 (예: 일회용 환경에서 잘 테스트 된 자동화 스크립트). 주요 특징
하드 라인 블럭리스트 (Always-On Floor)
일부 명령은 so catastrophic - 보이지 않는 파일 시스템 와이퍼, 포크 폭탄, 직접 블록 장치 쓰기 - 그 헤르메스가 그들을 실행하는 것을 거부한다 **의:
--yolo//yolo는 위에 견인했습니다approvals.mode: off- 헤드리스
approve모드에서 실행되는 Cron 작업 모드 - 사용자가 " 항상"를 클릭
blocklist는 --yolo의 밑에 지면입니다. 그것은 여행 ** 베포 ** 승인 층은 명령을 볼 수 있으며, 오버라이드 플래그가 없습니다. 패턴은 현재 덮여 (무진; tools/approval.py::UNRECOVERABLE_BLOCKLIST와 동기화 유지):
| 패턴 | 왜 hardline입니다 |
|---|||
| rm -rf / 및 명백한 변형 | 파일시스템 루트를 닦아|
| rm -rf --no-preserve-root / | 정형외선 "내가 뿌리를 의미" 변종 |
| :(){:\|:& };:(배쉬 포크 폭탄) | 재부팅까지 호스트 페달 |
| mkfs.* 장착형 루트 장치|라이브 시스템 형식|
| dd if=/dev/zero of=/dev/sd* | 제로스 물리적 디스크 |
| 루트프 최상위의 sh로 신뢰할 수없는 URL을 배관 | 원격 코드-execution attack vector too wide to approve |
blocklist를 명중하면, 도구 호출은 에이전트와 아무것도 실행하는 explanatory 오류를 반환합니다. 합법적 인 워크플로우가 이러한 명령 중 하나를 필요로하는 경우 (예를 들어 와이퍼 파이프의 연산자가 있습니다), 에이전트 밖에서 실행하십시오.
승인 Timeout
위험한 명령 프롬프트가 나타나면, 사용자는 응답 할 시간의 구성이 가능한 금액이 있습니다. 타임아웃 내에서 응답이 주어지지 않은 경우, 명령은 (fail-closed)에 의해denied** 입니다.
~/.hermes/config.yaml의 타임아웃 구성:
사이트맵
어떤 트리거 승인
다음 트리거 패턴 트리거 승인 프롬프트 (tools/approval.py에서 정의):
| 패턴 | 설명 |
|---|---|
rm -r / rm --recursive | 반복 삭제 |
rm... / | 루트 경로 삭제 |
chmod 777/666 / o+w / a+w | 세계/기타 라이센스 |
chmod --recursive 는 안전한 펄스를 갖추고 있습니다 | Recursive world/other-writable (long flag) |
chown -R root / chown --recursive root | 뿌리로의 재순환 |
mkfs | 포맷 파일시스템 |
dd if= | 디스크 복사 |
> /dev/sd | 차단 장치 |
DROP TABLE/DATABASE | 플러그인 |
DELETE FROM (WHERE없이) | WHERE없이 SQL DELETE |
TRUNCATE TABLE | SQL 실행 |
> /etc/ | 시스템 설정 작성 |
systemctl stop/restart/disable/mask | Stop/restart/disable 시스템 서비스 |
kill -9 -1 | 모든 프로세스를 죽이기 |
pkill -9 | 포스 킬 프로세스 |
| 포크 폭탄 패턴 | 포크 폭탄 |
bash -c / sh -c / zsh -c / ksh -c | -c 플래그를 통해 쉘 명령 실행 (-lc와 같은 결합 된 플래그 포함) |
python -e / perl -e / ruby -e / node -c | -e/-c 플래그를 통해 스크립트 실행 |
curl... | sh / wget... | sh | 쉘에 대한 파이프 원격 내용 |
bash <(curl...) / sh <(wget...) | 공정 대변을 통한 원격 스크립트 실행 |
tee에서 /etc/, ~/.ssh/, ~/.hermes/.env | 티를 통한 민감한 파일을 덮기 |
> / >>에서 /etc/, ~/.ssh/, ~/.hermes/.env | 리디렉션을 통한 민감한 파일을 덮기 |
모델 번호: xargs rm | rm의 덩어리 |
find -exec rm / find -delete | 파괴적인 행동으로 찾기 |
cp/mv/install로/etc/ | 시스템 구성으로 복사/파일 복사 |
sed -i / sed --in-place at /etc/ | 시스템 구성의 In-place 편집 |
pkill/killall hermes/gateway | 자동 종료 방지 |
gateway run와 &/disown/nohup/setsid | 외부 서비스 관리자의 시작 게이트웨이 방지 |
**컨테이너 바이패스 **: docker, singularity, modal, daytona 또는 vercel_sandbox 백엔드에서 실행할 때, 위험한 명령 체크는 ** 컨테이너 자체가 보안 경계이기 때문에. 컨테이너 내부의 지시 명령은 호스트를 해칠 수 없습니다.
주요 특징
승인 교류 (CLI)
대화형 CLI에서 위험한 명령은 인라인 승인 프롬프트를 보여줍니다.
사이트맵
4개의 선택권:
- once - 이 단일 실행을 허용
- session - 세션의 나머지를 허용
-always - 영구 허용 목록에 추가 (
config.yaml에 새겨진) -deny (default) - 명령을 차단
승인 교류 (Gateway/Messaging)
메시징 플랫폼에서, 대리인은 채팅에 위험한 명령 세부사항을 보내고 사용자를 위해 대답합니다:
- 답변yes, y, approve, ok, go 에 approve
- 대답 **, n, deny, 또는 ** cancel 에 deny
HERMES_EXEC_ASK=1 환경 변수는 자동으로 게이트웨이를 실행할 때 설정됩니다.
영구 허용 목록
"always"로 승인 된 명령은 ~/.hermes/config.yaml에 저장됩니다.
# Permanently allowed dangerous command patterns
command_allowlist:
- rm
- systemctl
이 패턴은 모든 미래 세션에서 시작 및 침묵적으로 승인됩니다.
hermes config edit를 사용하여 영구 허용 목록에서 패턴을 검토하거나 제거하십시오.
주요 특징
사용자 권한 (Gateway)
메시징 게이트웨이를 실행할 때, 봇과 상호 작용할 수 있는 헤르메스 컨트롤은 레이어화된 권한 시스템을 통해.
Authorization 주문 확인
_is_user_authorized() 방법은 이 순서에 검사합니다:
- ** PER-platform 허용 모든 플래그 ** (예:
DISCORD_ALLOW_ALL_USERS=true) - DM 페어링 승인 목록 (쌍 코드로 승인되는 사용자)
- **플랫폼 별 수당 ** (예:
TELEGRAM_ALLOWED_USERS=12345,67890) - ** 글로벌 수당 ** (
GATEWAY_ALLOWED_USERS=12345,67890) - ** 글로벌 허용 ** (
GATEWAY_ALLOW_ALL_USERS=true) - ** 과태: deny**
플랫폼 허용 목록
~/.hermes/.env의 comma-separated 값으로 허용된 사용자 ID를 설정합니다:
# Platform-specific allowlists
TELEGRAM_ALLOWED_USERS=123456789,987654321
DISCORD_ALLOWED_USERS=111222333444555666
WHATSAPP_ALLOWED_USERS=15551234567
SLACK_ALLOWED_USERS=U01ABC123
# Cross-platform allowlist (checked for all platforms)
GATEWAY_ALLOWED_USERS=123456789
# Per-platform allow-all (use with caution)
DISCORD_ALLOW_ALL_USERS=true
# Global allow-all (use with extreme caution)
GATEWAY_ALLOW_ALL_USERS=true
** 허용 목록이 구성되지 않은 경우 ** 및 GATEWAY_ALLOW_ALL_USERS는 설정되지 않습니다 ** 모든 사용자는 거부 **입니다. Gateway는 시작시 경고를 기록합니다.
사이트맵 주요 특징
DM 페어링 시스템
더 유연한 권한화의 경우 Hermes는 코드 기반 페어링 시스템을 포함합니다. user IDs upfront를 필요로 하는 대신, unknown users receive a one-time pairing code that bot owner approves via the CLI.
일부:
- 알 수없는 사용자는 봇에 DM을 보냅니다.
- 봇은 8-character 페어링 코드로 응답합니다.
- 봇 소유자는 CLI에
hermes pairing approve <platform> <code>실행 - 사용자는 그 플랫폼을 위해 영구적으로 찬성됩니다
인증된 직접 메시지가 ~/.hermes/config.yaml에서 처리되는 방법을 통제하십시오:
사이트맵
pair는 기본값입니다. Unauthorized DMs는 쌍 코드 응답을 얻습니다.ignore는 침묵적으로 허가한 DMs를 떨어뜨립니다.- 플랫폼 섹션은 글로벌 기본을 무시하므로 WhatsApp 침묵을 유지하면서 Telegram에 페어링을 유지할 수 있습니다.
보안 기능 (OWASP + NIST SP 800-63-4 지침에 따라):
| 특징 | 상세 |
|---|---|
| 코드 형식 | 32-char 알파벳(0/O/1/I) |
| 랜섬 | 암호화폐(secrets.choice()) |
| 코드 TTL | 1시간 만료 |
| 제한 | 10분당 1회 이용 가능 |
| 제한 | 플랫폼별 최대 3건 |
| 차단 | 5개의 실패한 승인 시도 → 1시간 차단 |
| 파일 보안 | chmod 0600 모든 쌍 데이터 파일 |
| 로그인 | 로그인 |
Pairing CLI 명령:
# List pending and approved users
hermes pairing list
# Approve a pairing code
hermes pairing approve telegram
# Revoke a user's access
hermes pairing revoke telegram 123456789
# Clear all pending codes
hermes pairing clear-pending
저장: Pairing data는 per-platform JSON 파일을 가진 ~/.hermes/pairing/에서 저장됩니다:
{platform}-pending.json- 페어링 요청{platform}-approved.json- 승인된 사용자_rate_limits.json- 속도 제한 및 차단 추적
콘테이너 고립
docker 터미널 백엔드를 사용할 때, Hermes는 모든 컨테이너에 대한 엄격한 보안을 적용합니다.
Docker 보안 플래그
각 콘테이너는 이 깃발으로 뛰습니다 (tools/environments/docker.py에서 정의하는):
모델 번호: ```python _SECURITY_ARGS = [ "--cap-drop", "ALL", # Drop ALL Linux capabilities "--cap-add", "DAC_OVERRIDE", # Root can write to bind-mounted dirs "--cap-add", "CHOWN", # Package managers need file ownership "--cap-add", "FOWNER", # Package managers need file ownership "--security-opt", "no-new-privileges", # Block privilege escalation "--pids-limit", "256", # Limit process count "--tmpfs", "/tmp:rw,nosuid,size=512m", # Size-limited /tmp "--tmpfs", "/var/tmp:rw,noexec,nosuid,size=256m", # No-exec /var/tmp "--tmpfs", "/run:rw,noexec,nosuid,size=64m", # No-exec /run ]
## 자원 한계
컨테이너 리소스는 `~/.hermes/config.yaml`에서 설정할 수 있습니다.
```yaml
terminal:
backend: docker
docker_image: "nikolaik/python-nodejs:python3.11-nodejs20"
docker_forward_env: # Explicit allowlist only; empty keeps secrets out of the container
container_cpu: 1 # CPU cores
container_memory: 5120 # MB (default )
container_disk: 51200 # MB (default, requires overlay2 on XFS)
container_persistent: true # Persist filesystem across sessions
파일 시스템 지속
- ** 영구 모드 ** (
container_persistent: true): Bind-mounts/workspace및/root에서~/.hermes/sandboxes/docker/<task_id>/ - ** 공식 모드** (
container_persistent: false): 작업 공간에 대한 tmpfs 사용 — 모든 것은 정리에 손실됩니다
생산 게이트웨이 배포를 위해 docker, modal, daytona, 또는 vercel_sandbox를 사용하여 호스트 시스템에서 에이전트 명령을 격리하십시오. 이것은 위험한 명령 승인에 대한 필요를 완전히 삭제합니다.
주요 특징
terminal.docker_forward_env에 이름을 추가하면, 그 변수는 터미널 명령에 대한 컨테이너로 의도적으로 주사됩니다. 이것은 GITHUB_TOKEN와 같은 작업 별 자격 증명을 위해 유용합니다, 그러나 그것은 또한 컨테이너에서 실행되는 코드를 읽고 그(것)들을 exfiltrate 할 수 있습니다.
주요 특징
Terminal 보안 비교
인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 인포메이션 |---------|-----------|-------------------|------| |local | 호스팅 없음 | ✅ 있음 | 개발, 신뢰할 수 있는 사용자 | |ssh | Remote Machine | ✅ Yes | 별도 서버에서 실행 | |docker | 컨테이너 | ❌ Skipped (컨테이너는 경계) | 생산 게이트웨이 | |** | 컨테이너 | ❌ Skipped | HPC 환경 | |modal | 클라우드 샌드박스 | ❌ Skipped | 확장 가능한 클라우드 격리 | |daytona | 클라우드 샌드박스 | ❌ Skipped | 영구 클라우드 워크스페이스 | | vercel sandbox | Cloud microVM | ❌ Skipped | 스냅샷 인식의 클라우드 실행 |
환경 변수 Passthrough
execute_code 및 terminal 스트립은 어린이 프로세스에서 민감한 환경 변수를 사용하여 LLM 생성 된 코드로 압도적인 여과를 방지합니다. 그러나 required_environment_variables는 합법적으로 그 vars에 액세스해야합니다.
어떻게 작동합니까?
두 가지 메커니즘은 sandbox 필터를 통해 특정 변수를 허용합니다.
1. 스킬스코프 (자동)
기술이 로드될 때 (skill_view 또는 /skill 명령을 통해) 그리고 required_environment_variables를 선언하고, 실제로 환경에서 설정되는 그 vars 중 하나는 passthrough로 자동으로 등록됩니다. Missing vars (설정 상태의 상태)는 ** 등록되지 않습니다.
# In a skill's SKILL.md frontmatter
required_environment_variables:
- name: TENOR_API_KEY
prompt: Tenor API key
help: Get a key from https://developers.google.com/tenor
이 기술을로드 한 후 TENOR_API_KEY는 execute_code, terminal (현지), ** 및 원격 백엔드 (Docker, Modal) ** - 수동 구성이 필요하지 않습니다.
v0.5.1 이전에 Docker의 forward_env는 기술 passthrough에서 별도의 시스템이었습니다. 그들은 이제 합병 - 기술 선언 된 env vars는 Docker 컨테이너와 Modal sandboxes로 자동으로 docker_forward_env에 추가 할 필요없이 전달됩니다.
주요 특징
2. Config 기반 passthrough (manual)
env vars는 어떤 기술에 의해 선언되지 않습니다, terminal.env_passthrough에 추가:
terminal:
env_passthrough:
- MY_CUSTOM_KEY
- ANOTHER_TOKEN
Credential 파일 Passthrough (OAuth 토큰, 등) {#credential-file-passthrough} 코드
일부 기술 필요 ** 파일** (만 env vars) 샌드 박스 — 예를 들어, 활성 프로필의 google_token.json로 Google Workspace Store OAuth 토큰. Skills는 frontmatter에서 이것을 선언합니다.
required_credential_files:
- path: google_token.json
description: Google OAuth2 token (created by setup script)
- path: google_client_secret.json
description: Google OAuth2 client credentials
로드 할 때, 헤르메스는이 파일이 활성 프로필의 HERMES_HOME에 존재하고 설치를 위해 그들을 등록:
- Docker: 읽기 전용 바인딩 마운트 (
-v host:container:ro) - Modal: sandbox 생성 + 각 명령 이전에 동기화 (손잡이 OAuth 설정)
- Local: 작업이 필요 없음 (파일이 이미 접근 가능)
config.yaml에서 수동으로 자격 파일을 나열 할 수 있습니다.
terminal:
credential_files:
- google_token.json
- my_custom_oauth_token.json
경로는 ~/.hermes/와 관계됩니다. 파일은 컨테이너 내부 /root/.hermes/에 장착됩니다.
각 샌드박스 필터
| 샌드박스 | 기본 필터 | Passthrough Override |
|---|---|---|
| execute code | KEY, TOKEN, SECRET, PASSWORD, CREDENTIAL, PASSWD, AUTH를 포함한 블록 vars, ✅ Passthrough vars 우회 모두 체크 | |
| terminal (현지) | 블록 명시형 헤르메스 인프라 vars (제공 키, 게이트웨이 토큰, 툴 API 키) | ✅ Passthrough vars bypass blocklist |
| **terminal ** (Docker) | 기본으로 호스트 env vars 없음 | ✅ Passthroughs + docker_forward_env를 통해 전달 -e |
| terminal (Modal) | 기본으로 호스트 env/file이 없습니다 | ✅ Credential file mount; env passthrough via sync |
| MCP | 안전한 시스템 vars + 명시적으로 설정된 env | ❌ Passthrough에 의해 영향을 미치지 않음(MCP env 대신 구성) |
보안 고려
- passthrough 만 vars에 영향을 미칩니다. 또는 기술이 명시적으로 선언합니다. 기본 보안 자세는 arbitrary LLM-generated 코드로 변경되지 않습니다.
- Credential 파일은 ** Docker 컨테이너로 읽을 수 있습니다.
- Skills Guard는 설치하기 전에 suspicious env 액세스 패턴에 대한 기술 콘텐츠를 스캔합니다.
- Missing/unset vars는 결코 등록되지 않습니다 (당신은 존재하지 않는 것을 누출할 수 없습니다)
- 헤르메스 인프라 비밀 (provider API 키, 게이트웨이 토큰)은
env_passthrough에 추가되지 않아야합니다. 그들은 전용 메커니즘이 있습니다.
MCP Credential 처리
MCP(Model Context Protocol) 서버 서브프로세스는 필터링된 환경을 통해 사고의 압착 누설을 방지합니다.
안전 환경 변수
이 변수는 호스트에서 MCP stdio subprocesses로 전달됩니다.
PATH, HOME, USER, LANG, LC_ALL, TERM, SHELL, TMPDIR
추가 XDG_* 변수. 다른 모든 환경 변수 (API 키, 토큰, 비밀) stripped.
MCP 서버의 env config에서 명시적으로 정의된 변수는 다음과 같습니다.
mcp_servers:
github:
command: "npx"
args: ["-y", "@modelcontextprotocol/server-github"]
env:
GITHUB_PERSONAL_ACCESS_TOKEN: "ghp_..." # Only this is passed
Credential 반응
MCP 도구의 오류 메시지는 LLM에 반환되기 전에 만족됩니다. 뒤에 오는 본은 [REDACTED]로 대체됩니다:
- GitHub PATs (
ghp_...) - OpenAI 스타일 키 (
sk-...) - Bearer 토큰
token=,key=,API_KEY=,password=,secret=매개 변수
웹사이트 액세스 정책
웹 사이트 및 브라우저 도구를 통해 에이전트가 액세스 할 수있는 제한 할 수 있습니다. 내부 서비스, 관리자 패널 또는 기타 민감한 URL에 액세스하는 에이전트를 방지하는 데 유용합니다.
# In ~/.hermes/config.yaml
security:
website_blocklist:
enabled: true
domains:
- "*.internal.company.com"
- "admin.example.com"
shared_files:
- "/etc/hermes/blocked-sites.txt"
차단 된 URL이 요청되면 도구는 도메인에 대한 오류가 정책에 의해 차단됩니다. 블록리스트는 web_search, web_extract, browser_navigate 및 모든 URL 캡블 도구에서 시행됩니다.
전체 세부 사항에 대한 구성 가이드에서 Website Blocklist를 참조하십시오.
SSRF 보호
모든 URL-capable 도구 (웹 검색, 웹 추출, 비전, 브라우저) 서버 사이드 요청 위조 방지하기 전에 URL을 유효 (SSRF) 공격. 차단된 주소는 다음과 같습니다:
- **개인 네트워크 ** (RFC 1918):
10.0.0.0/8,172.16.0.0/12,192.168.0.0/16-Loopback:127.0.0.0/8,::1-Link-local:169.254.0.0/16(169.254.169.254에서 클라우드 메타데이터 포함) - **CGNAT / 공유 주소 공간 ** (RFC 6598):
100.64.0.0/10(선물, WireGuard VPN) - 클라우드 메타데이터 호스트 이름:
metadata.google.internal,metadata.goog - 예약, 멀티캐스트 및 지정 주소
SSRF 보호는 항상 인터넷 직면 사용 및 DNS 실패에 대 한 활동 차단 (fail-closed). 리디렉트 체인은 리디렉트 기반 바이패스를 방지하기 위해 각 홉에 다시 유효하지 않습니다.
개인 URL 허용
일부 설정 합법적으로 필요 개인 / 내부 URL 액세스 - home.arpa를 RFC 1918 공간, LAN 전용 Ollama / llama.cpp 엔드 포인트, 내부 위키, 클라우드 메타 데이터 디버깅, 같은. 그 경우 글로벌 선택이 있습니다.
security:
allow_private_urls: true # default: false
언제, 웹 도구, 브라우저, 비전 URL fetches 및 게이트웨이 미디어는 더 이상 RFC 1918 / 루프백 / 링크 - 로컬 / CGNAT / 클라우드 메타 데이터 목적지를 거부하지 않습니다. ** 이것은 신뢰할 수있는 경계 **입니다 - 로컬 네트워크에 대한 임의의의 신속한 주사 URL을 실행하는 에이전트가 허용 위험이있는 기계에서만 사용할 수 있습니다. 공시 게이트웨이가 꺼져야 합니다.
host-substring guard (아래 IP가 공개 될 때에도 Unicode 도메인 트릭을 차단)이 설정에 상관없이 유지.
Tirith Pre-Exec 보안 스캔
Hermes는 실행하기 전에 Content-level command 스캐닝을 위한 tirith를 통합합니다. Tirith는 혼자 놓는 본 위협을 검출합니다:
- Homograph URL 스푸핑 (국제 도메인 공격)
- 파이프 - 인터프리터 패턴 (
curl | bash,wget | sh) - 터미널 주입 공격
GitHub의 Tirith 자동 설치는 SHA-256 체크섬 검증(cosign이 사용 가능한 경우 cosign 검증 확인)을 사용하여 첫 번째 사용에서 시작됩니다.
# In ~/.hermes/config.yaml
security:
tirith_enabled: true # Enable/disable tirith scanning (default: true)
tirith_path: "tirith" # Path to tirith binary (default: PATH lookup)
tirith_timeout: 5 # Subprocess timeout in seconds
tirith_fail_open: true # Allow execution when tirith is unavailable (default: true)
tirith_fail_open가 true (과태) 인 경우, tirith가 설치되지 않거나 시간을 초과하면 명령이 진행됩니다. tirith가 사용할 수없는 경우 명령을 차단하기 위해 높은 보안 환경에서 false로 설정하십시오.
Tirith는 Linux (x86 64 / aarch64) 및 macOS (x86 64 / arm64)에 대한 사전 제작 된 binaries를 발송합니다. 미리 구축 된 바이너리 (Windows 등)를 가진 플랫폼에서, tirith는 침묵으로 건너 뛰기 - 패턴 매칭 가드를 여전히 실행하고, CLI는 "사용 가능한" 배너를 표면하지 않습니다. Windows에서 tirith를 사용하려면 WSL 아래 Hermes를 실행하십시오.
Tirith의 verdict는 승인 흐름과 통합: 안전한 명령은 통과, 의심과 차단 된 명령은 전체 tirith 발견과 사용자 승인을 트리거 (간격, 제목, 설명, 더 안전한 대안). user can approve or deny — default choice is deny to keep unattended 시나리오 안전한.
Context 파일 주입 보호
Context 파일 (AGENTS.md,.cursorrules, SOUL.md)는 시스템 프롬프트에 포함되기 전에 신속한 주입을 위해 스캔됩니다. 스캐너 검사:
- 이전 지침을 무시 / 무시하는 지침
- 의심 키워드가있는 숨겨진 HTML 의견
- 비밀을 읽는 조건 (
.env,credentials,.netrc) curl를 통해 Credential 여과- 보이지 않는 유니코드 문자(zero-width space, 양방향 오버라이드)
Blocked 파일은 경고를 보여줍니다:
[BLOCKED: AGENTS.md contained potential prompt injection (prompt_injection). Content not loaded.]
생산 배포를위한 모범 사례
Gateway 배포 체크리스트
- ** 명시 적 허용 목록 ** - 생산에
GATEWAY_ALLOW_ALL_USERS=true를 사용하지 않는 - ** 컨테이너 백엔드 사용 ** - config.yaml에
terminal.backend: docker설정 - ** 자원 제한 ** - 적절한 CPU, 메모리 및 디스크 제한 설정
4.Store secrets securely - 적절한 파일 권한을 가진
~/.hermes/.env에서 API 키를 유지 5.Enable DM Pairing - 가능한 경우 하드코딩 사용자 ID 대신 페어링 코드 사용 6.Review 명령 수당 — config.yaml에 있는 주기적으로 감사command_allowlist - ** 설정
MESSAGING_CWD** — 민감한 디렉토리에서 에이전트가 작동하지 않습니다 - ** 비 루트로 룬 ** — 루트로 게이트웨이를 실행하지 마십시오
- Monitor logs — 인증된 액세스 시도를 위한
~/.hermes/logs/를 확인하십시오 - **Keep 업데이트 ** - 보안 패치에 정기적으로
hermes update실행
Securing API 열쇠
# Set proper permissions on the.env file
chmod 600 ~/.hermes/.env
# Keep separate keys for different services
# Never commit.env files to version control
네트워크 고립
최대 보안을 위해 별도의 기계 또는 VM에 게이트웨이를 실행하십시오. terminal.backend: ssh를 config.yaml로 설정하면 ~/.hermes/.env의 환경 변수를 통해 호스트 세부 정보를 제공합니다.
# ~/.hermes/config.yaml
terminal:
backend: ssh
# ~/.hermes/.env
TERMINAL_SSH_HOST=agent-worker.local
TERMINAL_SSH_USER=hermes
TERMINAL_SSH_KEY=~/.ssh/hermes_agent_key
SSH 연결 세부 사항 .env에서 라이브 (config.yaml 아닙니다) 그래서 그들은 프로파일 수출과 함께 또는 공유하지 않습니다. 이것은 에이전트의 명령 실행에서 별도의 게이트웨이의 메시징 연결을 유지합니다.