LiteLLM 자체 호스팅 보안 & 암호화 FAQ
LiteLLM 자체 호스팅 보안 & 암호화 FAQ
프록시를 자체 호스팅할 때 데이터가 전송 중·저장 중에 어떻게 보호되는지 정리한 FAQ예요. 클라이언트-프록시 연결과 프록시-LLM 제공자 간 TLS, 그리고 데이터베이스에 저장되는 중요한 값들의 암호화 방식을 다뤄요.
전송 중 데이터 암호화
제품이 전송 중 데이터를 암호화하나요?
네, LiteLLM은 TLS/SSL을 사용해 전송 중 데이터를 암호화해요.
OSS와 Enterprise 둘 다에서 가능한가요?
네, TLS 암호화는 오픈소스와 Enterprise 버전 둘 다에서 사용할 수 있어요.
호출 클라이언트와 제품 사이의 전송은요?
네, SSL 인증서 구성을 통해 HTTPS/TLS가 지원돼요.
구성:
# CLI
litellm --ssl_keyfile_path /path/to/key.pem --ssl_certfile_path /path/to/cert.pem
# Environment Variables
export SSL_KEYFILE_PATH="/path/to/key.pem"
export SSL_CERTFILE_PATH="/path/to/cert.pem"
문서 참조: docs/my-website/docs/guides/security_settings.md
제품과 LLM 제공자 사이의 전송은요?
네, LLM 제공자에 대한 모든 연결은 기본적으로 TLS 암호화를 사용해요.
구현 세부 사항:
- Python의
ssl.create_default_context()사용 - SSL/TLS를 활성화한 HTTPX 및 aiohttp 라이브러리 사용
- SSL 검증에 기본적으로 certifi CA 번들 사용
코드 참조: litellm/llms/custom_httpx/http_handler.py (43-105줄)
LLM 제공자에 대한 TCP 세션이 공유되나요?
네, TCP 연결은 풀링되고 재사용돼요.
세부 사항:
- 연결 풀링이 기본적으로 활성화
- 기본값: keepalive와 함께 최대 1000개의 동시 연결
- 세션은 같은 제공자에 대한 요청들 사이에 유지
- TLS 핸드셰이크 오버헤드 감소
코드 참조: litellm/llms/custom_httpx/http_handler.py (704-712줄)
아니면 제품이 같은 LLM 제공자와 매 순차 호출마다 새 TLS 세션을 협상하나요?
아니요, TLS 세션은 연결 풀링을 통해 재사용돼요. 요청마다 새 TLS 핸드셰이크를 수행하지 않아요.
어떻게 암호화되나요?
TLS 1.2 및 TLS 1.3
TLS 1.2와 TLS 1.3을 모두 지원하는 Python의 기본 SSL 컨텍스트를 사용해요. 협상되는 구체적 버전은 다음에 따라 달라져요:
- Python 버전
- 시스템 SSL 라이브러리 (보통 OpenSSL)
- 서버 기능
구현: Python의 ssl.create_default_context()
어떻게 제품 구성에 추가하나요?
x.509 인증서
방법 1: CLI 인자
litellm --ssl_certfile_path /path/to/certificate.pem
방법 2: 환경 변수
export SSL_CERTFILE_PATH="/path/to/certificate.pem"
개인 키
방법 1: CLI 인자
litellm --ssl_keyfile_path /path/to/private_key.pem
방법 2: 환경 변수
export SSL_KEYFILE_PATH="/path/to/private_key.pem"
인증서 번들/체인
클라이언트-프록시 연결의 경우: 중간 인증서를 certfile에 번들한 표준 SSL 인증서 설정을 사용하세요.
프록시-LLM 제공자 연결의 경우:
방법 1: Config YAML
litellm_settings:
ssl_verify: "/path/to/ca_bundle.pem"
방법 2: 환경 변수
export SSL_CERT_FILE="/path/to/ca_bundle.pem"
방법 3: 클라이언트 인증서 인증
litellm_settings:
ssl_certificate: "/path/to/client_certificate.pem"
또는
export SSL_CERTIFICATE="/path/to/client_certificate.pem"
문서 범위
주 문서:
docs/my-website/docs/guides/security_settings.md— SSL/TLS 구성 가이드
추가 참조:
litellm/proxy/proxy_cli.py(455-467줄) — CLI 옵션docs/my-website/docs/completion/http_handler_config.md— 커스텀 HTTP 핸들러 구성
저장 중 데이터 암호화
제품이 저장 중 데이터를 암호화하나요?
부분적으로. 특정 민감한 데이터만 저장 중에 암호화돼요.
어떤 데이터가 암호화된 형태로 저장되나요?
암호화되는 데이터:
- LLM API 키 —
LiteLLM_ProxyModelTable.litellm_params의 모델 자격증명 - 제공자 자격증명 —
LiteLLM_CredentialsTable.credential_values에 저장 - 구성 비밀 —
LiteLLM_Config테이블의 민감한 구성 값 - 가상 키 — 시크릿 매니저를 사용할 때 (선택 기능)
암호화되지 않는 데이터:
- 지출 로그 —
LiteLLM_SpendLogs의 요청/응답 데이터 - 감사 로그 —
LiteLLM_AuditLog의 변경 이력 - 사용자/팀/조직 데이터 — 메타데이터와 구성
- 캐시된 프롬프트와 완성 — 캐시 데이터는 평문으로 저장
캐시된 프롬프트와 완성은요?
아니요, 캐시된 프롬프트와 완성은 암호화되지 않아요.
캐시 백엔드(Redis, S3, 로컬 디스크)는 데이터를 평문 JSON으로 저장해요.
코드 참조:
litellm/caching/redis_cache.pylitellm/caching/s3_cache.pylitellm/caching/caching.py
구성 데이터는요?
부분적으로 암호화돼요.
암호화되는 것:
- 모델 구성의 LLM API 키와 자격증명
LiteLLM_Config테이블의 민감한 값LiteLLM_CredentialsTable의 자격증명 값
암호화되지 않는 것:
- 모델 이름과 별칭
- 레이트 리밋과 예산 설정
- 사용자/팀/조직 메타데이터
- 민감하지 않은 구성 파라미터
코드 참조: litellm/proxy/management_endpoints/model_management_endpoints.py (275-308줄)
로그 데이터는요?
아니요, 로그 데이터는 암호화되지 않아요.
데이터베이스 테이블에 저장된 로그 데이터는 평문이에요:
LiteLLM_SpendLogs— 요청/응답 데이터, 토큰, 지출 포함LiteLLM_ErrorLogs— 오류 정보LiteLLM_AuditLog— 변경 감사 추적
참고: 민감한 데이터 저장을 피하려면 로깅을 끌 수 있어요:
general_settings:
disable_spend_logs: True # Disable writing spend logs to DB
disable_error_logs: True # Disable writing error logs to DB
문서: docs/my-website/docs/proxy/db_info.md (52-60줄)
어디에 저장되나요?
DB에?
네, 암호화된 데이터는 PostgreSQL 데이터베이스에 저장돼요.
암호화된 데이터가 있는 주요 테이블:
LiteLLM_ProxyModelTable— 암호화된 API 키가 있는 모델 구성LiteLLM_CredentialsTable— 자격증명 값LiteLLM_Config— 구성 비밀
스키마 참조: schema.prisma
파일시스템에?
아니요, 암호화된 데이터는 기본적으로 파일시스템에 저장되지 않아요.
참고: 디스크 캐시(disk_cache_dir)를 쓰면 캐시 데이터가 암호화되지 않고 저장돼요.
다른 곳?
선택 사항: 시크릿 매니저(AWS Secrets Manager, Azure Key Vault, HashiCorp Vault)를 사용하면 암호화된 데이터를 외부에 저장할 수 있어요.
구성:
general_settings:
key_management_system: "aws_secret_manager" # or "azure_key_vault", "hashicorp_vault"
문서: docs/my-website/docs/secret.md
어떻게 암호화되나요?
알고리즘: NaCl SecretBox (XSalsa20-Poly1305 AEAD)
AES-256이 아님 — LiteLLM은 NaCl(Networking and Cryptography Library)을 사용하며 다음을 제공해요:
- XSalsa20 스트림 암호
- 인증용 Poly1305 MAC
- AES-256과 동등한 보안
키 파생:
LITELLM_SALT_KEY를 가져옴 (설정되지 않으면LITELLM_MASTER_KEY)- SHA-256으로 해시해 256비트 암호화 키 파생
- 인증된 암호화를 위해 NaCl SecretBox 사용
코드 참조: litellm/proxy/common_utils/encrypt_decrypt_utils.py (69-112줄)
구현:
import hashlib
import nacl.secret
# Derive 256-bit key from salt
hash_object = hashlib.sha256(signing_key.encode())
hash_bytes = hash_object.digest()
# Create SecretBox and encrypt
box = nacl.secret.SecretBox(hash_bytes)
encrypted = box.encrypt(value_bytes)
암호화 키 설정
필수 환경 변수:
export LITELLM_SALT_KEY="your-strong-random-key-here"
중요한 참고 사항:
- ⚠️ 모델을 추가하기 전에 반드시 설정해야 함
- ⚠️ 이 키를 절대 바꾸지 말 것 — 암호화된 데이터를 복구할 수 없게 됨
- ⚠️ 강력한 랜덤 키 사용 (권장: https://1password.com/password-generator/)
- 설정하지 않으면
LITELLM_MASTER_KEY로 폴백
문서: docs/my-website/docs/proxy/prod.md (8절, 184-196줄)
문서 범위
주 문서:
docs/my-website/docs/proxy/prod.md(8절) — LITELLM_SALT_KEY 설정docs/my-website/docs/secret.md— 시크릿 관리 시스템docs/my-website/docs/proxy/db_info.md— 데이터베이스 정보
추가 참조:
security.md— 일반 보안 조치docs/my-website/docs/data_security.md— 데이터 프라이버시 개요schema.prisma— 암호화된 필드가 있는 데이터베이스 스키마
보안 기능 요약
✅ 기본 제공
- 클라이언트-프록시 연결용 TLS/SSL 암호화
- 프록시-LLM 제공자 연결용 TLS 암호화 (연결 풀링 포함)
- LLM API 키와 자격증명의 암호화된 저장
- TLS 1.2 및 TLS 1.3 지원
- TLS 핸드셰이크 오버헤드를 줄이는 연결 풀링
⚠️ 중요한 제한 사항
- 캐시된 데이터는 암호화되지 않음 (Redis, S3, 디스크 캐시)
- 로그 데이터는 암호화되지 않음 (지출 로그, 감사 로그)
- 로그의 요청/응답 페이로드는 암호화되지 않음
- NaCl SecretBox 사용, AES-256 아님 (동등한 보안)
- TLS 버전이 명시적으로 구성되지 않음 — Python/시스템 기본값 사용
🔧 구성 요구 사항
프로덕션 배포의 경우:
- 모델을 추가하기 전에 LITELLM_SALT_KEY 설정
- HTTPS 클라이언트 연결을 위한 SSL 인증서 구성
- 민감한 데이터가 있으면 로그 비활성화 고려
- 강화된 보안을 위한 시크릿 매니저 사용 (선택)
- 커스텀 인증서를 사용한다면 CA 번들 구성
빠른 시작 보안 체크리스트
# 1. Generate a strong salt key
export LITELLM_SALT_KEY="$(openssl rand -base64 32)"
# 2. Set up SSL certificates (for HTTPS)
export SSL_KEYFILE_PATH="/path/to/private_key.pem"
export SSL_CERTFILE_PATH="/path/to/certificate.pem"
# 3. Configure database
export DATABASE_URL="postgresql://user:***@host:port/dbname"
# 4. (Optional) Disable logs if they contain sensitive data
# Add to config.yaml:
# general_settings:
# disable_spend_logs: True
# disable_error_logs: True
# 5. Start LiteLLM Proxy
litellm --config config.yaml
추가 자료
- LiteLLM 문서: https://docs.litellm.ai/
- 보안 설정 가이드: https://docs.litellm.ai/docs/guides/security_settings
- 프로덕션 배포: https://docs.litellm.ai/docs/proxy/prod
- 시크릿 관리: https://docs.litellm.ai/docs/secret
보안 문의: [email protected]
출처: 문서
더 알아보기 (Learn more)
LITELLM_SALT_KEY설정과 시크릿 관리 시스템 구성해 보기- SSL 인증서 설정으로 HTTPS를 활성화하는 방법 확인하기