Podman是RHEL8中的默认容器管理工具,以下以Fedora系统为平台介绍用于保护Podman容器的内容:确定Podman容器的特权模式及Capabilities。参考在CentOS 7、Fedora 30/29/28上安装Podman的方法。
确定Podman容器的特权模式 容器以特权或非特权模式运行。在特权模式下,容器uid 0映射到主机的uid0。在某些情况下,非特权容器缺乏对主机资源的足够访问权限。包括强制性访问控制(apparmor、SELinux),seccomp过滤器、功能下降和名称空间在内的技术都可以帮助保护容器,无论其操作方式如何。 要从容器外部确定特权模式: $ podman inspect --format="{{.HostConfig.Privileged}}" <container id> 如果以上命令返回true,则容器以特权模式运行。如果返回false,则表明容器以非特权模式运行。 要从容器内部确定特权模式: $ ip link add dummy0 type dummy 如果此命令允许您创建接口,那么您正在运行特权容器。否则,您将运行非特权容器。
Capabilities 命名空间将容器的进程与对主机资源的任意访问以及对在同一主机上运行的其他容器的资源的访问隔离。但是,特权容器中的进程仍然可以执行诸如更改IP路由表、跟踪任意进程以及加载内核模块之类的操作。通过Capabilities,可以对容器中的进程可以访问或更改的资源应用更精细的限制。即使容器以特权模式运行。Capabilities还允许人们将特权分配给原本不会拥有的非特权容器。 例如,要将NET_ADMIN功能添加到非特权容器中,以便可以在容器内部创建网络接口,则可以使用类似于以下参数的参数运行podman: [root@vm1 ~]# podman run -it --cap-add=NET_ADMIN centos [root@b27fea33ccf1 /]# ip link add dummy0 type dummy [root@b27fea33ccf1 /]# ip link 上面的命令演示了在非特权容器中创建的dummy0接口。如果没有NET_ADMIN功能,则没有特权的容器将无法创建接口。上面的命令演示了如何向未特权的容器授予Capabilities。 当前,大约有39种Capabilities可以被授予或拒绝。默认情况下,特权容器被授予许多功能。建议从特权容器中删除不需要的功能,以使其更加安全。 要删除容器中的所有Capabilities: $ podman run -it -d --name mycontainer --cap-drop=all centos 列出容器的Capabilities: $ podman exec -it 48f11d9fa512 capsh --print 上面的命令应显示没有任何Capabilities授予该容器。 有关Capabilities的完整列表,请参见功能手册页: $ man capabilities 使用capsh命令列出您当前拥有的Capabilities: $ capsh --print 作为另一个示例,下面的命令演示了如何从容器中删除NET_RAW功能。如果没有NET_RAW功能,则无法从容器内部ping Internet上的服务器: $ podman run -it --name mycontainer1 --cap-drop=net_raw centos >>> ping google.com (will output error, operation not permitted) 作为最后一个示例,如果您的容器仅需要SETUID和SETGID Capabilities,则可以通过删除所有Capabilities,然后仅重新添加这两个Capabilities来获得这样的权限集: $ podman run -d --cap-drop=all --cap-add=setuid --cap-add=setgid fedora sleep 5 > /dev/null; pscap | grep sleep 上面显示的pscap命令应显示已授予容器的Capabilities。
相关主题 |