無根用戶管理podman

来源:https://www.cnblogs.com/Their-own/archive/2022/08/16/16593372.html
-Advertisement-
Play Games

無根用戶管理podman 在允許沒有root特權的用戶運行Podman之前,管理員必須安裝或構建Podman並完成以下配置 基礎設置 cgroup V2Linux內核功能允許用戶限制普通用戶容器可以使用的資源,如果使用cgroupV2啟用了運行Podman的Linux發行版,則可能需要更改預設的OC ...


無根用戶管理podman

目錄

在允許沒有root特權的用戶運行Podman之前,管理員必須安裝或構建Podman並完成以下配置

基礎設置

cgroup V2Linux內核功能允許用戶限制普通用戶容器可以使用的資源,如果使用cgroupV2啟用了運行Podman的Linux發行版,則可能需要更改預設的OCI運行時。某些較舊的版本runc不適用於cgroupV2,必須切換到備用OCI運行時crun。

[root@localhost ~]# dnf -y install crun 			//centos8自帶,可以直接進行安裝
[root@localhost ~]# vim /usr/share/containers/containers.conf 
runtime = "crun"				//取消註釋
#runtime = "runc"				//註釋掉
//啟動一個容器
[root@localhost ~]# podman run -d --name web nginx
Resolving "nginx" using unqualified-search registries (/etc/containers/registries.conf)
Trying to pull docker.io/library/nginx:latest...
Getting image source signatures
Copying blob b4df32aa5a72 done  
Copying blob 589b7251471a done  
Copying blob a0bcbecc962e done  
Copying blob 186b1aaa4aa6 done  
Copying blob a2abf6c4d29d done  
Copying blob a9edb18cadd1 done  
Copying config 605c77e624 done  
Writing manifest to image destination
Storing signatures
230ef7f477fe7b5348bbef97ac6c28d3a38b2a535f5398b06b735530922d9634
[root@localhost ~]# podman ps
CONTAINER ID  IMAGE                           COMMAND               CREATED         STATUS             PORTS       NAMES
230ef7f477fe  docker.io/library/nginx:latest  nginx -g daemon o...  13 seconds ago  Up 13 seconds ago              web
[root@localhost ~]# podman inspect web | grep -i ociruntime
        "OCIRuntime": "crun",

安裝slirp4netns和fuse-overlayfs

在普通用戶環境中使用Podman時,建議使用fuse-overlayfs而不是VFS文件系統,至少需要版本0.7.6。現在新版本預設就是了

[root@localhost ~]# dnf -y install slirp4netns fuse-overlayfs
[root@localhost ~]# vim /etc/containers/storage.conf 
mount_program = "/usr/bin/fuse-overlayfs"			//取消註釋

subuid和 subgid配置

Podman要求運行它的用戶在/ etc / subuid和/ etc / subgid文件中列出一系列UID,shadow-utils或newuid包提供這些文件

[root@localhost ~]# yum -y install shadow-utils
//可以在/etc/ subuid和/etc/ subgid查看,每個用戶的值必須唯一且沒有任何重疊。
[[root@localhost ~]# useradd zz
[root@localhost ~]# cat /etc/subuid
zz:100000:65536
[root@localhost ~]# cat /etc/subgid
zz:100000:65536
[root@localhost ~]# 

//可以在/etc/subuid和/etc/subgid查看,每個用戶的值必須唯一且沒有任何重疊。
[root@localhost ~]# vim /etc/sysctl.conf 
net.ipve4.ping_group_range=0 200000				//添加此行,大於100000這個就表示tom可以操作podman

這個文件的格式是 USERNAME:UID:RANGE中/etc/passwd或輸出中列出的用戶名getpwent。

  • 為用戶分配的初始 UID。
  • 為用戶分配的 UID 範圍的大小。

該usermod程式可用於為用戶分配 UID 和 GID,而不是直接更新文件。

[root@localhost ~]# useradd xx
[root@localhost ~]# cat /etc/subuid /etc/subgid
zz:100000:65536
xx:165536:65536
zz:100000:65536
xx:165536:65536
[root@localhost ~]# usermod --add-subuids 200000-201000 --add-subgids 200000-201000 xx
[root@localhost ~]# cat /etc/subuid /etc/subgid
zz:100000:65536
xx:165536:65536
zz:100000:65536
xx:165536:65536
[root@localhost ~]# usermod --del-subuids 165536-231072 --del-subgids 165536-231072 xx			//--del 刪除
[root@localhost ~]# cat /etc/subuid /etc/subgid
zz:100000:65536
zz:100000:65536
[root@localhost ~]# usermod --add-subuids 200000-201000 --add-subgids 200000-201000 xx			//--add 添加
[root@localhost ~]# cat /etc/subuid /etc/subgid
zz:100000:65536
xx:200000:1001
zz:100000:65536
xx:200000:1001

用戶配置文件

三個主要的配置文件是container.confstorage.confregistries.conf。用戶可以根據需要修改這些文件。

container.conf(容器配置文件)

//查看用戶配置文件方法
[root@localhost ~]# cat /usr/share/containers/containers.conf 	//常用
//方法
[root@localhost ~]# cat /etc/containers/containers.conf			
[root@localhost ~]# cat ~/.config/containers/containers.conf	//優先順序最高

如果它們以該順序存在。每個文件都可以覆蓋特定欄位的前一個文件。

storage.conf(存儲配文件)

1./etc/containers/storage.conf
2.$HOME/.config/containers/storage.conf

在普通用戶中/etc/containers/storage.conf的一些欄位將被忽略

[root@localhost ~]# vim /etc/containers/storage.conf 
//查找driver
driver = "overlay"			//此處為overlay
//查找mount_program
mount_program = "/usr/bin/fuse-overlayfs"		//取消註釋

[root@localhost ~]# vim /etc/sysctl.conf 		//如果版本為8以下,則需要做,設置無根用戶數量
user.max_user_namepaces=15000				//添加

在普通用戶中這襲人預設欄位

[root@localhost ~]# vim /etc/containers/storage.conf 
runroot = "/run/containers/storage"
graphroot = "/var/lib/containers/storage"

registries.conf(倉庫配置文件)

配置按此順序讀入,這些文件不是預設創建的,可以從/usr/share/containers或複製文件/etc/containers併進行修改。

1./etc/containers/registries.conf
2./etc/containers/registries.d/*
3.HOME/.config/containers/registries.conf

授權文件

此文件裡面寫了docker賬號的密碼,以加密方式顯示

root用戶和普通用戶的docker賬號和密碼授權是相同的

[root@localhost ~]# podman login
Username: xinruizhong
Password: 
Login Succeeded!
[root@localhost ~]# find / -name auth.json
/run/user/0/containers/auth.json
[root@localhost ~]# cat /run/user/0/containers/auth.json 
{
        "auths": {
                "docker.io": {
                        "auth": "eGlucnVpemhvbmc6WnoyMDAyMDYyNS4u"
                }
        }
}
[root@localhost ~]# su - zz
[zz@localhost ~]$ podman login
Username: xinruizhong
Password: 
Login Succeeded!
[zz@localhost ~]$ find / -name auth.json
/tmp/podman-run-1000/containers/auth.json
[zz@localhost ~]$ cat /tmp/podman-run-1000/containers/auth.json 
{
        "auths": {
                "docker.io": {
                        "auth": "eGlucnVpemhvbmc6WnoyMDAyMDYyNS4u"
                }
        }
}
[zz@localhost ~]$ exit
logout
[root@localhost ~]# 

普通用戶是無法看見root用戶的鏡像和容器

//root用戶
[root@localhost ~]# podman images
REPOSITORY               TAG         IMAGE ID      CREATED       SIZE
docker.io/library/nginx  latest      605c77e624dd  7 months ago  146 MB
[root@localhost ~]# podman ps -a
CONTAINER ID  IMAGE                           COMMAND               CREATED      STATUS          PORTS       NAMES
230ef7f477fe  docker.io/library/nginx:latest  nginx -g daemon o...  2 hours ago  Up 2 hours ago              web

//普通用戶
[root@localhost ~]# su - zz
Last login: Tue Aug 16 22:19:02 CST 2022 on pts/2
[zz@localhost ~]$ podman images
REPOSITORY  TAG         IMAGE ID    CREATED     SIZE
[zz@localhost ~]$ podman ps -a
CONTAINER ID  IMAGE       COMMAND     CREATED     STATUS      PORTS       NAMES

root用戶也是無法看見普通用戶的鏡像和容器的

//普通用戶
[zz@localhost ~]$ podman pull httpd		//拉取鏡像
Resolving "httpd" using unqualified-search registries (/etc/containers/registries.conf)
Trying to pull docker.io/library/httpd:latest...
Getting image source signatures
Copying blob aed046121ed8 skipped: already exists  
Copying blob 4340e7be3d7f skipped: already exists  
Copying blob 80e368ef21fc skipped: already exists  
Copying blob 1efc276f4ff9 skipped: already exists  
Copying blob 80cb79a80bbe done  
Copying config f2a976f932 done  
Writing manifest to image destination
Storing signatures
f2a976f932ec6fe48978c1cdde2c8217a497b1f080c80e49049e02757302cf74
[zz@localhost ~]$ podman images
REPOSITORY               TAG         IMAGE ID      CREATED      SIZE
docker.io/library/httpd  latest      f2a976f932ec  2 weeks ago  149 MB
//創建容器
[zz@localhost ~]$ podman run -dit --name b1 -p 8080:80 httpd
b5cdee0cc511a7acc3e0174b3ad77c6117113c7111d0863dcd8e718a78fe6b6d
[zz@localhost ~]$ podman ps -a
CONTAINER ID  IMAGE                           COMMAND           CREATED        STATUS            PORTS                 NAMES
b5cdee0cc511  docker.io/library/httpd:latest  httpd-foreground  7 seconds ago  Up 7 seconds ago  0.0.0.0:8080->80/tcp  b1

//root用戶
[root@localhost ~]# podman images
REPOSITORY               TAG         IMAGE ID      CREATED       SIZE
docker.io/library/nginx  latest      605c77e624dd  7 months ago  146 MB
[root@localhost ~]# podman ps -a
CONTAINER ID  IMAGE                           COMMAND               CREATED      STATUS          PORTS       NAMES
230ef7f477fe  docker.io/library/nginx:latest  nginx -g daemon o...  2 hours ago  Up 2 hours ago              web

  • 容器與root用戶一起運行,則root容器中的用戶實際上就是主機上的用戶。
[zz@localhost ~]$ podman ps
CONTAINER ID  IMAGE                           COMMAND           CREATED        STATUS            PORTS                 NAMES
b5cdee0cc511  docker.io/library/httpd:latest  httpd-foreground  3 minutes ago  Up 3 minutes ago  0.0.0.0:8080->80/tcp  b1
[zz@localhost ~]$ podman exec -it b1 /bin/bash
root@b5cdee0cc511:/usr/local/apache2# id
uid=0(root) gid=0(root) groups=0(root)
  • UID GID是在/etc/subuid和/etc/subgid等中用戶映射中指定的第一個UID GID。
  • 如果普通用戶的身份從主機目錄掛載到容器中,併在該目錄中以根用戶身份創建文件,則會看到它實際上是你的用戶在主機上擁有的。

使用捲

[root@localhost ~]# su - zz
[zz@localhost ~]$ pwd 
/home/zz
[zz@localhost ~]$ mkdir /home/zz/abc

//‘/abc:Z’預設是z指示綁定安裝內容在多個容器直接共用,Z選項指示綁定安裝內容是使用的且未共用
[zz@localhost ~]$ podman run -dit --name zxr -v /home/zz/abc/:/abc:Z -p 8080:80 httpd
5f8c15de22474eecb4d24e729ea907ec26ff109ac69cc09020ed8e017843de97
[zz@localhost ~]$ podman exec -it zxr /bin/bash
root@5f8c15de2247:/usr/local/apache2# cd /abc/
root@5f8c15de2247:/abc# touch 123
root@5f8c15de2247:/abc# ls -l
total 0
drwxr-xr-x. 2 nobody nogroup 6 Aug 16 14:44 aaa

在主機上查看

[zz@localhost ~]$ ll abc/		//在zz用戶中查看
total 0
-rw-r--r--. 1 zz zz 0 Aug 16 22:52 123

//在用戶下寫入文件
[zz@localhost ~]$ echo "hello world" >> abc/111
[zz@localhost ~]$ cat abc/111
hello world

查看容器

root@5f8c15de2247:/abc# ls
111  123
root@5f8c15de2247:/abc# cat 111
hello world

將容器中的目錄和文件的屬主和屬組修改為zz

//只要在運行容器的時候加上一個--userns=keep-id即可。保持一直id
[zz@localhost ~]$ podman rm -f -l		
5f8c15de22474eecb4d24e729ea907ec26ff109ac69cc09020ed8e017843de97
[zz@localhost ~]$ podman ps -a
CONTAINER ID  IMAGE       COMMAND     CREATED     STATUS      PORTS       NAMES
[zz@localhost ~]$ podman run -dit --name zzz --userns=keep-id -v $(pwd)/abc:/abc:Z busybox
Resolved "busybox" as an alias (/etc/containers/registries.conf.d/000-shortnames.conf)
Trying to pull docker.io/library/busybox:latest...
Getting image source signatures
Copying blob 50783e0dfb64 done  
Copying config 7a80323521 done  
Writing manifest to image destination
Storing signatures
42c49ace20d71e2c2356029bef2c770279a6b35b68b69c83e6e443e9b0a0d61a
[zz@localhost ~]$ podman ps 
CONTAINER ID  IMAGE                             COMMAND     CREATED         STATUS             PORTS       NAMES
42c49ace20d7  docker.io/library/busybox:latest  sh          20 seconds ago  Up 20 seconds ago              zzz
[zz@localhost ~]$ podman exec -it zzz /bin/sh
~ $ cd abc/
/abc $ ls -l
total 4
-rw-rw-r--    1 zz       zz              12 Aug 16 14:55 111
-rw-r--r--    1 zz       zz               0 Aug 16 14:52 123

使用普通用戶映射容器埠時會報“ permission denied”的錯誤

[zz@localhost ~]$ podman run -dit --name xxx -p 80:80 httpd
Error: rootlessport cannot expose privileged port 80, you can add 'net.ipv4.ip_unprivileged_port_start=80' to /etc/sysctl.conf (currently 1024), or choose a larger port number (>= 1024): listen tcp 0.0.0.0:80: bind: permission denied

普通用戶可以映射>= 1024的埠

[zz@localhost ~]$ podman rm -f xxx
804118df04eb0e049a187288d5a74429fba36db1e8ca25dcb114ec98627690fa
[zz@localhost ~]$ podman run -dit --name xxx -p 1024:80 httpd
73bb26b44db1487b0a95271fc8a833d63883c80b72b7225e432df6a4bb911b71
[zz@localhost ~]$ ss -anlt
State             Recv-Q            Send-Q                       Local Address:Port                       Peer Address:Port            Process            
LISTEN            0                 128                                0.0.0.0:22                              0.0.0.0:*                                  
LISTEN            0                 128                                   [::]:22                                 [::]:*                                  
LISTEN            0                 128                                      *:1024                                  *:*                                

配置echo ‘net.ipv4.ip_unprivileged_port_start=80’ >> /etc/sysctl.conf後可以映射大於等於80的埠

[root@localhost ~]# vim /etc/sysctl.conf 
net.ipv4.ip_unprivileged_port_start = 80			//在最後添加
[root@localhost ~]# sysctl -p   			//立即生效
net.ipv4.ip_unprivileged_port_start = 80

//為了演示效果把root用戶下的80埠的容器刪除
[root@localhost ~]# podman ps -a
CONTAINER ID  IMAGE                           COMMAND               CREATED      STATUS          PORTS       NAMES
230ef7f477fe  docker.io/library/nginx:latest  nginx -g daemon o...  3 hours ago  Up 3 hours ago              web
[root@localhost ~]# podman rm -f -l
230ef7f477fe7b5348bbef97ac6c28d3a38b2a535f5398b06b735530922d9634

//創建測試
[root@localhost ~]# podman run -dit --name xxx -p 80:80 httpd
498e966c5635f025be5e3236b8692562a65d3b547e15df8109a72f48295f2dc1

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • HttpClient作為java程式員最常用的Http工具,其對Http連接的管理能簡化開發,並且提升連接重用效率;在正常情況下,HttpClient能幫助我們高效管理連接,但在一些併發高,報文體較大的情況下,如果再遇到網路波動,如何保證連接被高效利用,有哪些優化空間。 ...
  • 1.什麼是FBV和CBV FBV是指視圖函數以普通函數的形式;CBV是指視圖函數以類的方式。 2.普通FBV形式 def index(request): return HttpResponse('index') 3.CBV形式 3.1 CBV形式的路由 path(r'^login/',views.M ...
  • 本文技術源自外企,並已在多個世界500強大型項目開發中運用。 本文適合有初/中級.NET知識的同學閱讀。(支持.NET/.NET Framework/.NET Core) RabbitMQ作為一款主流的消息隊列工具早已廣受歡迎。相比於其它的MQ工具,RabbitMQ支持的語言更多、功能更完善。 本文 ...
  • .NET Core的依賴註入容器之所以能夠為應用程式提供服務實例,這都歸功於ServiceDescriptor對象提供的服務註冊信息。另外,在ServiceDescriptor對象中,還為容器準備了3種提供服務實例的方式: 使用Func<IServiceProvider, object>類型的委托對 ...
  • 一:背景 前兩篇我們都聊到了非托管記憶體泄漏,一個是 HeapAlloc ,一個是 VirtualAlloc,除了這兩種泄漏之外還存在其他渠道的記憶體泄漏,比如程式集泄漏,這一篇我們就來聊一聊。 二: 程式集也會泄漏? 在我分析的一百多dump中,程式集方面的泄漏主要有 XmlSerializer 和 ...
  • EAP(Event-based Asynchronous Pattern) 是基於事件的非同步模式,在 .NET Framework 2.0 中引入。EAP 需要一個有 Async 尾碼方法和一個或多個事件。EAP不再推薦用於新開發 ...
  • 在 C#1 的時候就包含了APM,在 APM 模型中,非同步操作通過 IAsyncResult 介面實現,包括兩個方法 BeginOperationName 和 EndOperationName ,分別表示開始和結束非同步操作。 ...
  • .NET 提供了三種非同步編程模型 TAP - task-based asynchronous pattern APM - asynchronous programming model EAP - event-based asynchronous pattern 模型對比 比如有一個同步方法,讀取一定 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...