iT邦幫忙

2023 iThome 鐵人賽

0

Yes

  • Podman 介紹可以參考之前鐵人賽 Podman 淺談 - 為何你應該選擇 Podman 而不是 Docker? 系列的文章,講解的還蠻清楚的/images/emoticon/emoticon12.gif。安全相關議題的話重點在於 Podman 天生就支援透過 user remapping 的容器啟動方式/images/emoticon/emoticon34.gif,那接下來就來進行 podman 安裝以及相關特性的測試。

  • 安裝方式參考官網 Podman Installation Instructions、CentOS 7 - podman/docs/tutorials/rootless_tutorial.md

  • podman 在 ubuntu 上面安裝蠻簡單的,基本上裝完功能都相對正常,指令如下 :

    sudo apt-get -y install podman ; 
    
  • podman 在 centos 上安裝就相對麻煩/images/emoticon/emoticon21.gif,針對 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
  • 所以做個簡單的 podman 與 docker 的預設比較表,了解一下兩者在預設情況下安全性上的差異。/images/emoticon/emoticon33.gif
預設防護項目 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 去建立底層的容器,這個也是比較需要注意的地方/images/emoticon/emoticon46.gif。至於甚麼是 CRI、OCI 可以參考其他參考資料 Docker,containerd,CRI,CRI-O,OCI,runc 分不清?看这一篇就够了What's up with CRI-O, Kata Containers and Podman?,我這邊就沒甚麼興趣惹。

  • 今日總結 :

    • 本日回顧 :
      • podman 預設使用 user remapping 的方式來啟動容器,以安全角度來說真的是還蠻不錯的,剩下的是使用時機、維運方面的問題。另外無法套用在 K8s 上面也是個硬傷,所以評估使用時也需要注意一下。
    • 次日預告 :
      • 感覺使用 user remapping 已經蠻安全惹,但是能不能在更安全一點呢?? /images/emoticon/emoticon18.gif 這時候就只能從容器隔離的技術部分著手,必須在容器 <---> 虛擬機之間找到另一個新的平衡點,那個東西就是 Google 的 gVisor。

上一篇
Day 36 - 作業 11-2 解答 - 驗證 user remapping 防禦 docker.sock 掛載攻擊
下一篇
Day 38 - (防禦) Container Sandboxing 技術 - gVisor 介紹
系列文
怕痛的我把 Docker、K8s 攻擊、防禦、偵測力點滿就對了63
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言