자체 호스팅 LLM 추론 서버 노출은 직접 올린 로컬 모델 서버의 API 포트가 인증 없이 인터넷에 열려, 외부 누구나 모델을 열거하고 추론을 실행할 수 있는 상태다.
대표적인 로컬 추론 서버 Ollama 기준으로 기본 바인딩은 127.0.0.1:11434이지만, 다른 PC에서 GPU를 쓰려고 이를 0.0.0.0으로 바꾸는 순간 인증 없는 엔드포인트가 공개된다. 공식 문서조차 인증 경고 없이 OLLAMA_HOST=0.0.0.0 예시를 그대로 제시한다. DB를 인증 없이 공개 IP에 올려 터진 사고와 구조가 같고, 이번에는 대상이 GPU와 모델이다. LeakIX는 2026-02-23 기준 무인증 노출 인스턴스 12,269대를 집계했고 한국이 453대였다.
이 글은 자주 발생하는 실수 패턴, 점검·조치 절차, 자가진단을 정리했다.
한눈에 보는 핵심
Q. 로컬에 올린 서버인데 외부에서 못 들어오는 거 아닌가요? A. 바인드 주소를 바꾸면 들어옵니다. 공식 문서는 기본값이 127.0.0.1 포트 11434라고 적고, 네트워크 노출 방법으로는 OLLAMA_HOST 변경만 안내합니다. 인증·접근 통제 서술은 그 페이지에 없고 예시 값으로 0.0.0.0을 경고 없이 제시합니다. 바인딩을 푸는 순간 인증 수단이 없는 API가 공개됩니다. Q. 열려 있으면 최악의 경우 무엇을 잃나요? A. 먼저 GPU입니다. 외부 누구나 모델을 열거하고 추론을 돌려 연산 자원을 가져다 쓰고, /api/push로 로컬 모델 가중치를 공격자 레지스트리로 밀어낼 수 있습니다. 구버전이면 메모리까지 샙니다. NVD 기준 CVE-2026-7482는 0.17.1 미만에서 /api/create로 받은 조작 GGUF 파일이 힙 범위 밖을 읽게 만들며, 유출 메모리에 환경변수·API 키·시스템 프롬프트·동시 사용자 대화 데이터가 포함될 수 있습니다. Q. 외부 점검 도구로 이 문제를 찾을 수 있나요? A. 이 건은 못 찾습니다. CodeScan은 URL 기반 외부 점검이라 입력한 주소의 호스트에서 널리 쓰이는 공통 포트(FTP·SSH·DB·RDP·Redis·MongoDB 등)와 공개 영역 설정만 확인합니다. 추론 포트 11434는 그 점검 목록에 없고, 추론 서버가 웹사이트와 다른 IP면 범위 밖입니다. AI 전용 스캐너도 아니어서 모델·프롬프트·에이전트는 보지 않습니다. 이 노출은 아래 자가진단으로 직접 확인해야 합니다.자주 발생하는 실수 패턴
| # | 패턴 | 위험도 |
|---|---|---|
| 1 | OLLAMA_HOST를 0.0.0.0으로 바꾸고 방화벽·보안그룹은 그대로 둠 | 치명 |
| 2 | 추론 포트를 공개 IP에 직접 노출 — 인증·요청 제한 프록시가 앞에 없어 GPU 연산을 남이 쓴다 | 치명 |
| 3 | /api/push·/api/create를 외부에서 호출 가능한 상태로 방치 — 가중치 반출과 조작 모델 주입 경로 | 치명 |
| 4 | 0.17.1 미만 구버전 유지 — 노출이 CVE-2026-7482를 원격 공격으로 승격 | 치명 |
| 5 | 환경변수에 외부 LLM API 키·DB 비밀번호를 담아둔 상태로 운영 — 메모리 유출 시 2차 피해 | 높음 |
| 6 | 포트만 닫고 종료 — 노출 기간의 호출 로그 확인과 키 로테이션을 건너뜀 | 중간 |
표준 구현 코드
# 1) 추론 서버는 루프백에만 바인딩 (systemd drop-in — 디렉터리가 없으면 먼저 만든다)
sudo mkdir -p /etc/systemd/system/ollama.service.d
sudo tee /etc/systemd/system/ollama.service.d/override.conf >/dev/null <<'EOF'
[Service]
Environment="OLLAMA_HOST=127.0.0.1:11434"
EOF
sudo systemctl daemon-reload && sudo systemctl restart ollama
# 2) 포트 위생은 기본만 — 11434 인바운드 차단, 클라우드 보안그룹도 같이 닫는다
sudo ufw deny in 11434/tcp
# 3) 원격 사용이 필요하면 앞단 프록시만 공개 — nginx
# http {
# limit_req_zone $binary_remote_addr zone=llm:10m rate=10r/m; # 없으면 nginx -t가 unknown zone 에러
# }
# server {
# location / {
# auth_basic "llm"; auth_basic_user_file /etc/nginx/.htpasswd;
# limit_req zone=llm burst=5 nodelay; # GPU 연산 자원 탈취 억제
# proxy_pass http://127.0.0.1:11434; # 추론 서버는 루프백
# }
# location /api/push { return 403; } # 모델 가중치 반출 입구
# location /api/create { return 403; } # CVE-2026-7482 공격 입구
# }
핵심은 "동작하는 코드"와 "안전한 코드"가 다르다는 점이다.
AI 코딩 도구는 기능 충족 코드를 우선 출력하므로 보안 분기는 별도로 강제해야 한다.
미들웨어·정책·배포 설정으로 모든 경로에 일괄 적용하는 것이 표준이다.
자가진단
# 1) 외부에서 보이는지 — 사무실·집 밖(휴대폰 테더링 등)에서 실행한다
# 모델 목록 JSON이 돌아오면 전 세계에 열려 있는 것이다
curl --max-time 5 http://<서버공개IP>:11434/api/tags
# 2) 버전 — 0.17.1 미만이면 CVE-2026-7482 대상
ollama --version
# 3) 실제 바인딩 주소 (0.0.0.0이면 공개 상태)
ss -lntp | grep 11434
# 4) 노출 기간의 흔적 — 연산 탈취(generate·chat)와 가중치 반출(push) 호출
journalctl -u ollama --since '30 days ago' | grep -E '/api/(generate|chat|pull|push|create)'
위 시그널이 발견되면 결함이다. GitHub Security Advisory — CVE-2026-7482 원문(0.17.1 패치 확인)를 함께 참조하라.
조치 절차
| 순위 | 조치 |
|---|---|
| 1 | OLLAMA_HOST를 127.0.0.1:11434로 되돌리거나, 방화벽·보안그룹에서 11434 인바운드를 즉시 차단 |
| 2 | 버전을 0.17.1 이상으로 올린다 — CVE-2026-7482(CVSS 3.1 9.1 CRITICAL) 수정 기준선 |
| 3 | 노출 기간이 있었다면 그 서버 환경변수에 든 외부 LLM API 키·DB 비밀번호를 전부 로테이트 |
| 4 | 호출 로그에서 외부 IP의 /api/generate·/api/chat(연산 탈취)과 /api/push(가중치 반출)를 조사 |
| 5 | 원격 사용이 필요하면 추론 서버는 루프백에 두고 인증·TLS·요청 제한을 가진 프록시만 공개 |
| 6 | 함께 띄운 웹 UI·벡터DB 포트도 같은 기준으로 재점검 — 일반 포트 위생은 아래 포트 보안 가이드 참조 |
지금 해야 할 것
실무자: CodeScan 무료 스캔으로 점검 후 우선순위대로 패치.