Podman 介紹可以參考之前鐵人賽 Podman 淺談 - 為何你應該選擇 Podman 而不是 Docker? 系列的文章,講解的還蠻清楚的。安全相關議題的話重點在於 Podman 天生就支援透過 user remapping 的容器啟動方式,那接下來就來進行 podman 安裝以及相關特性的測試。
安裝方式參考官網 Podman Installation Instructions、CentOS 7 - podman/docs/tutorials/rootless_tutorial.md。
podman 在 ubuntu 上面安裝蠻簡單的,基本上裝完功能都相對正常,指令如下 :
sudo apt-get -y install podman ;
podman 在 centos 上安裝就相對麻煩,針對 centOS 7 步驟如下 :
sudo yum install -y podman ;
# 這邊會報錯,因為沒有設定 max_user_namespaces
podman ps ;
# 這個只能暫時修改作業系統狀態,因為 proc 下面都是虛擬檔案
echo 15000 | sudo tee /proc/sys/user/max_user_namespaces ;
# 想要永久保存的話就必須透過底下方法
echo "user.max_user_namespaces=15000" | sudo tee -a /etc/sysctl.conf ;
# cannot find mappings for user ,因為當初建立帳號沒設定 uid、gid 的 mapping
podman ps ;
# 跟之前一樣透過指令幫建一個 user account
sudo adduser low_user ;
# 這邊會新增一筆對應資料,例如 : low_user:100000:65536
cat /etc/subuid ;
cat /etc/subgid ;
# 切換使用者身分
sudo su low_user;
# 切換到該使用者的家目錄底下
cd ~ ;
# 執行成功
podman ps ;
podman 測試方式如下 :
# 使用 Ubuntu 環境進行測試
# 如果要抓 dockerhub 的名稱前面要加上 docker.io/ 開頭
# 這個指令會失敗,因為 podman 背後是用低權限帳號再跑
podman run --rm -p 80:80 docker.io/nginx ;
#測試特權容器
podman run --rm -it --privileged docker.io/nginx bash ;
#即便是特權容器也無法列出 fdisk 資訊
apt update && apt install -y fdisk wget && fdisk -l ;
# 用 amicontained 看一下環境資訊
wget https://github.com/genuinetools/amicontained/releases/download/v0.4.9/amicontained-linux-amd64 && chmod +x amicontained-linux-amd64 ;
# 會發現容器內部有使用 user remapping 機制
./amicontained-linux-amd64 ;
# 可以透過這個檔案看目前的 uid_map 對應
cat /proc/self/uid_map ;
因為 podman 容器內已經採用 user remapping 機制,所以防禦機制表的部分就沿用之前的。
攻擊手法 | podman 能否阻擋? |
---|---|
privileged + host pid | Y |
--cap-add=ALL + host pid | Y |
privileged | Y |
(CVE-2022-0492) unshare + cgroup 特權逃逸手法 | Y |
安裝 linux_module | Y |
docker.sock 掛載 | Y |
預設防護項目 | docker | podman |
---|---|---|
user remapping | Y | |
privileged | Y | |
docker.sock | Y | |
安全模組(seccomp、apparmor) | Y | Y |
剩下的大概就是 podman 的使用時機,可以參考选择 podman 的理由, 以及它和 Kubernetes , Docker 的区别 內提到的使用情境。不過比較需要注意的是文章中提到的這句話,"k8s 之前支持使用 docker-shim 和 docker 集成, 不过新版本也放弃这一层, 直接通过 CRI 调用 contained , podman 也不支持 CRI. 并且也没有什么计划."。這部分我沒有很確定,但看起來 K8s 是不支援操作 podman 去建立底層的容器,這個也是比較需要注意的地方。至於甚麼是 CRI、OCI 可以參考其他參考資料 Docker,containerd,CRI,CRI-O,OCI,runc 分不清?看这一篇就够了、What's up with CRI-O, Kata Containers and Podman?,我這邊就沒甚麼興趣惹。
今日總結 :