Podman trên CentOS Stream 9: ‘Khai tử’ Docker để bảo mật hơn với Rootless Container

CentOS tutorial - IT technology blog
CentOS tutorial - IT technology blog

Tại sao Docker không còn là ưu tiên số một trên CentOS Stream 9?

Nếu đang dùng CentOS Stream 9 mà vẫn cài Docker theo thói quen, có thể bạn đang tự làm khó mình. Từ lâu, Red Hat đã loại Docker khỏi repository chính thức. Thay vào đó, họ dồn lực cho Podman – giải pháp thay thế tối ưu và tương thích hoàn toàn với hệ sinh thái RHEL.

Kiến trúc Daemon-based là điểm yếu chí mạng của Docker. Mọi lệnh bạn gõ đều phải “xin phép” một tiến trình chạy quyền root (docker daemon). Nếu daemon này treo, toàn bộ container của bạn sẽ đứng bóng ngay lập tức. Nguy hiểm hơn, việc chạy quyền root tạo cơ hội cho hacker leo thang chiếm quyền điều khiển server vật lý nếu container bị exploit.

Tôi từng gặp một phen hú vía khi Docker Daemon trên cụm server CentOS 8 bị treo. Kết quả là toàn bộ web của khách hàng sập sạch, mất gần 2 tiếng để khôi phục. Sau lần đó, tôi chuyển hẳn sang Podman. Nó giải quyết triệt để vấn đề nhờ kiến trúc Daemonless và khả năng chạy Rootless container. Bạn có thể chạy container bằng user thường mà không cần đụng đến sudo.

Cài đặt Podman trên CentOS Stream 9

Cài Podman trên CentOS cực kỳ nhàn vì nó là “hàng chính chủ”. Bạn không cần add repo bên ngoài hay cấu hình lằng nhằng.

# Cập nhật hệ thống
sudo dnf update -y

# Cài đặt podman
sudo dnf install podman podman-docker -y

Gói podman-docker sẽ tạo một file symlink. Khi bạn gõ lệnh docker, hệ thống thực chất sẽ chạy podman. Tuyệt chiêu này giúp các script cũ của bạn vẫn chạy mượt mà mà không cần sửa code.

Kiểm tra thành quả bằng lệnh:

podman --version

Cấu hình Rootless Container: Lớp giáp bảo mật thực thụ

Đây là tính năng đáng tiền nhất của Podman. Để user thường chạy được container, chúng ta cần cấu hình subuidsubgid. Bạn có thể hiểu đây là việc cấp một dải ID (thường là 65,536 ID) để ánh xạ vào bên trong container.

Bước 1: Kiểm tra dải ID của user

Thông thường, CentOS Stream 9 sẽ tự cấu hình việc này khi tạo user. Hãy kiểm tra bằng lệnh:

grep $USER /etc/subuid /etc/subgid

Nếu màn hình trống trơn, hãy tự thêm thủ công (thay myuser bằng tên user của bạn):

sudo usermod --add-subuids 100000-165535 myuser
sudo usermod --add-subgids 100000-165535 myuser

Bước 2: Giữ container chạy ngầm (Linger)

Với Podman rootless, container có thể bị tắt khi bạn thoát SSH. Để ứng dụng chạy bền bỉ 24/7 như một service, hãy bật tính năng linger:

sudo loginctl enable-linger $USER

Triển khai container đầu tiên: Thử nghiệm thực tế

Hãy thử chạy một container Nginx mà không dùng đến sudo. Bạn sẽ thấy Podman tiêu tốn cực ít tài nguyên (thường chỉ mất vài MB RAM khi idle, so với con số hàng trăm MB của Docker Daemon).

# Tải image từ registry
podman pull nginx:alpine

# Chạy container trên port 8080
podman run -d --name my-web -p 8080:80 nginx:alpine

Lưu ý: Chế độ rootless không cho phép bind các port dưới 1024 (như 80, 443) vì lý do bảo mật hệ thống. Đó là lý do tôi dùng port 8080 ở ví dụ trên.

Quản lý Container bằng Systemd chuyên nghiệp

Podman “bắt tay” cực tốt với Systemd. Thay vì phụ thuộc vào flag --restart always đôi khi hoạt động chập chờn, Podman tự sinh ra các file unit để Systemd quản lý trực tiếp.

Cách biến container my-web thành một service tự khởi động cùng OS:

# Tạo thư mục cấu hình
mkdir -p ~/.config/systemd/user/
cd ~/.config/systemd/user/

# Sinh file service
podman generate systemd --name my-web --files --new

# Kích hoạt service
systemctl --user daemon-reload
systemctl --user enable --now container-my-web.service

Bây giờ, bạn có thể kiểm tra trạng thái cực chuyên nghiệp: systemctl --user status container-my-web.

Hai lỗi “kinh điển” khi mới dùng Podman

Trong quá trình vận hành thực tế, anh em rất dễ vấp phải 2 lỗi sau:

  1. Quyền ghi file (Permission Denied): Khi mount volume vào rootless container, user bên trong thường bị chặn ghi file. Hãy thêm flag :Z vào lệnh mount để Podman tự xử lý SELinux: -v /data:/app:Z.
  2. Hỏi nguồn Image: Khác với Docker mặc định lấy từ Docker Hub, Podman sẽ hỏi bạn chọn quay.io hay docker.io. Bạn có thể cố định nguồn này trong file /etc/containers/registries.conf để đỡ phải chọn tay.

Theo dõi hiệu năng hệ thống

Để xem các container đang “ngốn” bao nhiêu CPU và RAM, hãy dùng lệnh:

podman stats

Nếu thích giao diện web trực quan, hãy cài thêm module cho Cockpit. Chỉ với một lệnh, bạn sẽ có ngay dashboard quản lý container xịn xò:

sudo dnf install cockpit-podman -y

Truy cập https://your-ip:9090, mọi thông số về container sẽ hiện ra rõ mồn một. Việc chuyển sang Podman trên CentOS Stream 9 không chỉ là chạy theo xu hướng. Đây là bước đi sống còn để bảo mật hạ tầng và đơn giản hóa việc quản trị container trong dài hạn.

Share: