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 핸들러 구성

저장 중 데이터 암호화

제품이 저장 중 데이터를 암호화하나요?

부분적으로. 특정 민감한 데이터만 저장 중에 암호화돼요.

어떤 데이터가 암호화된 형태로 저장되나요?

암호화되는 데이터:

  1. LLM API 키LiteLLM_ProxyModelTable.litellm_params의 모델 자격증명
  2. 제공자 자격증명LiteLLM_CredentialsTable.credential_values에 저장
  3. 구성 비밀LiteLLM_Config 테이블의 민감한 구성 값
  4. 가상 키 — 시크릿 매니저를 사용할 때 (선택 기능)

암호화되지 않는 데이터:

  1. 지출 로그LiteLLM_SpendLogs의 요청/응답 데이터
  2. 감사 로그LiteLLM_AuditLog의 변경 이력
  3. 사용자/팀/조직 데이터 — 메타데이터와 구성
  4. 캐시된 프롬프트와 완성 — 캐시 데이터는 평문으로 저장

캐시된 프롬프트와 완성은요?

아니요, 캐시된 프롬프트와 완성은 암호화되지 않아요.

캐시 백엔드(Redis, S3, 로컬 디스크)는 데이터를 평문 JSON으로 저장해요.

코드 참조:

  • litellm/caching/redis_cache.py
  • litellm/caching/s3_cache.py
  • litellm/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과 동등한 보안

키 파생:

  1. LITELLM_SALT_KEY를 가져옴 (설정되지 않으면 LITELLM_MASTER_KEY)
  2. SHA-256으로 해시해 256비트 암호화 키 파생
  3. 인증된 암호화를 위해 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 — 암호화된 필드가 있는 데이터베이스 스키마

보안 기능 요약

✅ 기본 제공

  1. 클라이언트-프록시 연결용 TLS/SSL 암호화
  2. 프록시-LLM 제공자 연결용 TLS 암호화 (연결 풀링 포함)
  3. LLM API 키와 자격증명의 암호화된 저장
  4. TLS 1.2 및 TLS 1.3 지원
  5. TLS 핸드셰이크 오버헤드를 줄이는 연결 풀링

⚠️ 중요한 제한 사항

  1. 캐시된 데이터는 암호화되지 않음 (Redis, S3, 디스크 캐시)
  2. 로그 데이터는 암호화되지 않음 (지출 로그, 감사 로그)
  3. 로그의 요청/응답 페이로드는 암호화되지 않음
  4. NaCl SecretBox 사용, AES-256 아님 (동등한 보안)
  5. TLS 버전이 명시적으로 구성되지 않음 — Python/시스템 기본값 사용

🔧 구성 요구 사항

프로덕션 배포의 경우:

  1. 모델을 추가하기 전에 LITELLM_SALT_KEY 설정
  2. HTTPS 클라이언트 연결을 위한 SSL 인증서 구성
  3. 민감한 데이터가 있으면 로그 비활성화 고려
  4. 강화된 보안을 위한 시크릿 매니저 사용 (선택)
  5. 커스텀 인증서를 사용한다면 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  
    

추가 자료

보안 문의: [email protected]

출처: 문서

더 알아보기 (Learn more)

  • LITELLM_SALT_KEY 설정과 시크릿 관리 시스템 구성해 보기
  • SSL 인증서 설정으로 HTTPS를 활성화하는 방법 확인하기