为Podman自定义graphroot目录设置SELinux上下文标签
时间:2020-02-23 14:31:49 来源:igfitidea点击:
我想设置自定义目录来存储使用Podman创建的容器数据,如何将目录文件类型(及其内容)更改为Podman使用的上下文类型?在运行SELinux的系统上,所有进程和文件都以表示安全相关信息的方式标记。如果我们尝试使用存储在/var/lib/containers以外的目录中的数据创建一个容器,则会获得权限被拒绝。
我将在CentOS 8服务器上对此进行演示。让SELinux进入Enforcecing模式。
$sudo setenforce 1 $sestatus SELinux status: enabled SELinuxfs mount: /sys/fs/selinux SELinux root directory: /etc/selinux Loaded policy name: targeted Current mode: enforcing Mode from config file: enforcing Policy MLS status: enabled Policy deny_unknown status: allowed Memory protection checking: actual (secure) Max kernel policy version: 31
安装提供podman的Container工具。
sudo dnf module install container-tools
让我们通过运行helloworld容器来确认podman是否按预期工作。
$podman run --rm hello-world Trying to pull docker.io/library/hello-world... Getting image source signatures Copying blob 0e03bdcc26d7 done Copying config bf756fb1ae done Writing manifest to image destination Storing signatures Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https://hub.docker.com/ For more examples and ideas, visit: https://docs.docker.com/get-started/
确认容器的当前根目录设置。
$podman info | grep -i root rootless: false GraphRoot: /var/lib/containers/storage RunRoot: /var/run/containers/storage
让我们创建用于存储数据的自定义目录。
sudo mkdir -p /data/containers
更新设置并将目录更改为上面创建的目录。
$sudo vi /etc/containers/storage.conf # Primary Read/Write location of container storage #graphroot = "/var/lib/containers/storage" graphroot = "/data/containers"
尝试运行一个容器。
# podman run --rm -it ubuntu bash Getting image source signatures Copying blob 0f3630e5ff08 done Copying blob d72e567cc804 done Copying blob b6a83d81d1f4 done Copying config 9140108b62 done Writing manifest to image destination Storing signatures bash: error while loading shared libraries: libc.so.6: cannot change memory protections
从输出中我得到了错误消息:
bash: error while loading shared libraries: libc.so.6: cannot change memory protections
让我们为目录/data/containers设置正确的SELinux标签,然后重试。
sudo semanage fcontext -a -e /var/lib/containers /data/containers sudo restorecon -R -vv /data/containers
如果找不到semanage命令,请使用以下命令进行安装。
sudo yum install policycoreutils-python-utils -y
确认SELinux上下文类型。
$ls -dZ /data/containers/ unconfined_u:object_r:container_var_lib_t:s0 /data/containers/
确认类型是否已设置为container_var_lib_t。
重新运行容器:
# podman run --rm -it ubuntu bash theitroad@localhost:/# cat /etc/os-release NAME="Ubuntu" VERSION="20.04.1 LTS (Focal Fossa)" ID=ubuntu ID_LIKE=debian PRETTY_NAME="Ubuntu 20.04.1 LTS" VERSION_ID="20.04" HOME_URL="https://www.ubuntu.com/" SUPPORT_URL="https://help.ubuntu.com/" BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/" PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" VERSION_CODENAME=focal UBUNTU_CODENAME=focal theitroad@localhost:/# exit exit
容器已成功启动。