본문으로 건너뛰기

온프레미스 환경에서 보안이 강화된 저권한 LLM 서버 구축 가이드

기업의 기밀 데이터를 보호하기 위해 NVIDIA RTX Pro 6000과 Podman, Vulkan 백엔드를 활용하여 네트워크가 차단된 고립된 온프레미스 LLM 추론 서버를 구축하고 보안을 강화하는 과정을 다룹니다.

섹션별 상세

하드웨어 선정 및 메모리 계산: gpt-oss-120b 모델(4비트 양자화 시 약 60GiB)과 KV 캐시를 모두 수용하기 위해 96GB vRAM을 갖춘 NVIDIA RTX Pro 6000 Blackwell GPU를 선택했다. KV 캐시 크기는 레이어 수, 헤드 수, 컨텍스트 크기 등을 고려한 공식을 통해 계산하며, 126,000 토큰 기준 4개의 병렬 슬롯을 운영할 수 있는 메모리 설계를 적용했다.
python
import math
from gguf import GGUFReader

shards = (
    "gpt-oss-120b-mxfp4-00001-of-00003.gguf",
    "gpt-oss-120b-mxfp4-00002-of-00003.gguf",
    "gpt-oss-120b-mxfp4-00003-of-00003.gguf",
)
n_parameters = 0
n_bytes = 0
for path in shards:
    reader = GGUFReader(path)
    for tensor in reader.tensors:
        n_parameters += math.prod(tensor.shape)
        n_bytes += tensor.data.nbytes

print(f"{n_parameters=:,}")
print(f"{n_bytes=:,}")

GGUF 모델 파일의 텐서 정보를 읽어 실제 모델 가중치가 차지하는 메모리 크기를 계산하는 코드

KV 캐시 크기를 계산하는 수학적 공식
DiagramLLM 추론 시 필요한 메모리 용량을 산정하기 위해 레이어 수, 헤드 수, 차원, 컨텍스트 크기를 변수로 하는 수식을 제시한다. 이 수식은 하드웨어 선정 단계에서 vRAM 용량 부족 여부를 판단하는 핵심 근거가 된다.
Dense Attention과 Window Attention의 복잡도 및 성능 비교 다이어그램
Diagram전체 컨텍스트를 참조하는 방식과 슬라이딩 윈도우 방식을 비교하여 효율성을 설명한다. gpt-oss-120b와 같은 하이브리드 모델이 메모리 사용량을 줄이기 위해 어떤 메커니즘을 사용하는지 시각적으로 보여준다.
모델 가중치와 KV 캐시를 포함한 최종 GPU 메모리 점유량 계산 결과
Screenshot126,000 토큰의 컨텍스트와 4개의 병렬 슬롯을 운영할 때 약 97.8GB의 메모리가 필요함을 보여준다. 이는 선택한 RTX Pro 6000 GPU의 가용 메모리 범위 내에 있음을 입증하는 수치이다.
구축에 사용된 ASUS ESC4000A-E12 2U GPU 서버의 내부 구조
Photo4개의 GPU 슬롯을 갖춘 2U 폼팩터 서버의 물리적 구조를 보여준다. 온프레미스 랙 공간 효율성과 확장성을 고려한 하드웨어 선택임을 시각적으로 뒷받침한다.
Podman을 통한 루트리스 컨테이너 격리: 보안을 위해 루트 권한이 없는(rootless) Podman 컨테이너 환경을 구축하고, CDI(Container Device Interface)를 통해 GPU 자원을 할당했다. 사용자 네임스페이스(User Namespace)를 활용해 컨테이너 내부의 루트 사용자를 호스트의 일반 사용자로 매핑함으로써 컨테이너 탈출 시 발생할 수 있는 권한 상승 위험을 최소화했다.
bash
cmake -B build -DGGML_CUDA=ON -DCMAKE_CUDA_COMPILER=/usr/local/cuda-13/bin/nvcc ./llama.cpp
cmake --build build --config Release
./build/bin/llama-cli --list-devices

CUDA 백엔드를 활성화하여 llama.cpp를 빌드하고 사용 가능한 GPU 장치를 확인하는 과정

Podman의 사용자 네임스페이스 매핑 구조도
Diagram호스트의 일반 사용자가 컨테이너 내부에서 루트 권한을 가지지만, 실제 호스트 시스템에는 영향을 주지 않는 UID 매핑 원리를 설명한다. 보안 격리의 핵심 기술인 사용자 네임스페이스의 작동 방식을 도식화했다.
네트워크 차단 및 유닉스 소켓 통신: 추론 서버의 데이터 유출 경로를 원천 차단하기 위해 컨테이너의 네트워크 스택을 제거했다. 대신 유닉스 도메인 소켓(UNIX Domain Socket)을 통해 API를 노출하고, Nginx 리버스 프록시를 사용하여 허용된 API 경로만 화이트리스트 방식으로 접근을 허용하는 구조를 채택했다.
text
map "$request_method:$uri" "$whitelist" {
    default 0;
    "GET:/" 1;
    "GET:/health" 1;
    "POST:/chat/completions" 1;
    "POST:/v1/chat/completions" 1;
}

upstream container01 {
    server unix:/var/lib/containers/container01/socks/llama-cpp.sock;
}

server {
    listen 127.0.0.1:80;
    location / {
        if ($whitelist = 0) { return 403; }
        proxy_pass http://container01;
    }
}

Nginx를 사용하여 허용된 API 경로만 화이트리스트 방식으로 접근을 허용하는 리버스 프록시 설정

커널 모듈 및 장치 파일 보안 강화: 불필요한 NVIDIA 커널 모듈을 블랙리스트 처리하고, 공유 메모리 취약점이 우려되는 nvidia-uvm 대신 Vulkan 백엔드를 사용하여 보안성을 높였다. /dev/nvidia* 장치 파일에 대해 POSIX ACL(Access Control Lists)을 적용하여 특정 사용자만 접근할 수 있도록 권한을 엄격히 제한했다.
text
[Container]
Image=ghcr.io/ggml-org/llama.cpp:server-vulkan
AddDevice=nvidia.com/gpu=0
Network=none
Volume=/var/lib/models:/models:ro
User=1000
UserNS=keep-id
NoNewPrivileges=true
Exec=--host "/run/llama-cpp/llama-cpp.sock" --model /models/gpt-oss-120b.gguf --ctx-size 504000 --parallel 4

Podman Quadlet을 사용하여 네트워크가 차단된 고립된 LLM 컨테이너 서비스를 정의하는 설정

CUDA와 Vulkan 성능 비교: 보안상의 이유로 도입한 Vulkan 백엔드가 CUDA 대비 약 2~9% 수준의 미미한 성능 저하만을 보임을 벤치마크를 통해 확인했다. 특히 긴 컨텍스트(131,072 토큰) 환경에서는 성능 차이가 2% 이내로 좁혀져, 보안과 성능 사이의 적절한 타협점임을 입증했다.

용어 해설

키-값 캐시(KV Cache)
LLM 추론 시 이전 토큰들의 계산 결과를 메모리에 저장하여 중복 계산을 방지하는 메커니즘이다. 문맥이 길어질수록 계산 복잡도가 지수적으로 증가하는 문제를 선형적으로 해결하여 추론 속도를 비약적으로 향상시킨다.
양자화(Quantization)
모델의 가중치를 낮은 비트 정밀도(예: 16비트에서 4비트)로 변환하여 메모리 사용량을 줄이고 연산 속도를 높이는 기법이다. 대형 모델을 제한된 GPU 자원에서 실행하기 위한 필수적인 최적화 과정이다.
루트리스 컨테이너(Rootless Container)
호스트 시스템의 루트 권한 없이 일반 사용자 권한으로 실행되는 컨테이너 기술이다. 컨테이너 내부에서 보안 사고가 발생하더라도 호스트 시스템 전체의 권한이 탈취되는 위험을 원천적으로 차단한다.
사용자 네임스페이스(User Namespace)
컨테이너 내부의 사용자 ID(UID)를 호스트의 다른 UID 범위로 매핑하여 격리하는 리눅스 커널 기능이다. 이를 통해 컨테이너 안의 루트 사용자가 실제 호스트에서는 아무런 권한이 없는 일반 사용자로 인식되게 한다.
컨테이너 장치 인터페이스(CDI)
Container Device Interface의 약자로, 컨테이너 런타임이 GPU와 같은 서드파티 장치를 표준화된 방식으로 인식하고 할당할 수 있게 하는 사양이다. 복잡한 장치 매핑 과정을 자동화하고 보안성을 높인다.
벌칸(Vulkan)
크로스 플랫폼을 지원하는 고성능 그래픽 및 연산 API 표준이다. NVIDIA 전용인 CUDA의 대안으로 사용 가능하며, 특정 벤더에 종속되지 않는 보안 강화된 추론 환경을 구축할 때 유리하다.

기술

  • llama.cpp
  • Podman
  • NVIDIA RTX Pro 6000
  • Vulkan
  • Nginx
  • AppArmor
  • Debian

활용 사례

  • 기밀 문서 번역
  • 오프라인 지식 인덱싱
  • 코드베이스 보안 분석
  • 로그 데이터 분석
AI 분석 전체 내용 보기

AI 요약 · 북마크 · 개인 피드 설정 — 무료

출처 · 인용 안내

원문 발행 2026. 03. 22.수집 2026. 03. 22.출처 타입 RSS

인용 시 "요약 출처: AI Trends (aitrends.kr)"를 표기하고, 사실 확인은 원문 보기 기준으로 진행해 주세요. 자세한 기준은 운영 정책을 참고해 주세요.