Terminal 3에서 기밀 AI 에이전트 구축하기: TDX Enclave 내부의 날씨 에이전트
요약
Intel TDX의 TEE(신뢰 실행 환경)를 활용하여 API 키와 사용자 데이터를 보호하며 기밀 AI 에이전트를 구축하는 방법을 다룹니다. WASM 컨트랙트와 ML-KEM 암호화를 통해 노드 운영자조차 접근할 수 없는 보안 아키텍처를 구현합니다.
핵심 포인트
- Intel TDX 엔클레이브를 통한 하드웨어 기반 기밀성 보장
- ML-KEM 양자 내성 암호를 사용한 세션 보안 강화
- WASM 및 WIT 인터페이스를 통한 엄격한 기능 제어
- 엔클레이브 내부에서만 접근 가능한 API 키 관리 패턴
API 키가 엔클레이브(Enclave)를 절대 벗어나지 않으면서 OpenWeatherMap을 호출하는 하드웨어 TEE 내부의 Rust 코드를 실행하는 방법.
문제점 (The Problem)
AI 에이전트는 실제 API, 실제 자격 증명(Credentials), 그리고 실제 사용자 데이터에 접근할 수 없다면 무용지물입니다. 하지만 모든 외부 호출은 신뢰의 문제를 야기합니다: 우리는 에이전트 운영자가 우리의 API 키를 로그에 남기지 않을 것이라고 믿을 수 있는가? 우리는 노드 실행자가 응답을 훔쳐보지 않을 것이라고 믿을 수 있는가?
전통적인 해결책은 SLA(Service Level Agreement)와 컴플라이언스 서류를 쌓아 올리는 방식입니다. Terminal 3 (T3N)은 다른 접근 방식을 취합니다: 하드웨어로 강제되는 기밀성 (Hardware-enforced confidentiality). 당신의 코드는 Intel TDX 신뢰 실행 환경 (Trusted Execution Environment, TEE) 내부에서 실행됩니다. 이는 노드 운영자조차 조사할 수 없는 하드웨어 블랙박스입니다.
이 포스트에서는 이 패턴을 엔드 투 엔드(End-to-end)로 증명하는 날씨 에이전트 구축 과정을 살펴봅니다.
아키텍처 개요 (Architecture Overview)
┌──────────────┐ encrypted session ┌──────────────────────┐
│ User CLI │ ─────────────────────────→ │ T3N Node │
│ (tsx + SDK) │ │ ┌────────────────┐ │
...
세 가지 보호 계층:
- 전송 (Transport): 모든 통신은 T3N SDK의 세션 레이어를 통해 ML-KEM (양자 내성 암호, Post-quantum)으로 암호화됩니다.
- 연산 (Compute): WASM 컨트랙트는 Intel TDX 엔클레이브(Enclave) 내부에서 실행됩니다. 이는 CPU에 의해 메모리가 암호화되며, 원격 검증(Attestable)이 가능합니다.
- 비밀 정보 (Secrets): API 키는 컨트롤 플레인(
map-entry-set)을 통해 기록되어 맵(Map) 자체의 ACL(Access Control List)조차 우회하며, 엔클레이브 내부에서kv_store::get()을 통해서만 읽을 수 있습니다.
WIT 인터페이스 (The WIT Interface)
WebAssembly Interface Types (WIT)는 컨트랙트의 경계, 즉 호스트로부터 무엇을 임포트(Import)하고 호출자에게 무엇을 익스포트(Export)하는지를 선언합니다:
package z:tenant-weather@0.1.0;
world tenant-weather {
...
컨트랙트가 가진 모든 기능(Capability)은 여기서 명시적으로 선언됩니다. 파일 시스템, 네트워크 또는 비밀 정보에 대한 암시적인 접근은 허용되지 않습니다. 호스트는 Wasm 경계에서 이를 강제합니다.
컨트랙트 구현 (Contract Implementation)
TEE 내부에서 비밀 정보 읽기 (Reading Secrets Inside the TEE)
해당 컨트랙트는 런타임(runtime)에 테넌트(tenant)의 DID를 확인하고, 맵(map) 이름을 생성하며, API 키를 읽어옵니다:
fn get_api_key() -> Result<String, String> {
let tid = tenant_context::tenant_did();
let map_name = format!("z:{}:secrets", hex::encode(&tid));
...
이 키는 SDK의 컨트롤 플레인(control plane, tenant.executeControl("map-entry-set", ...))을 통해 시드(seeded)되었습니다. 이는 맵의 writers ACL(액세스 제어 목록)을 우회하여 하부 스토리지(underlying storage)에 직접 기록합니다. 이는 배포 중에 수행되는 일회성 작업입니다. 그 이후에는 외부 관찰자가 이를 다시 읽을 수 없습니다.
엔클레이브(Enclave) 내부에서 HTTP 호출하기
let resp = http_iface::call(&http_iface::Request {
method: http_iface::Verb::Get,
url: format!("{OWM_BASE}/data/2.5/weather?q={}&appid={}&units=metric",
...
HTTP 호출은 호스트(host)의 이그레스 프록시(egress proxy)를 통해 전달됩니다. 요청이 엔클레이브를 떠나기 전에 호스트는 다음을 확인합니다: 호출하는 사용자의 권한(authorization)이 이 컨트랙트가 api.openweathermap.org로 다이얼(dial)하는 것을 허용하는가? 허용되지 않는다면, 요청은 egress_denied와 함께 거부됩니다.
파싱(Parsing) 및 반환
let weather = WeatherResp {
city: req.city,
temperature: data["main"]["temp"].as_f64().unwrap_or(0.0),
...
JSON으로 직렬화(serialized)된 응답은 세션을 통해 암호화되어 호출자에게 반환됩니다. 호출자는 API 키를 본 적도 없고, OpenWeatherMap에 직접 접속한 적도 없으며, TEE와 수행한 유일한 상호작용은 서명된 호출(signed invocation)뿐입니다.
배포 스크립트 (Deployment Script)
TypeScript SDK가 전체 라이프사이클(lifecycle)을 오케스트레이션(orchestrate)합니다:
// 1. 인증 (Authenticate)
setEnvironment("testnet");
const t3n = new T3nClient({
...
이 스크립트는 **멱등성(idempotent)**을 갖도록 설계되었습니다. 만약 컨트랙트 버전이 이미 존재한다면 등록은 건너뛰고, 맵 ACL은 제자리에서 업데이트되며, 재실행 시 호출 비용만 토큰으로 발생합니다.
실행 결과 (Live Output)
$ npm run deploy
authenticated as did:t3n:2c9d71730c17e69e394afbffb973d1a6444f4423
...
이것이 중요한 이유
날씨 에이전트는 의도적으로 최소한의 기능만 갖추고 있지만, 이 패턴은 모든 기밀 에이전트(confidential agent) 워크플로우로 일반화될 수 있습니다:
| 시나리오 (Scenario) | 비밀 정보 (Secret) | 외부 API (External API) | 패턴 (Pattern) |
|---|---|---|---|
| 날씨 (Weather) | OpenWeatherMap 키 | api.openweathermap.org | 이 데모 |
| ... |
핵심 통찰: 에이전트가 아닌 컨트랙트(contract)가 자격 증명(credentials)을 보유합니다. 에이전트는 컨트랙트를 호출하고, 컨트랙트는 TEE(Trusted Execution Environment) 내부의 자격 증명을 사용합니다. 만약 에이전트가 침해되더라도, 공격자는 함수 호출(function call) 권한만 얻을 뿐 API 키를 얻지는 못합니다.
전체 스택 (The Full Stack)
| 계층 (Layer) | 기술 (Technology) |
|---|---|
| 컨트랙트 언어 (Contract language) | Rust |
| ... |
직접 시도해보기 (Try It Yourself)
- terminal3.io/claim-page에서 T3N API 키를 받으세요 (20,000개의 무료 테스트 토큰 제공)
- OpenWeatherMap API 키를 발급받으세요
- 리포지토리(repo)를 클론하고,
npm install && cargo build --release && npm run deploy를 실행하세요
전체 소스 코드 및 문서: https://github.com/harishkotra/weather-agent
기밀성(confidential)과 감사 가능성(auditable)을 갖춘 AI 에이전트를 위한 에이전트 개발 키트, Terminal 3로 제작되었습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기