AI 에이전트는 기존 웹 애플리케이션과 근본적으로 다른 보안 위협을 가진다. 정해진 입력에 정해진 출력을 내는 전통 앱과 달리, 에이전트는 자율적으로 도구를 호출하고 파일을 수정하며 외부 API를 실행한다. 이 자율성이 바로 위험 요인이 된다. Docker Sandboxes를 이용한 격리 전략을 중심으로 실무적인 보안 접근법을 정리한다.
에이전트가 다른 보안 모델이 필요한 이유
전통 애플리케이션 보안은 미리 정의된 취약점을 방어한다. 에이전트 보안은 다르다.
- 에이전트는 도구를 자율적으로 선택한다
- 멀티턴 대화로 권한이 누적될 수 있다
- 외부 입력(웹, 문서, 이메일)에서 프롬프트 인젝션이 들어올 수 있다
- 오류가 연쇄 호출을 통해 빠르게 증폭된다
1. 실행 환경 격리: Docker Sandboxes
에이전트가 실행되는 환경을 격리하는 것이 가장 중요한 첫 번째 단계다.
샌드박스 기반 격리
# Docker Compose 예시: 에이전트를 격리된 컨테이너에서 실행
services:
agent:
image: my-agent:latest
network_mode: none # 네트워크 완전 차단 (필요시 허용 목록으로 열기)
read_only: true # 파일시스템 읽기 전용
tmpfs:
- /tmp # 임시 파일만 쓰기 허용
security_opt:
- no-new-privileges:true
cap_drop:
- ALLDocker Sandboxes는 처분 가능한(disposable) microVM으로, 각 에이전트 세션에 독립적인 실행 환경을 제공한다. 세션이 끝나면 컨테이너가 사라지므로 상태가 누적되지 않는다.
네트워크 제어
# 허용 목록 기반 네트워크 정책
agent_network:
driver: bridge
internal: true # 외부 인터넷 차단
# 허용된 서비스만 별도 네트워크에서 접근
allowed_services:
- api.anthropic.com:443
- github.com:4432. 도구 권한 런타임 스코프 지정
에이전트에게 필요한 도구만 제공한다. 전체 파일시스템 접근 대신 특정 디렉터리, 전체 DB 접근 대신 읽기 전용 뷰를 제공한다.
# 나쁜 예: 모든 권한
tools = [full_filesystem_access, admin_db_access, send_email]
# 좋은 예: 최소 권한
tools = [
read_file(allowed_dirs=["/workspace"]),
query_db(schema="readonly_view"),
send_email(to_whitelist=["[email protected]"])
]도구 포이즈닝(Tool Poisoning) 방어
신뢰할 수 없는 외부 소스(웹 페이지, 문서)에서 가져온 도구 설명에 악의적 지시가 포함될 수 있다. MCP 서버를 사용할 때는 신뢰할 수 있는 소스만 연결한다.
3. 자격증명 및 신원 관리
에이전트에게 고정된 장기 토큰을 주지 않는다.
- 에이전트 전용 ID: 에이전트가 사람 계정을 공유하지 않도록 서비스 계정 발급
- 런타임 시크릿 주입: 환경 변수나 비밀 관리 서비스(AWS Secrets Manager, Azure Key Vault)로 주입
- 단기 토큰: 세션 범위의 토큰을 사용하고 만료 후 폐기
# 좋지 않은 방법: 장기 API 키를 코드에 하드코딩
client = anthropic.Anthropic(api_key="sk-ant-...")
# 좋은 방법: 런타임 주입
client = anthropic.Anthropic(api_key=get_session_token())4. 에이전트 행동 모니터링
에이전트가 예상 범위 밖으로 벗어나는 것을 탐지한다.
로깅 전략
결과만 로깅하지 않는다. 에이전트가 내린 모든 행동 결정을 로깅한다.
# 로그해야 할 항목
{
"session_id": "...",
"timestamp": "...",
"tool_called": "write_file",
"arguments": {"path": "/workspace/output.txt"},
"reasoning": "사용자가 결과 저장을 요청함",
"outcome": "success"
}행동 드리프트 탐지
에이전트가 평소와 다른 패턴을 보이면 알림을 발생시킨다.
- 비정상적으로 많은 API 호출
- 허용 목록 외부 도메인 접근 시도
- 예상 범위를 벗어난 파일 접근
5. 멀티에이전트 신뢰 관리
에이전트 A가 에이전트 B를 호출할 때, B는 A의 요청을 신뢰할 수 있는지 검증해야 한다. 에이전트 오케스트레이터가 서브에이전트에게 무제한 권한을 위임하지 않도록 한다.
# 오케스트레이터가 서브에이전트 호출 시 권한 명시
subagent.run(
task="파일 분석",
permissions=["read_file"], # write, delete는 위임하지 않음
allowed_dirs=["/input"]
)에이전트 보안 체크리스트
- [ ] 에이전트를 격리된 컨테이너(microVM)에서 실행
- [ ] 네트워크 허용 목록 적용 (기본 차단)
- [ ] 도구 권한을 태스크 범위로 제한
- [ ] 에이전트 전용 ID와 단기 토큰 사용
- [ ] 모든 도구 호출 로깅
- [ ] 이상 행동 탐지 알림 설정
- [ ] 멀티에이전트 신뢰 경계 명시
참고 자료
- How to Secure AI Agents: A Practical Overview — Docker Blog (2026-06-02)
ai-agent-security-tips-memory-poisoning — 메모리 포이즈닝·탈옥 공격 방어