❤️ AZDIGI chính thức cập nhật hệ thống blog mới hoàn chỉnh. Tuy nhiên có thể một số bài viết bị sai lệch hình ảnh, hãy ấn nút Báo cáo bài viết ở cuối bài để AZDIGI cập nhật trong thời gian nhanh nhất. Chân thành cám ơn.

Bạn đã cài xong Ollama, chạy được model, kết nối Open WebUI ngon lành. Giờ muốn truy cập từ bên ngoài, từ laptop, từ điện thoại, hay chia sẻ cho vài người bạn dùng thử. Nhưng khoan, bạn đã nghĩ tới chuyện bảo mật chưa?

Mặc định, Ollama lắng nghe trên port 11434 và không có bất kỳ lớp xác thực nào. Ai biết IP của bạn, người đó dùng được. Bài này mình sẽ đi qua từng bước để khóa chặt server AI của bạn lại, từ firewall, reverse proxy với SSL, cho tới authentication và network isolation.

Tại sao phải bảo mật Ollama?

Ollama API mở toang nghĩa là bất kỳ ai cũng có thể:

  • Dùng miễn phí GPU/CPU của bạn để chạy model. Mỗi request tốn tài nguyên thật, và nếu ai đó spam thì server bạn chết.
  • Kéo hoặc xóa model thông qua API. Ollama cho phép pull, delete model qua REST API mà không cần xác thực.
  • Đọc nội dung trò chuyện nếu traffic không mã hóa. Trên mạng công cộng, dữ liệu đi dạng plaintext hoàn toàn.
  • Prompt injection để khai thác model làm những việc không mong muốn, hoặc trích xuất system prompt.

Nghe đáng sợ đúng không? Nhưng fix thì không khó. Mình sẽ đi qua 5 bước, mỗi bước thêm một lớp bảo vệ.

Cấu hình UFW firewall cho AI self-hosted

Bước 1: Firewall với UFW

Việc đầu tiên luôn là firewall. UFW (Uncomplicated Firewall) có sẵn trên Ubuntu, dùng vài lệnh là xong.

Ý tưởng rất đơn giản: chỉ mở những port cần thiết, chặn hết phần còn lại. Đặc biệt là chặn port 11434 của Ollama, vì mình sẽ dùng reverse proxy để truy cập thay vì kết nối trực tiếp.

# Cho phép SSH — quan trọng, đừng khóa chính mình ra ngoài
sudo ufw allow 22/tcp

# Cho phép HTTP và HTTPS cho reverse proxy sudo ufw allow 80/tcp sudo ufw allow 443/tcp

# Chặn truy cập trực tiếp vào Ollama từ bên ngoài sudo ufw deny 11434

# Bật firewall sudo ufw enable

# Kiểm tra lại sudo ufw status

Lưu ý: Nếu bạn đang SSH vào server, hãy chắc chắn allow port 22 TRƯỚC khi enable UFW. Không thì bạn sẽ tự khóa mình ra ngoài và phải vào console của VPS provider để fix.

Sau bước này, Ollama vẫn chạy bình thường trên localhost, nhưng không ai từ bên ngoài truy cập trực tiếp port 11434 được nữa.

Bước 2: Reverse proxy với Caddy

Mình chọn Caddy thay vì Nginx vì một lý do chính: auto HTTPS. Caddy tự động lấy certificate từ Let’s Encrypt, tự renew, không cần config thêm gì. Với Nginx bạn phải cài certbot, setup cron renew, rồi config SSL cipher. Caddy làm hết.

Cài Caddy:

sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy

Tạo file /etc/caddy/Caddyfile với nội dung:

ai.yourdomain.com {
    reverse_proxy localhost:11434
}

Đúng, chỉ 3 dòng. Caddy sẽ tự động:

  • Lấy SSL certificate từ Let’s Encrypt
  • Redirect HTTP sang HTTPS
  • Proxy tất cả request tới Ollama trên localhost

Reload Caddy để áp dụng:

sudo systemctl reload caddy

Nhớ trỏ DNS của ai.yourdomain.com về IP server trước khi reload. Caddy cần verify domain để lấy certificate.

Giờ bạn truy cập https://ai.yourdomain.com là tới được Ollama, có HTTPS đàng hoàng. Nhưng vẫn chưa có xác thực, ai có link vẫn vào được.

Bước 3: Thêm Authentication

Có hai cách tiếp cận tùy vào setup của bạn.

Cách 1: Basic Auth trên Caddy

Nếu bạn expose Ollama API trực tiếp (không qua Open WebUI), thêm basic auth vào Caddy là cách nhanh nhất.

Tạo password hash:

caddy hash-password --plaintext 'mat-khau-cua-ban'

Cập nhật Caddyfile:

ai.yourdomain.com {
    basicauth {
        admin $2a$14$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    }
    reverse_proxy localhost:11434
}

Thay admin bằng username bạn muốn, và dán hash vừa tạo vào sau username.

Cách 2: Open WebUI built-in auth

Nếu bạn dùng Open WebUI (mà đa số sẽ dùng), thì tin vui là nó đã có sẵn hệ thống đăng nhập. Người dùng đầu tiên đăng ký sẽ trở thành admin, và bạn có thể bật/tắt cho phép đăng ký mới trong Settings.

Trong trường hợp này, Caddy chỉ cần proxy tới Open WebUI (mặc định port 3000 hoặc 8080) thay vì Ollama:

ai.yourdomain.com {
    reverse_proxy localhost:3000
}

Gợi ý: Dù dùng Open WebUI, bạn vẫn nên chặn port 11434 bằng firewall. Đừng để Ollama API lộ ra ngoài khi đã có Open WebUI làm lớp trung gian.

Checklist bảo mật AI self-hosted

Bước 4: Docker network isolation

Nếu bạn chạy Ollama và Open WebUI bằng Docker (theo bài trước trong series), thì có thêm một lớp bảo mật nữa: network isolation.

Mặc định, Docker container dùng bridge network và có thể truy cập lẫn nhau cũng như ra ngoài internet. Mình sẽ tạo một internal network riêng, để Ollama chỉ nói chuyện được với Open WebUI thôi.

Cập nhật docker-compose.yml:

services:
  ollama:
    image: ollama/ollama
    networks:
      - ai-internal
    # KHÔNG publish port 11434 ra ngoài
    # ports:
    #   - "11434:11434"
    volumes:
      - ollama-data:/root/.ollama
    deploy:
      resources:
        reservations:
          devices:
            - capabilities: [gpu]

open-webui: image: ghcr.io/open-webui/open-webui:main ports: - "3000:8080" networks: - ai-internal environment: - OLLAMA_BASE_URL=http://ollama:11434 volumes: - open-webui-data:/app/backend/data

networks: ai-internal: internal: true

volumes: ollama-data: open-webui-data:

Điểm quan trọng ở đây:

  • internal: true nghĩa là network này không có đường ra internet. Container trong network chỉ nói chuyện được với nhau.
  • Ollama không publish port nào ra host. Chỉ Open WebUI kết nối được tới Ollama qua Docker DNS (http://ollama:11434).
  • Open WebUI vẫn publish port 3000 ra host để Caddy proxy tới.

Lưu ý: Với internal: true, Ollama sẽ không thể pull model từ internet. Bạn cần tạm bỏ flag này khi muốn tải model mới, hoặc thêm một network thứ hai có internet access riêng cho việc pull model.

Bước 5: Rate limiting

Dù đã có auth, vẫn nên giới hạn số request để tránh bị abuse hoặc brute-force password. Caddy có module rate_limit để làm việc này.

Cài thêm module rate_limit cho Caddy:

sudo caddy add-package github.com/mholt/caddy-ratelimit

Cập nhật Caddyfile:

ai.yourdomain.com {
    rate_limit {
        zone dynamic_zone {
            key {remote_host}
            events 30
            window 1m
        }
    }
reverse_proxy localhost:3000
}

Config trên giới hạn mỗi IP tối đa 30 request trong 1 phút. Bạn điều chỉnh con số tùy theo mức dùng thực tế. Nếu chỉ có 2-3 người dùng thì 20-30 request/phút là hợp lý. Nếu dùng nhiều hơn thì tăng lên.

Firewall rules

Checklist bảo mật tổng hợp

Tổng hợp lại những gì cần kiểm tra sau khi setup xong:

Hạng mụcKiểm tra
FirewallUFW enabled, chỉ mở port 22, 80, 443. Port 11434 bị deny.
SSL/HTTPSTruy cập qua HTTPS, certificate valid, HTTP tự redirect sang HTTPS.
AuthenticationKhông truy cập được API/WebUI mà không đăng nhập.
Network isolationOllama không expose port ra host. Chỉ Open WebUI kết nối được.
Rate limitingSpam request bị chặn sau ngưỡng cho phép.
SSHDùng key-based auth, tắt password login nếu được.
UpdatesOS, Docker, Caddy, Ollama đều ở phiên bản mới nhất.

Ngoài ra, một vài điểm nâng cao nếu bạn muốn đi xa hơn:

  • Fail2ban để tự động ban IP sau nhiều lần login sai.
  • Tailscale/WireGuard để tạo VPN riêng, không cần expose ra public internet.
  • Log monitoring với Caddy access log để theo dõi ai đang truy cập.
  • Backup định kỳ cho model data và conversation history.

Tổng kết

5 bước ở trên không mất quá 30 phút để setup, nhưng sẽ khác biệt rất lớn so với việc để Ollama mở toang ra internet. Tóm lại:

  1. UFW chặn mọi truy cập trực tiếp vào Ollama
  2. Caddy làm reverse proxy với auto SSL
  3. Authentication qua Caddy basic auth hoặc Open WebUI
  4. Docker network cô lập Ollama khỏi thế giới bên ngoài
  5. Rate limiting chống spam và brute-force

Bảo mật không phải làm một lần rồi quên. Nhớ cập nhật software thường xuyên, kiểm tra log, và review lại config khi thêm service mới.

Bài tiếp theo trong series, mình sẽ nói về cách tối ưu hiệu năng Ollama, chọn model phù hợp với phần cứng, và các mẹo để chạy mượt hơn trên VPS.

Chia sẻ:
Bài viết đã được kiểm duyệt bởi AZDIGI Team

Về tác giả

Trần Thắng

Trần Thắng

Chuyên gia tại AZDIGI với nhiều năm kinh nghiệm trong lĩnh vực web hosting và quản trị hệ thống.

Hơn 10 năm phục vụ 80.000+ khách hàng

Bắt đầu dự án web của bạn với AZDIGI