Vấn đề mình gặp phải: Browser isolation cho team làm việc từ xa
Hồi đầu năm ngoái, team mình có một incident khá đau: một anh dev mở file đính kèm email trên máy cá nhân, máy bị nhiễm keylogger, và credentials VPN bị lộ. Không phải lỗi của anh ấy — anh làm việc từ nhà, dùng máy tính gia đình để truy cập hệ thống công ty.
Bài toán đặt ra là: làm sao để nhân viên truy cập được hệ thống nội bộ mà không cần lo máy cá nhân của họ có sạch hay không? Mình bắt đầu tìm giải pháp Browser Isolation — tức là trình duyệt chạy ở một môi trường riêng biệt, cách ly hoàn toàn khỏi máy người dùng.
Phân tích: Tại sao các giải pháp truyền thống không ổn?
Mình đã thử qua vài hướng trước khi đến với Kasm:
- RDP vào Windows Server: Tốn phí license, quản lý phức tạp, mỗi user cần một session riêng chiếm RAM khủng.
- VDI doanh nghiệp (Citrix, VMware Horizon): Chi phí licensing cực kỳ cao, setup mất cả tuần, overkill cho team 20 người.
- Guacamole + KVM: Mình đã dùng combo này một thời gian trên homelab Proxmox. Ổn về mặt kỹ thuật nhưng quản lý session, lifecycle VM rất thủ công — mỗi lần cần môi trường mới phải tạo VM bằng tay.
Vấn đề chung: không có giải pháp nào vừa rẻ, vừa nhanh, vừa cho phép spin up môi trường browser/desktop on-demand trong vài giây.
Các giải pháp có thể dùng
Option 1: Apache Guacamole + VM pool
Guacamole là gateway HTML5 cho RDP/VNC/SSH. Kết hợp với một pool VM sẵn sàng thì cũng giải quyết được, nhưng phải tự code phần phân phối session, tự handle cleanup sau khi user thoát. Mình đã thử và bỏ cuộc sau 2 tuần.
Option 2: Neko (m1k1o/neko)
Neko là browser chạy trong Docker, stream qua WebRTC. Giao diện đẹp, latency thấp, nhưng chỉ hỗ trợ 1 user per container và không có management portal.
Option 3: Kasm Workspaces (Community Edition)
Đây là giải pháp mình đang dùng cho production. Kasm chạy browser, desktop, thậm chí full Linux desktop trong container Docker, stream qua HTTPS/WebSocket. Community Edition miễn phí, hỗ trợ đến 5 concurrent sessions.
Cách tốt nhất: Cài đặt Kasm Workspaces trên Ubuntu
Mình chạy Kasm trên một VM trong homelab Proxmox VE — playground test mọi thứ trước khi lên production. VM này: Ubuntu 22.04, 4 vCPU, 8GB RAM, 50GB disk. Kasm yêu cầu tối thiểu 2 CPU và 4GB RAM.
Bước 1: Chuẩn bị hệ thống
# Update hệ thống
sudo apt update && sudo apt upgrade -y
# Cài các gói cần thiết
sudo apt install -y curl wget gnupg2
# Tắt swap (Kasm không thích swap)
sudo swapoff -a
sudo sed -i '/swap/d' /etc/fstab
Bước 2: Download và cài đặt Kasm
# Download installer (kiểm tra phiên bản mới nhất tại kasm.io)
cd /tmp
wget https://kasm-static-content.s3.amazonaws.com/kasm_release_1.16.0.a12b22.tar.gz
# Giải nén
tar -xf kasm_release_*.tar.gz
# Chạy installer (--accept-eula để bỏ qua prompt xác nhận)
sudo bash kasm_release/install.sh --accept-eula
Quá trình cài khoảng 5-10 phút tùy tốc độ mạng — Kasm sẽ pull một đống Docker image về. Sau khi xong, terminal sẽ in ra thông tin như này:
Kasm UI Login Credentials
-----------------------------
Username: [email protected]
Password: XXXXXXXXXXXXXX
Kasm UI is available at https://<YOUR_IP>
Copy ngay mật khẩu này ra — nó chỉ hiện một lần.
Bước 3: Truy cập và cấu hình ban đầu
Mở trình duyệt, vào https://<IP_SERVER>. Có thể bị cảnh báo SSL self-signed, bấm Advanced → Proceed. Đăng nhập bằng [email protected] và mật khẩu vừa copy.
Vào Admin → Workspaces để thấy danh sách các workspace template mặc định: Chrome, Firefox, Ubuntu Desktop, VS Code… Mỗi cái là một Docker image riêng.
Bước 4: Thêm user và phân quyền
# Kasm cũng có REST API để tạo user tự động
# Ví dụ tạo user qua API:
curl -k -X POST https://localhost/api/public/register_user \
-H 'Content-Type: application/json' \
-d '{
"api_key": "YOUR_API_KEY",
"api_key_secret": "YOUR_API_SECRET",
"target_user": {
"username": "[email protected]",
"first_name": "Dev",
"last_name": "User",
"password": "SecurePass123!",
"locked": false,
"disabled": false
}
}'
API key lấy từ Admin → API Configurations. Với team nhỏ thì tạo user thủ công qua UI cũng được.
Bước 5: Cấu hình Workspace tùy chỉnh
Mình hay tạo workspace Chrome với một số cấu hình bảo mật riêng — disable clipboard từ container ra host, giới hạn microphone, camera:
Vào Admin → Workspaces → Add Workspace:
- Workspace Type: Container
- Docker Image:
kasmweb/chrome:1.16.0 - Cores: 2
- Memory (MB): 2048
- GPU Count: 0
Phần Persistent Profile Path quan trọng nếu muốn user giữ lại bookmarks, settings giữa các session:
/mnt/kasm_profiles/{username}/chrome
Bước 6: Setup reverse proxy với Nginx
Kasm mặc định chạy HTTPS port 443 tự quản. Nếu muốn dùng domain riêng, cần reverse proxy. Mình dùng Nginx trên một VM khác trong Proxmox:
server {
listen 443 ssl;
server_name kasm.yourdomain.com;
ssl_certificate /etc/letsencrypt/live/kasm.yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/kasm.yourdomain.com/privkey.pem;
location / {
proxy_pass https://KASM_SERVER_IP;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# WebSocket support — quan trọng, thiếu cái này stream sẽ không hoạt động
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 1800;
proxy_send_timeout 1800;
}
}
Bước 7: Kiểm tra và monitor
# Kiểm tra các service Kasm đang chạy
sudo /opt/kasm/bin/stop
sudo /opt/kasm/bin/start
# Xem log
sudo docker logs kasm_proxy
sudo docker logs kasm_api
sudo docker logs kasm_manager
# Kiểm tra container đang chạy
sudo docker ps | grep kasm
Một số lưu ý từ kinh nghiệm thực tế
Sau vài tháng chạy Kasm trên homelab rồi đẩy lên production, mình rút ra mấy điều:
- RAM là bottleneck chính: Mỗi Chrome session ngốn khoảng 1.5-2GB RAM. 8GB RAM = tối đa 4-5 session đồng thời thoải mái.
- Persistent profiles cần được dọn định kỳ: Profile directory phình rất nhanh nếu user tải file về. Nên set retention policy.
- Community Edition giới hạn 5 concurrent sessions: Đủ cho team nhỏ. Muốn nhiều hơn thì phải trả phí hoặc tự build multi-node cluster (phức tạp hơn nhiều).
- WebRTC và UDP: Nếu có firewall chặt, stream có thể bị fallback về WebSocket — chậm hơn nhưng vẫn chạy được. Mở UDP 4902 nếu muốn performance tốt nhất.
Kasm so với Guacamole — nên chọn cái nào?
Câu hỏi này mình được hỏi khá nhiều. Nếu team chủ yếu cần SSH/RDP vào các server có sẵn thì Guacamole đơn giản hơn và nhẹ hơn. Nhưng nếu cần Browser Isolation thật sự — tức là trình duyệt chạy hoàn toàn trong container, không chạm gì đến máy user — thì Kasm là lựa chọn phù hợp hơn nhiều.
Mình đang dùng cả hai: Guacamole cho SSH jump host, Kasm cho browser isolation và môi trường desktop tạm thời khi cần test thứ gì đó mà không muốn ảnh hưởng máy chính.

