AI 코딩 어시스턴트가 엔지니어링 워크플로우의 표준 도구로 자리 잡으면서 보안 팀은 조직 전체에서 AI 에이전트가 수행하는 작업과 그 이유에 대한 가시성을 어떻게 유지할 것인가라는 새로운 과제에 직면하고 있습니다. 이러한 에이전트가 셸 명령을 실행하고, 파일을 읽고, API를 호출하고, MCP 커넥터를 통해 내부 시스템과 상호 작용할 수 있는 경우 위협 탐지, 사고 대응 및 규정 준수를 지원하기 위해 실시간 가시성이 필요합니다.
이 포스팅에서는 Elastic의 InfoSec 팀이 기본 OTel(OpenTelemetry) 내보내기 기능과 Elastic의 자체 OTel 수집 인프라를 사용하여 Claude Code 및 Claude Cowork를 위한 모니터링 파이프라인을 구축한 방법을 안내합니다. 원격 분석 스키마, 게이트웨이 배포, 사용자 정의 Elasticsearch 매핑 및 수집 파이프라인, 관리형 구성 전달, 이 데이터를 통해 지원되는 보안 사용 사례에 대해 다룹니다.
Elastic의 정보보안 팀이 AI 에이전트를 모니터링하는 이유
Elastic에서는 "고객 제로라고 부르는 것을 실천하고 있습니다." InfoSec 팀은 항상 최신 버전을 프로덕션 환경에서 실행하는 Elastic 제품의 최초이자 가장 까다로운 사용자입니다. 저희의 목표는 가능한 한 자체 제품을 사용하여 보안 태세를 개선하는 것입니다.
Claude Code와 Cowork는 현재 Elastic의 엔지니어링 조직 전체에서 활발하게 사용되고 있습니다. Claude Code는 개발자 컴퓨터에서 CLI 기반 AI 코딩 도우미로 로컬에서 실행됩니다. Cowork는 Claude 데스크톱 앱의 일부이며 로컬에서도 실행됩니다. 파일을 읽고, 샌드박스에서 코드를 실행하고, 웹을 검색하고, MCP 커넥터를 통해 Slack, GitHub, Jira 및 Google 캘린더와 같은 연결된 서비스와 상호 작용할 수 있습니다. 두 도구 모두 내부 시스템 연결을 지원하므로 보안팀이 모니터링해야 하는 신뢰 경계에서 작동합니다.
Claude Code와 Cowork가 OpenTelemetry를 통해 내보내는 기능
두 제품 모두 표준 오픈텔레메트리 프로토콜을 통해 원격 분석을 내보내며 동일한 5가지 이벤트 유형을 방출합니다:
api_request- 모델, 비용, 토큰 수, 지연 시간tool_result- 도구 이름, MCP 서버 및 도구 이름, 성공/실패, 기간tool_decision- 자동 승인 대 사용자 승인user_prompt- 사용자가 상담원에게 요청한 작업api_error- 오류 메시지, 상태 코드
모든 이벤트에는 사용자 ID(user.email, organization.id), 세션 컨텍스트(session.id, prompt.id, event.sequence), API 요청 이벤트의 비용/토큰 필드가 포함됩니다. 클로드 코드 원격 분석은 선택 사항이며 기본적으로 프롬프트와 도구 인수를 삭제합니다. OTEL_LOG_USER_PROMPTS=1 및 OTEL_LOG_TOOL_DETAILS=1 을 사용하여 활성화합니다. Cowork는 Anthropic 관리자 포털에서 중앙 집중식으로 구성되며 전체 세부 정보가 자동으로 포함됩니다.
전체 원격 분석 스키마는 Claude 코드 모니터링 문서와 Claude 공동 작업 모니터링 문서를 참조하세요.
아키텍처: Elasticsearch로 데이터 가져오기
Claude Code와 Cowork OTel 데이터를 Elasticsearch로 가져오는 방법에는 두 가지가 있습니다. 저희는 먼저 자체 관리형 게이트웨이 접근 방식을 배포했지만, Elastic Cloud 사용자에게는 더 간단한 옵션이 있습니다.
옵션 1: EDOT OTel 게이트웨이(자체 관리)
이것이 내부적으로 사용한 접근 방식입니다. Elastic의 정보보안팀은 자체 관리형 ECK(Elastic Cloud on Kubernetes) 클러스터를 운영하기 때문에 게이트웨이로 Elastic 배포판의 OpenTelemetry Collector(EDOT) 를 배포했습니다. Claude Code와 Cowork는 모두 사용자 시스템에서 로컬로 실행되며, 요청을 인증하고 Elasticsearch에 기록하는 게이트웨이로 OTLP/HTTP를 전송합니다.
EDOT 수집기 이미지(docker.elastic.co/elastic-agent/elastic-otel-collector)와 함께 오픈텔레메트리 수집기 헬름 차트를 사용했습니다. EDOT 이미지는 추가 구성 없이 로그를 올바른 데이터 스트림으로 가져오는 데 중요한 기본 Elastic 데이터 스트림 라우팅을 제공합니다.
게이트웨이는 배포 모드에서 실행되며 bearertokenauth 확장자를 통해 베어러 토큰 인증을 사용합니다.
핵심 수집기 구성은 다음과 같습니다:
config:
extensions:
bearertokenauth:
scheme: "Bearer"
token: "${env:OTEL_GATEWAY_TOKEN}"
receivers:
otlp:
protocols:
http:
endpoint: "0.0.0.0:4318"
auth:
authenticator: bearertokenauth
processors:
transform/route:
log_statements:
- context: log
conditions:
- resource.attributes["service.name"] == "claude-code"
statements:
- set(resource.attributes["data_stream.dataset"], "claude_code")
- context: log
conditions:
- resource.attributes["service.name"] == "cowork"
statements:
- set(resource.attributes["data_stream.dataset"], "claude_cowork")
exporters:
elasticsearch:
endpoints: ["https://your-elasticsearch:9200"]
user: "${env:ES_USERNAME}"
password: "${env:ES_PASSWORD}"
service:
extensions: [bearertokenauth]
pipelines:
logs:
receivers: [otlp]
processors: [transform/route]
exporters: [elasticsearch]
옵션 2: Elastic Cloud 관리형 OTLP 엔드포인트(게이트웨이 필요 없음)
Elastic Cloud(서버리스 또는 호스팅)를 실행 중인 경우, 게이트웨이를 완전히 건너뛸 수 있습니다. Elastic의 mOTLP(관리형 OTLP) 엔드포인트는 배포하거나 유지 관리할 수집기 인프라 없이 OTLP 데이터를 직접 받아들이는 탄력적인 자동 확장 수집 계층을 제공합니다.
이를 사용하려면 Claude Code의 OTLP 내보내기를 Elastic Cloud mOTLP 엔드포인트에 직접 가리키세요:
export CLAUDE_CODE_ENABLE_TELEMETRY=1
export OTEL_LOGS_EXPORTER=otlp
export OTEL_METRICS_EXPORTER=otlp
export OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf
export OTEL_EXPORTER_OTLP_ENDPOINT="https://<your-motlp-endpoint>"
export OTEL_EXPORTER_OTLP_HEADERS="Authorization=ApiKey <your-api-key>"
export OTEL_RESOURCE_ATTRIBUTES="data_stream.dataset=claude_code"
data_stream.dataset 리소스 속성은 로그를 수신하는 데이터 스트림을 제어하는 중요한 속성입니다. 이 기능이 없으면 데이터는 사용자 정의 인덱스 템플릿과 수집 파이프라인이 적용되지 않는 일반 OTel 데이터 스트림에 저장됩니다. claude_code 또는 claude_cowork 으로 설정하여 데이터가 올바른 필드 매핑을 통해 전용 logs-claude_code.otel-* 또는 logs-claude_cowork.otel-* 스트림으로 라우팅되도록 합니다.
mOTLP를 사용하면 자동 데이터 스트림 라우팅, 인덱싱 문제 발생 시 데이터를 보호하는 기본 제공 장애 저장소, APM 서버가 필요 없는 기본 OTLP 수집 기능을 사용할 수 있습니다.
관리형 엔드포인트는 아래에 설명된 것과 동일한 사용자 정의 인덱스 템플릿과 수집 파이프라인을 모두 지원하므로 게이트웨이를 운영할 필요가 없습니다.
전체 설정에 대한 자세한 내용은 Elastic Cloud 관리형 OTLP 설명서를 참조하세요.
사용자 정의 Elasticsearch 매핑 및 수집 파이프라인
기본적으로 OTel 속성은 Elasticsearch에서 키워드로 색인됩니다. 필터링 및 그룹화에는 효과적이지만 숫자 집계가 깨집니다. 키워드 필드는 합산하거나 평균을 낼 수 없습니다. 필드 유형을 수정하기 위한 사용자 정의 매핑과 JSON 문자열 필드를 구조화된 객체로 구문 분석하기 위한 수집 파이프라인을 만들었습니다.
컴포넌트 템플릿
컴포넌트 템플릿은 숫자 및 부울 필드에 대한 기본 키워드 매핑을 재정의하고 JSON으로 인코딩된 도구 매개변수에 대한 flattened 유형 매핑을 추가합니다:
PUT _component_template/logs-claude_code.otel@custom
{
"template": {
"mappings": {
"properties": {
"cost_usd": { "type": "float" },
"duration_ms": { "type": "long" },
"input_tokens": { "type": "long" },
"output_tokens": { "type": "long" },
"cache_creation_tokens": { "type": "long" },
"cache_read_tokens": { "type": "long" },
"prompt_length": { "type": "long" },
"tool_result_size_bytes": { "type": "long" },
"success": { "type": "boolean" },
"tool_parameters_flattened": { "type": "flattened" },
"tool_input_flattened": { "type": "flattened" }
}
}
}
}
여기서 flattened 유형이 중요합니다. tool_parameters 및 tool_input 은 mcp_server_name, mcp_tool_name, bash_command 또는 command 과 같이 중첩된 키가 포함된 JSON 문자열로 도착합니다. flattened 필드로 구문 분석하면 매핑된 필드를 무제한으로 만들지 않고도 개별 키를 쿼리할 수 있습니다.
향후에는 이러한 JSON 페이로드에서 MCP 서버 이름, 도구 이름, bash 명령과 같은 고가치 필드를 전용 매핑된 필드로 추출하여 해당 값에 대해 더 풍부한 분석, 집계 및 탐지 규칙을 직접 실행할 수 있도록 개선될 예정입니다.
색인 템플릿
인덱스 템플릿은 모든 표준 OTel 컴포넌트 템플릿과 사용자 지정 템플릿으로 구성됩니다. logs-claude_code.otel-* 및 logs-claude_cowork.otel-* 모두 일치하므로 두 데이터 스트림이 동일한 필드 매핑을 공유합니다:
PUT _index_template/logs-claude_code.otel
{
"index_patterns": [
"logs-claude_code.otel-*",
"logs-claude_cowork.otel-*"
],
"composed_of": [
"logs@mappings",
"logs@settings",
"otel@mappings",
"otel@settings",
"logs-otel@mappings",
"semconv-resource-to-ecs@mappings",
"logs@custom",
"logs-otel@custom",
"logs-claude_code.otel@custom",
"ecs@mappings"
],
"priority": 150,
"data_stream": {},
"allow_auto_create": true,
"ignore_missing_component_templates": [
"logs@custom",
"logs-otel@custom"
]
}
수집 파이프라인
수집 파이프라인은 원래 키워드 매핑된 속성과의 충돌을 피하기 위해 tool_parameters 및 tool_input 을 JSON 문자열에서 객체로 구문 분석하여 별도의 *_flattened 대상 필드에 기록합니다:
PUT _ingest/pipeline/logs-claude_code.otel@custom
{
"description": "Parse JSON string fields in Claude Code/Cowork OTel telemetry",
"processors": [
{
"json": {
"field": "attributes.tool_parameters",
"target_field": "tool_parameters_flattened",
"if": "ctx.attributes?.tool_parameters != null && ctx.attributes.tool_parameters.startsWith('{')",
"ignore_failure": true
}
},
{
"json": {
"field": "attributes.tool_input",
"target_field": "tool_input_flattened",
"if": "ctx.attributes?.tool_input != null && ctx.attributes.tool_input.startsWith('{')",
"ignore_failure": true
}
}
]
}
세 가지 리소스를 모두 생성한 후 logs-claude_code.otel-* 및 logs-claude_cowork.otel-* 데이터 스트림으로 유입되는 새 데이터는 올바른 숫자 필드 유형과 검색 가능한 구조화된 도구 매개변수를 갖게 됩니다.
원격 분석 내보내기 구성
Claude Code와 Cowork는 서로 다르게 구성되어 있습니다. 클로드 코드는 표준 OpenTelemetry 환경 변수를 사용합니다. Cowork OTel 내보내기는 관리자가 Anthropic 관리자 포털에서 중앙에서 구성할 수 있습니다.
Claude Code는 IT 부서에서 배포하고 사용자가 재정의할 수 없는 관리형 설정을 지원합니다. 구성은 env 블록이 포함된 JSON 파일입니다:
{
"env": {
"CLAUDE_CODE_ENABLE_TELEMETRY": "1",
"OTEL_METRICS_EXPORTER": "otlp",
"OTEL_LOGS_EXPORTER": "otlp",
"OTEL_LOG_TOOL_DETAILS": "1",
"OTEL_LOG_USER_PROMPTS": "1",
"OTEL_EXPORTER_OTLP_PROTOCOL": "http/protobuf",
"OTEL_EXPORTER_OTLP_ENDPOINT": "https://your-otel-gateway:443",
"OTEL_EXPORTER_OTLP_HEADERS": "Authorization=Bearer your-token"
}
}
이 관리 설정 파일은 MDM(Jamf, Intune), Claude.ai 관리 콘솔을 통한 서버 관리 설정 또는 파일 기반 배포를 통해 전달할 수 있습니다. 배달 메커니즘 및 보안 속성의 전체 목록은 Claude Code 관리 설정 설명서를 참조하세요.
로컬 테스트의 경우, 조직 전체에 배포하기 전에 ~/.claude/settings.json 에 동일한 구성을 입력한 후 자체 머신에 적용할 수 있습니다.
공동 작업
Cowork OTel 내보내기는 관리자가 Anthropic 관리자 포털에서 중앙에서 구성할 수 있습니다. 관리자가 관리 콘솔에서 OTLP 엔드포인트 및 인증 헤더를 설정하면, Cowork 인스턴스가 자동으로 구성을 가져옵니다. 프롬프트 콘텐츠 및 도구 세부 정보는 추가 플래그 없이 기본적으로 포함되어 있습니다.
Cowork는 샌드박스에서 실행되므로 샌드박스 환경에서 아웃바운드 네트워크 액세스를 위해 OTel 게이트웨이 엔드포인트가 허용 목록에 포함되어야 합니다. 이 기능이 없으면 원격 분석 내보내기가 소리 없이 실패합니다.
보안 사용 사례
이벤트 유형, ID 필드, 도구 매개변수의 조합은 보안 운영을 위한 풍부한 데이터 세트를 생성합니다. 탐지 및 조사 기능을 구축하고 있는 사용 사례는 다음과 같습니다.
도구 호출 감사. 모든 도구 호출은 도구 이름과 입력 매개변수와 함께 기록됩니다. MCP 도구의 경우 여기에는 MCP 서버 이름과 도구 이름(예: slack_send_message, github/search_issues)이 포함됩니다. 무단 데이터 액세스, 비정상적인 셸 명령 또는 예기치 않은 MCP 서버 상호 작용을 감지할 수 있습니다. attributes.tool_name + attributes.tool_parameters 필드를 사용합니다.
세션 재구성. session.id 필드와 event.sequence 필드를 결합하면 각 세션 내에서 단조롭게 증가하는 카운터를 제공합니다. 사용자가 무엇을 요청했는지, 어떤 도구가 실행되었는지, 어떤 데이터에 액세스했는지, 어떤 API가 호출되었는지 등 Claude 세션의 전체 시퀀스를 재구성할 수 있습니다. 의심스러운 도구 호출을 감지하면 전체 세션 컨텍스트를 가져올 수 있으므로 사고 대응에 유용합니다.
권한 결정 분석. 이벤트 attributes.event.name: tool_decision 이벤트는 각 도구 사용이 어떻게 승인되었는지에 대한 인사이트를 제공합니다. 이를 통해 위험한 도구 카테고리를 자동 승인하는 사용자를 감지하거나 제품군 전체에서 비정상적인 권한 패턴을 식별할 수 있습니다.
| 의사 결정 출처 | 의미 |
|---|---|
config | 설정 또는 정책에 의해 자동 허용 |
hook | 구성된 후크 스크립트에 의해 결정 |
user_temporary | 사용자가 이 호출에 대해 수락을 클릭했습니다. |
user_permanent | 사용자가 클릭한 "이 도구에 대해 항상 허용" |
user_abort | 사용자가 세션을 중단했습니다. |
user_reject | 사용자가 명시적으로 도구 사용을 거부한 경우 |
비용 이상 감지. 모든 api_request 이벤트의 cost_usd 필드는 요청별, 세션별, 사용자별 비용 추적을 가능하게 합니다. 비정상적으로 비싼 세션에 대해 알림을 보내거나 소비 패턴이 큰 사용자를 식별할 수 있습니다.
EDR 데이터와의 상관관계. 엔드포인트에서 Elastic Defend를 실행하는 경우, Claude의 OTel 원격 분석과 EDR 프로세스 및 파일 이벤트를 상호 연관시켜 전체 상황을 파악할 수 있습니다. 클로드 코드가 Bash 명령을 실행하면 OTel tool_result 이벤트가 에이전트가 실행하기로 결정한 내용과 그 이유를 알려줍니다(앞의 user_prompt)를 통해. 해당 Elastic Defend 프로세스 이벤트는 호스트에서 발생한 하위 프로세스 생성, 파일 작성, 네트워크 연결 등 정확히 어떤 일이 일어났는지 알려줍니다. 이 두 데이터 소스를 타임스탬프와 호스트별로 조인하면 단일 조사에서 (AI 에이전트 원격 분석의) 의도와 (엔드포인트 원격 분석의) 영향을 모두 파악할 수 있습니다.
MCP 서버 액세스 모니터링. 조직이 MCP를 통해 AI 에이전트를 내부 시스템에 연결함에 따라 어떤 서버에 어떤 도구로 액세스하는지 모니터링하는 것이 중요해졌습니다. tool_parameters_flattened.mcp_server_name 및 tool_parameters_flattened.mcp_tool_name 필드는 이러한 가시성을 제공합니다.
예를 들어 Slack에 대한 도구 호출을 보려면 tool_name: "mcp_tool" AND tool_parameters_flattened.mcp_tool_name:slack* 을 쿼리할 수 있습니다.
OTel을 넘어서: 클로드 엔터프라이즈 감사 로그
Claude Code 및 Cowork의 원격 분석은 엔드포인트에서의 상담원 활동을 다루지만 모든 것을 캡처하지는 않습니다. 완전한 가시성을 위해 조직은 규정 준수 API에서 Claude 엔터프라이즈 감사 로그도 수집해야 합니다. 이것은 로그인 활동, 권한 변경 및 조직 수준 관리와 같은 기존 보안 감사 이벤트와 웹 인터페이스(claude.ai)에서의 활동의 유일한 소스입니다. 두 데이터 소스를 결합하면 보안팀은 모든 Claude 제품에 대한 전체 상황을 파악할 수 있습니다.
결론
AI 코딩 어시스턴트와 자율 에이전트가 표준 엔터프라이즈 툴킷의 일부가 되고 있습니다. 보안팀이 이러한 도구가 수행하는 작업에 대한 가시성을 확보하지 못한다면 보안에 공백이 생긴 것입니다. Claude Code와 Cowork는 ID, 세션 컨텍스트, 도구 호출 세부 정보, 비용 데이터, 권한 결정 등 보안팀이 필요로 하는 원격 분석 기능을 정확히 제공하는 OpenTelemetry를 지원합니다. Elastic Cloud의 관리형 OTLP 엔드포인트든 자체 관리 환경의 EDOT 수집기든, Elastic의 기본 OTel 수집 기능을 사용하면 이 데이터를 검색, 대시보드 구축, 탐지 규칙 작성을 할 수 있는 Elasticsearch로 간편하게 가져올 수 있습니다.
시작하려면 Elastic Cloud 무료 체험판에 가입하고 관리형 OTLP 엔드포인트를 사용해 보시거나 기존 환경에 EDOT OTel Collector를 설치하세요.