license: Apache-2.0 name: agentic-zero-trust-security description: | 에이전트 시스템을 위한 암호화 보안 — 제로 트러스트 에이전트 네트워킹, 서명된 메시지 엔벨로프(JWS/JWE), 역량 기반 보안(ocaps), 머클 트리 감사 추적, WASM 샌드박싱 및 형식 검증. CLI 개발 도구 보안, 에이전트 간 mTLS, 권한 경계(AI 에이전트 최소 권한), 스킬/플러그인 공급망 보안을 다룹니다. 활성화 키워드: "에이전트 보안", "제로 트러스트 에이전트", "안전한 에이전트 통신", "역량 기반 보안", "ocap", "에이전트 간 서명 메시지", "에이전트 감사 추적", "샌드박스 에이전트 실행", "에이전트 권한", "mTLS 에이전트", "암호화 검증", "에이전트 공급망", "OWASP 에이전트", "에이전트가 X를 수행했음을 증명", "변조 방지 에이전트 로그". 사용하지 않음: 애플리케이션 수준 SAST 스캐닝(security-auditor 사용), 네트워크 방화벽 규칙(infrastructure 사용), SOC2/HIPAA 규정 준수(조직 수준), 프롬프트 인젝션 방어(prompt-engineer 사용). allowed-tools: Read,Write,Edit,Bash,Glob,Grep,WebSearch,WebFetch metadata: category: 보안 및 신뢰 tags: - 제로-트러스트 - 암호화 - 에이전트-보안 - 역량-보안 - mTLS - 감사-추적 - 샌드박싱 - WASM - ocap - 형식-검증 pairs-with: - skill: 다중-에이전트-조정 reason: 다중 에이전트 시스템이 의존하는 통신 채널을 보호합니다. - skill: 에이전트-대화-프로토콜 reason: 에이전트 프로토콜을 위한 메시지 엔벨로프 서명 및 검증 - skill: 보안-감사자 reason: 코드 수준 SAST를 아키텍처 보안 패턴으로 보완합니다. category: 보안 tags:
- 제로-트러스트
- 보안
- 에이전트
- 인증
- 권한 부여
에이전트 제로 트러스트 보안
자율 AI 에이전트 시스템을 위한 암호화 보안 아키텍처입니다. 이 스킬은 기존 보안 엔지니어링과 신뢰 경계를 넘어 계획, 지속, 위임 및 실행하는 에이전트의 고유한 문제 사이의 교차점을 다룹니다.
핵심 원칙: 모든 에이전트 간 메시지, 로드된 모든 스킬, 호출된 모든 도구, 반환된 모든 결과에 대해 "항상 검증하고 절대 신뢰하지 마십시오".
의사 결정 지점
1. 위협 수준 → 검증 전략
위협 수준 평가:
├── 공개 (인터넷 에이전트, 알 수 없는 스킬)
│ ├── 조치: 전체 mTLS + JWS + 역량 토큰 + WASM 샌드박스
│ ├── 감사: 모든 작업이 머클 증명과 함께 기록됨
│ └── TTL: 최대 5분 역량 수명
├── 내부 (신뢰할 수 있는 에이전트 클러스터)
│ ├── 조치: mTLS + JWS + 역량 (더 긴 TTL)
│ ├── 감사: 일일 루트 게시와 함께 집계 로깅
│ └── TTL: 최대 1시간 역량 수명
└── 개발/테스트 (로컬 호스트, 개발)
├── 조치: 선택적 mTLS + 기본 역량
├── 감사: 로컬 파일 로그 (머클 트리 없음)
└── TTL: 최대 24시간 역량 수명
2. 에이전트 요청 → 역량 확인 → 허용/거부 로직
수신 에이전트 요청 처리:
├── 1. mTLS 인증서 체인 확인
│ ├── 유효한 CA 서명? → 계속
│ └── 유효하지 않음/만료됨? → 즉시 거부
├── 2. JWS 메시지 엔벨로프 구문 분석
│ ├── 서명 유효 + 만료되지 않음? → 계속
│ ├── 재생 감지됨 (jti 캐시)? → 거부
│ └── 서명 유효하지 않음? → 거부 + 보안 이벤트 기록
├── 3. 필요한 역량 확인
│ ├── 에이전트가 정확한 역량 보유? → 허용
│ ├── 에이전트가 더 광범위한 역량 보유? → 감쇠 + 허용
│ ├── 역량 만료됨? → 거부 + 강제 새로 고침
│ └── 일치하는 역량 없음? → 거부 + 최소 허용 제안
└── 4. 샌드박스 제약 조건으로 실행
├── WASM 스킬: CPU/메모리 제한 적용
├── 파일 작업: 역량에 대한 경로 유효성 검사
└── 네트워크 호출: 역량에 대한 대상 유효성 검사
3. 위임 체인 → 신뢰 깊이 결정
역량 위임 요청:
├── 상위 역량 위임 가능=true?
│ ├── 예 → 남은 깊이 확인
│ │ ├── 깊이 > 0 → 깊이-1로 허용
│ │ └── 깊이 = 0 → 거부 (최대 위임 도달)
│ └── 아니요 → 거부 (위임 불가)
├── 요청된 작업 ⊆ 상위 작업?
│ ├── 예 → 하위 집합 허용
│ └── 아니요 → 거부 (권한 상승 불가)
└── 신뢰 경계가 교차되었습니까?
├── 동일한 오케스트레이터 도메인 → 허용
└── 다른 도메인 → 명시적 교차 도메인 역량 필요
실패 모드
1. 앰비언트 권한 누수
탐지: grep -r "process.env" agent_code/가 역량 확인 없이 환경 변수 액세스를 보여줍니다.
증상: 에이전트가 권한이 없는 리소스에 액세스합니다.
해결 방법: 필요한 정확한 리소스로 범위가 지정된 명시적 역량 토큰으로 교체합니다.
2. 메시지 재전송 공격
탐지: 동일한 jti(메시지 ID) 또는 재생 창 내의 타임스탬프가 있는 여러 감사 로그 항목.
증상: 에이전트가 동일한 명령을 여러 번 수신하고 처리합니다.
해결 방법: 메시지 만료와 일치하는 TTL로 jti 중복 제거 캐시를 구현합니다.
3. 위임을 통한 역량 에스컬레이션
탐지: 하위 역량이 상위 역량보다 더 많은 작업을 가지고 있거나 위임 깊이가 구성된 최대값을 초과합니다. 증상: 하위 에이전트가 상위 위임자의 의도보다 더 많은 권한을 얻습니다. 해결 방법: 위임 시 감쇠 불변성 적용: 하위 역량 ⊆ 상위 역량.
4. 리소스 고갈을 통한 샌드박스 이스케이프
탐지: 에이전트 CPU 사용률 >30초 동안 >95% 또는 메모리 사용량이 샌드박스 제한에 근접. 증상: 에이전트가 제약 조건을 벗어나기 위해 무한 루프 또는 과도한 메모리 할당을 시도합니다. 해결 방법: 리소스 제한에서 에이전트 프로세스를 강제 종료하고 연료 기반 실행 계량을 구현합니다.
5. 최초 사용 신뢰(TOFU) 인증서 수락
탐지: 에이전트가 첫 번째 연결 시 CA 확인 없이 인증서를 수락합니다. 증상: 중간자 공격이 모든 인증서를 제시하여 성공합니다. 해결 방법: 모든 에이전트 인증서를 사전 프로비저닝하고, 명시적 신뢰 저장소를 유지하며, 알 수 없는 CA를 거부합니다.
실제 사례
예제 1: 다중 에이전트 메시지 서명 파이프라인
시나리오: 연구 에이전트가 코드 생성 에이전트로, 그 다음 검토 에이전트로 분석을 전달해야 합니다.
설정 단계:
// 오케스트레이터가 역량을 생성합니다
const researchCap = mint.mint('fs:/tmp/research/**', ['read','write'], 'agent-research-001');
const codegenCap = mint.mint('fs:/workspace/src/**', ['read','write'], 'agent-codegen-001');
const reviewCap = mint.mint('fs:/workspace/**', ['read'], 'agent-review-001');
메시지 흐름:
-
연구 → 코드젠: 연구 에이전트가 JWS 서명 메시지를 생성합니다:
헤더: {alg: 'EdDSA', kid: 'agent-research-001/v1'} 페이로드: { iss: 'agent-research-001', sub: 'agent-codegen-001', dag_id: 'proj-alpha-v1', action: 'task', body: {analysis: "API needs OAuth2 flow", output_path: "/tmp/research/api_analysis.json"} } -
코드젠 검증: 코드젠 에이전트가 메시지를 수신합니다:
- 연구 에이전트의 공개 키에 대해 JWS 서명 확인
- 메시지 TTL 확인 (만료되지 않음)
- 재생 캐시에 jti가 없는지 확인
- dag_id가 현재 실행 컨텍스트와 일치하는지 확인
- 전문가 포착: 연구 에이전트가 output_path에 대한 역량을 가지고 있는지 확인
-
코드젠 → 검토: 코드젠이 서명된 결과를 생성합니다:
{ "iss": "agent-codegen-001", "sub": "agent-review-001", "action": "result", "body": {"generated_files": ["/workspace/src/auth.ts"], "confidence": 0.87} }
초보자 실수: jti 재생 보호를 건너뛰어 중복 처리를 허용합니다. 전문가 통찰: 감사 추적은 암호화된 관리 증명과 함께 완전한 메시지 체인을 보여줍니다.
예제 2: 감쇠가 있는 역량 토큰 발행
시나리오: 메인 에이전트가 파일 분석을 전문화된 하위 에이전트에 위임해야 하지만 민감한 디렉토리에 대한 액세스를 제한해야 합니다.
초기 허가:
// 오케스트레이터가 광범위한 파일 시스템 액세스 권한을 부여합니다.
const mainCap = mint.mint('fs:/project/**', ['read','write','execute'], 'agent-main', {
delegatable: true,
maxDepth: 2,
ttlSeconds: 3600
});
감쇠 결정 트리:
메인 에이전트가 위임 요청 평가:
├── 하위 에이전트 요청: fs:/project/src/** [read]
│ ├── /project/src/** ⊂ /project/** ? 예
│ ├── [read] ⊂ [read,write,execute] ? 예
│ ├── 위임 깊이 2 > 0 ? 예
│ └── 허용: 감쇠된 역량 생성
├── 하위 에이전트 요청: fs:/project/secrets/** [read]
│ ├── 경로에 "secrets" 포함 → 보안 정책 위반
│ └── 거부: 민감한 경로 제외
└── 하위 에이전트 요청: fs:/etc/passwd [read]
├── /etc/passwd ⊂ /project/** ? 아니요
└── 거부: 승인된 범위 밖
생성된 감쇠 역량:
const subCap = mint.attenuate(mainCap, 'agent-analyzer-001', ['read']);
// 결과: fs:/project/src/** [read] delegatable=true maxDepth=1 ttl=3600s
초보자 실수: 제한 없이 전체 상위 역량을 부여합니다. 전문가 통찰: 감쇠는 암호화 수준에서 "권한을 절대 상승시키지 않음"을 적용합니다.
예제 3: 트레이드오프 분석을 통한 샌드박스 정책 위반 감지
시나리오: 코드 생성 에이전트가 실행 중에 네트워크에 액세스하려고 시도하여 샌드박스 정책을 위반합니다.
샌드박스 구성:
const codegenSandbox = {
fileRead: ['/workspace/src/**', '/workspace/package.json'],
fileWrite: ['/workspace/src/**'],
netConnect: false, // 네트워크 액세스 없음
maxExecutionMs: 300000,
maxMemoryMb: 512
};
위반 감지 흐름:
-
에이전트 작업: 코드젠이
fetch('https://api.github.com/repos/...')시도 -
샌드박스 차단: WASM 런타임이 네트워크 소켓에 대한 시스템 호출을 포착합니다.
-
정책 확인:
netConnect: false→ 위반 감지됨 -
트레이드오프 분석:
보안 대 기능 간 트레이드오프: ├── 엄격 (현재): 네트워크 차단, 에이전트 종료 │ ├── 장점: 제로 네트워크 공격 표면 │ ├── 단점: 외부 종속성/문서를 가져올 수 없음 │ └── 결정: 적용 (보안 우선 환경) ├── 중간: 특정 허용 도메인 허용 │ ├── 장점: 알려진 양호한 API에 대해 기능적임 │ ├── 단점: DNS 중독, 하위 도메인 탈취 위험 │ └── 결정: 개발 환경에만 고려 └── 관대: 기록하지만 허용 ├── 장점: 전체 기능 유지 ├── 단점: 에이전트가 데이터를 유출하거나 맬웨어를 다운로드할 수 있음 └── 결정: 거부 (제로 트러스트 모델 위반) -
응답: 에이전트 종료, 보안 이벤트 기록:
{ "event": "sandbox_violation", "agent_id": "agent-codegen-001", "violation_type": "unauthorized_network_access", "attempted_url": "api.github.com", "policy_matched": "netConnect: false", "action_taken": "terminate_agent" }
초보자 실수: "이번 한 번만" 네트워크 액세스를 허용하거나 위반을 감지하지 못합니다. 전문가 통찰: 샌드박스 위반은 잠재적인 손상 또는 모델 표류를 나타냅니다. 항상 엄격하게 적용하십시오.
품질 게이트
- 모든 에이전트는 고유한 암호화 ID(Ed25519 키 쌍 + 인증서)를 가집니다.
- 모든 에이전트 간 채널은 인증서 확인이 포함된 상호 TLS를 사용합니다.
- 모든 메시지는 <5분 TTL 및 jti 재생 보호 기능이 있는 JWS 서명을 전달합니다.
- 역량 토큰은 ocap 모델을 따릅니다 (어디에도 앰비언트 권한 없음).
- 역량 위임은 감쇠 불변성을 유지합니다 (하위 ⊆ 상위 권한).
- 감사 추적은 게시된 루트가 있는 추가 전용 머클 트리를 사용합니다.
- 모든 스킬 실행은 WASM 또는 컨테이너 샌드박스에서 발생합니다.
- 리소스 제한이 적용됩니다 (CPU, 메모리, 실행 시간, 네트워크).
- 스킬 패키지는 콘텐츠 주소 지정 및 작성자 서명됩니다.
- 어떤 에이전트도 서명되지 않았거나 확인되지 않은 스킬/입력을 수락하지 않습니다.
- 인증서 순환은 <24시간 인증서 수명으로 자동화됩니다.
- 재생 감지 캐시는 메시지 만료와 일치하는 TTL로 작동합니다.
- 모든 보안 위반은 타임스탬프 + 에이전트 ID + 수행된 작업과 함께 기록됩니다.
사용하지 말아야 할 경계
이 스킬은 다음에 사용해서는 안 됩니다:
- 애플리케이션 수준 취약점 스캐닝 → 대신
security-auditor사용 - 네트워크 방화벽/WAF 구성 → 대신
infrastructure-engineer사용 - SOC2/HIPAA 규정 준수 문서화 → 조직 규정 준수 프로세스 사용
- 프롬프트 인젝션 방어 → 대신
prompt-engineer스킬 사용 - 속도 제한 또는 DDoS 방어 → API 게이트웨이 구성 사용
- 컨테이너 오케스트레이션 보안 → 대신
devops-automator스킬 사용
위임 경계:
- 코드 수준 보안 문제 →
security-auditor - 인프라 강화 →
infrastructure-engineer - 안전한 코딩 관행 →
software-engineer - 사고 대응 →
security-incident-response