Podman Rootful vs Rootless: Chọn Cái Nào Cho VPS Production?
So sánh chi tiết Podman rootful và rootless — networking, DNS, iptables, systemd, và tại sao rootful lại là lựa chọn thực tế hơn cho VPS production dù rootless nghe có vẻ an toàn hơn.
Mục lục
Podman hay quảng bá rootless như một tính năng bảo mật vượt trội so với Docker. Trên lý thuyết đúng. Nhưng khi deploy thực tế lên VPS với UFW, Tailscale, Nginx, và nhiều service phức tạp — rootless mang theo hàng loạt vấn đề networking và DNS khó debug. Bài này phân tích thực chất sự khác biệt, khi nào nên dùng cái nào.
1. Rootful và Rootless là gì
Podman rootful chạy container daemon và các container process với quyền root. Tương tự Docker truyền thống.
Podman rootless chạy toàn bộ container stack dưới user thường, không có quyền root. Container process bên trong map sang UID cao trong user namespace, không phải UID 0 thực sự của hệ thống.
Rootful:
host root (UID 0)
└── podman daemon (root)
└── container process (root trong container = root trên host)
Rootless:
host user (UID 1000)
└── podman (không có daemon)
└── container process (root trong container = UID 100000+ trên host)
2. Sự khác biệt cốt lõi
2.1 Networking
Đây là điểm khác biệt lớn nhất và dễ gây vấn đề nhất.
Rootful dùng bridge network thực sự với iptables/nftables:
Container (10.88.0.x)
└── podman bridge (10.88.0.0/16)
└── iptables FORWARD + MASQUERADE
└── eth0 (public IP)
Có thể bind port thấp (80, 443), tạo interface mới, thao tác iptables trực tiếp.
Rootless dùng slirp4netns hoặc pasta — userspace network stack, không cần quyền kernel:
Container
└── slirp4netns (userspace TAP)
└── socket trên host user
└── eth0
Không thể bind port dưới 1024 mà không có sysctl đặc biệt. Throughput thấp hơn vì packet đi qua userspace. Không thao tác được iptables.
2.2 DNS nội bộ
Rootful dùng aardvark-dns — process chạy trên host, lắng nghe trên gateway của mỗi bridge network (ví dụ 10.88.0.1:53). Container resolve hostname của nhau qua đây.
Rootless dùng aardvark-dns nhưng trong user namespace. DNS server lắng nghe trên địa chỉ trong slirp4netns namespace — không phải trên host network stack. Điều này khiến việc debug khó hơn vì ss -ulnp trên host không thấy port 53 của rootless container.
2.3 Volume và file permission
Rootful: file tạo bởi container process chạy UID 0 trên host. Dễ gặp vấn đề ownership nếu volume mount vào thư mục host.
Rootless: container root (UID 0 trong container) map sang UID 100000+ trên host. File tạo ra có owner là UID lạ, khó chỉnh sửa từ host user thường.
# Rootless: tạo file trong container
podman exec myapp touch /data/test.txt
# Nhìn từ host
ls -la /data/test.txt
# -rw-r--r-- 1 100000 100000 0 Mar 27 10:00 test.txt
# Không phải user của bạn
2.4 Systemd integration
Rootful dùng systemd ở system level (/etc/systemd/system/). Service khởi động cùng hệ thống, không cần user login.
Rootless dùng systemd --user (~/.config/systemd/user/). Mặc định chỉ chạy khi user login, cần enable loginctl enable-linger để chạy khi không có session.
2.5 iptables và port binding
| Tính năng | Rootful | Rootless |
|---|---|---|
| Bind port < 1024 | Có | Không (cần sysctl) |
| Thao tác iptables | Có | Không |
| Bridge network thực | Có | Không (slirp4netns) |
| Macvlan / ipvlan | Có | Không |
| Network throughput | Cao (kernel) | Thấp hơn (userspace) |
3. Bảo mật: Rootless thực sự an toàn hơn không?
Lợi thế thực sự của rootless
Nếu container bị compromise và attacker thoát ra khỏi namespace, attacker có UID 100000+ trên host — không làm gì được nhiều. Với rootful, attacker có UID 0 thực sự — game over.
Với workload không tin tưởng (chạy code người dùng upload, sandbox môi trường), rootless có giá trị bảo mật thực sự.
Hạn chế bảo mật của rootless
Trên VPS production điển hình:
- Bạn là người viết Dockerfile và compose file — không có untrusted code
- Container compromise thường đến từ lỗ hổng trong app, không phải container escape
- UID 100000+ vẫn có thể đọc file có permission 644 (là đa số file config)
- Rootless không bảo vệ bạn khỏi lỗ hổng ở tầng application
Bảo mật thực tế trên VPS production quan trọng hơn là:
- Không expose port không cần thiết (UFW)
- Secrets management đúng cách (không hardcode trong image)
- Network isolation giữa các service
- Update image thường xuyên
4. Vấn đề thực tế khi dùng rootless trên VPS
4.1 Nginx bind port 80/443
# Rootless — lỗi khi container cố bind port 80
ports:
- "80:80"
# Error: rootlessport cannot expose privileged port 80
Cần workaround: bind port cao trên host rồi dùng Nginx/Caddy bên ngoài reverse proxy, hoặc set trong sysctl: net.ipv4.ip_unprivileged_port_start=80.
4.2 Không có auto-start khi reboot
# Rootless service không tự start nếu quên bước này
loginctl enable-linger $USER
systemctl --user enable podman-compose@myapp
Nếu quên một trong hai bước, service không lên sau reboot — thường chỉ phát hiện khi có người dùng báo lỗi.
4.3 Debug networking khó hơn
Với rootful, có thể kiểm tra trực tiếp:
ip link show # thấy podman bridge
ss -ulnp | grep :53 # thấy aardvark-dns
iptables -L FORWARD -n -v # thấy toàn bộ rules
Với rootless, các interface và port nằm trong user namespace:
# Phải chạy dưới user đó, hoặc nsenter vào namespace
nsenter --net=/proc/$(pgrep -u $USER podman)/net ip link show
5. Khi nào nên dùng cái nào
Dùng rootful khi:
- VPS production với stack cố định do bạn kiểm soát
- Cần bind port 80/443 trực tiếp
- Dùng Tailscale, UFW, Nginx trên cùng host — cần iptables hoạt động bình thường
- Cần throughput network cao
- Muốn debug dễ với các tool tiêu chuẩn (
iptables,ss,ip)
Dùng rootless khi:
- Môi trường dev trên máy cá nhân, không muốn root
- CI/CD runner chạy build container không tin tưởng
- Multi-tenant, mỗi user chạy container riêng
- Shared hosting, không có quyền root
Tóm lại cho VPS production:
Rootful là lựa chọn thực tế hơn. Bảo mật của rootless chỉ có giá trị khi bạn chạy untrusted workload. Với stack production do bạn kiểm soát, overhead debug và workaround networking của rootless không đáng đổi lấy lợi ích bảo mật tương đối nhỏ.
6. Checklist khi chọn
Có cần bind port < 1024?
└── Có → Rootful
Có dùng UFW/iptables trên host?
└── Có → Rootful (rootless không thao tác được iptables)
Có chạy untrusted code trong container?
└── Có → Rootless (lợi thế bảo mật thực sự)
Chỉ có một user trên VPS?
└── Có → Rootful đơn giản hơn nhiều
Multi-tenant, nhiều user chạy container riêng?
└── Có → Rootless
7. Bài học
”Rootless = an toàn hơn” là oversimplification
Rootless giảm attack surface trong trường hợp container escape. Nhưng trên VPS production với stack cố định, rủi ro container escape thấp hơn nhiều so với rủi ro misconfiguration do networking phức tạp của rootless. Chọn tool phù hợp với threat model thực tế, không phải theo marketing.
Rootful không có nghĩa là không an toàn
Rootful + UFW đúng cách + không expose port không cần + secrets management tốt = production-grade security cho phần lớn workload thực tế.
Debug rootless cần thêm bước
Khi gặp vấn đề networking trong rootless, luôn nhớ rằng interface, port, và namespace nằm dưới user context, không phải system context. Các tool như ss, ip, iptables chạy bởi root sẽ không thấy chúng.
Môi trường: Debian 13, Podman 5.x, podman compose, UFW, Tailscale.