AegisLLM은 **엔터프라이즈 AI API 경계에서 필요한 인증·DLP·감사 기능을 실증하기 위한 Rust(Axum) 기반의 경량 보안 게이트웨이 프로토타입(MVP)**입니다. LLM 엔드포인트 전면에서 API Key 인증, 민감 정보(PII) 마스킹, Prompt Injection 차단 및 감사 로그 수집을 수행하여 거버넌스 아키텍처의 타당성을 검증합니다.
⚠️ Status: MVP Complete / Functional Prototype (v0.1.0-alpha)
본 프로젝트는 실제 대규모 엔터프라이즈 운영 목적이 아닌, AI 인프라 보안 아키텍처 구상을 실증하기 위해 설계된 경량 프로토타입입니다.
- Prompt 보안: Prompt Injection 및 악성 우회 입력을 API 경계면에서 사전 차단.
- 데이터 유출 방지 (DLP): 이메일, 주민등록번호 등 PII 정보와 평문 API Key/Secret 자동 탐지 및 마스킹.
- 3-Tier 경량 인증: 환경변수 Static Fallback, SurrealDB 조회, JWT 검증을 단계적으로 시도하는 독립 실행형 인증 필터.
- 관측성 (Observability): 실시간 Prometheus 메트릭 수집 및 스트리밍 JSONL 감사 로그(Audit Log) 생성.
security.rs의 find_prompt_injection() 함수가 키워드 패턴 매칭 방식으로 탐지합니다.
탐지 방식: 소문자 변환 후 고정 키워드 목록과 contains 비교 (O(n·m), 정규식 없음)
기본 탐지 패턴 (영문)
| 패턴 | 설명 |
|---|---|
ignore previous instructions |
이전 지시 무력화 시도 |
ignore all previous instructions |
전체 지시 초기화 시도 |
reveal your system prompt |
시스템 프롬프트 유출 요청 |
print the hidden prompt |
숨김 프롬프트 출력 요청 |
dump the system message |
시스템 메시지 덤프 시도 |
show the developer message |
개발자 메시지 노출 요청 |
기본 탐지 패턴 (한국어)
| 패턴 |
|---|
이전 지시를 무시 |
시스템 프롬프트를 공개 |
시스템 프롬프트를 출력 |
시스템 프롬프트 보여 |
숨겨진 프롬프트를 공개 |
숨겨진 프롬프트를 출력 |
패턴 추가 방법: gateway.toml의 security.deny_patterns 배열에 정규식(PCRE)을 추가하면 find_deny_patterns()가 호출됩니다.
[security]
deny_prompt_injection = true
deny_patterns = [
"(?i)act as (root|admin|god)",
"(?i)jailbreak"
]탐지 시 요청은 즉시 400 Bad Request로 차단되며, Upstream으로 전달되지 않습니다.
API Key별로 분당 요청 수(RPM)를 제한하는 슬라이딩 윈도우 방식으로 구현되어 있습니다 (auth.rs의 RateLimiter).
동작 원리
- 각 Key Hash를 기준으로
(시작 시각, 카운트)윈도우를 메모리에 유지 - 60초 윈도우 내 카운트가
rpm초과 시429 Too Many Requests반환 - 윈도우 만료 시 자동 리셋
설정 방법 (TOML)
[api_keys."<RANDOM_API_KEY>"]
project = "example-project"
role = "user"
rpm = 60 # 기본값: 120
[api_keys."<RANDOM_ADMIN_KEY>"]
project = "ops"
role = "admin"
rpm = 300환경변수 방식 (Static Fallback)
# 형식: key:project:role:rpm
GOVAIL_API_KEYS="<RANDOM_API_KEY>:example-project:user:60,<RANDOM_ADMIN_KEY>:ops:admin:300"responses_adapter.rs가 OpenAI Responses API(/v1/responses)를 Chat Completions 형식으로 변환하여 하위 호환성을 제공합니다.
지원 엔드포인트
| 엔드포인트 | HTTP 메서드 | 설명 |
|---|---|---|
/v1/chat/completions |
POST |
Chat Completion 요청 인터셉트, 필터링 및 프록시 중계 |
/v1/responses |
POST |
OpenAI Responses API → Chat Completions 자동 변환 |
/v1/embeddings |
POST |
Embedding 요청 프록시 (PII 스캔 포함) |
/v1/models |
GET |
인증된 Key에 허용된 모델 목록 반환 |
/health |
GET |
서비스 활성 상태 확인 (Liveness probe) |
/metrics |
GET |
Prometheus 텔레메트리 메트릭 반환 |
Responses API 변환 범위
input필드(문자열/배열) →messages배열 변환instructions→systemrole 메시지 삽입- Tool 정의의
additionalProperties,strict필드 자동 제거 (호환성) - 스트리밍(
stream: true) 지원
Upstream 실패
| 상황 | 응답 | 설명 |
|---|---|---|
| Upstream 연결 불가 | 502 Bad Gateway |
TCP 연결 실패, DNS 미해석 |
| Upstream Timeout | 504 Gateway Timeout |
upstream.timeout_seconds 초과 |
| Upstream 4xx/5xx | 원본 상태 코드 그대로 전달 | Upstream 오류를 투명하게 relay |
| 인증 실패 | 401 Unauthorized |
API Key 누락 또는 불일치 |
| RPM 초과 | 429 Too Many Requests |
Rate limit 도달 |
| 보안 정책 위반 | 400 Bad Request |
Injection 탐지, PII 차단 |
Timeout 설정
[upstream]
base_url = "http://<your-llm-upstream>/v1"
timeout_seconds = 120 # 기본값감사 로그: 모든 요청(차단 포함)은 logs/audit.jsonl에 JSONL 형식으로 기록됩니다.
cargo run --release -- --config configs/gateway.tomldocker build -t aegis-llm .
docker run -p 8080:8080 \
-v ./configs/gateway.toml:/app/configs/gateway.toml \
aegis-llm| 변수 | 설명 |
|---|---|
GOVAIL_CONFIG |
불러올 TOML 설정 파일 경로 (기본: configs/gateway.example.toml) |
GOVAIL_API_KEYS |
쉼표 구분 런타임 API Key 매핑 (형식: key:project:role[:rpm]) |
GOVAIL_UPSTREAM_API_KEY |
업스트림 호출용 자격증명(런타임 주입 필수) |
RUST_LOG |
로그 레벨 (기본: aegis_llm=info,tower_http=info) |
설계 배경과 트레이드오프는 docs/adr/ 디렉토리를 참고하세요.
AegisLLM은 Upstream LLM 장애 상황에 대응하기 위해 다음과 같은 내결함성(Fault-tolerance) 메커니즘을 내장하고 있습니다.
- 자동 재시도 (Retry): Upstream 요청이 5xx 에러 또는 네트워크 단선으로 실패할 경우, 최대 3회 지수 백오프(Exponential Backoff, 100ms -> 200ms -> 400ms)를 적용하여 자동 재시도합니다.
- 장애 극복 폴백 (Fallback Route): Primary Upstream LLM의 연속 실패 시, 설정된
fallback_base_url로 자동 우회하여 요청을 중계합니다. - 연결 끊김 대응 (Cancellation): 클라이언트가 스트리밍 도중 접속을 끊으면 Upstream 요청도 즉시 차단/취소하여 서버 자원과 토큰 비용 낭비를 최소화합니다.
본 프로젝트의 지연 시간 및 처리량 성능 검증 결과는 다음과 같습니다. 상세 측정 방법은 AgentSecOps Playground의 E2E 테스트 스케줄러를 참조합니다.
- 실행 경계: 격리된 ARM64 Linux 컨테이너
- 동시성 (Concurrency): 50 Concurrent Connections
- 측정 도구:
wrk -t4 -c50 -d30s
- 기본 프록시 중계: 추가 오버헤드 1.2ms (p95 기준)
- DLP PII 마스킹 활성화: 추가 오버헤드 2.1ms (p50 기준 1.8ms, p95 기준 2.4ms)
- 차단 성공률 및 정확도: PII 정밀도(Precision) 98%, 재현율(Recall) 95% (가상 데이터셋 120개 기준)
{ "trace_id": "a1b2c3d4", "ts": "2025-01-01T00:00:00Z", "project": "my-project", "model": "auto", "blocked": true, "block_reason": "prompt_injection", "latency_ms": 2 }