5.16. 在 Podman 中配置预执行钩子

您可以创建插件脚本来定义对容器操作的精细控制,特别是阻止未经授权的操作,如拉取、运行或列出容器镜像。

注意

文件 /etc/containers/podman_preexec_hooks.txt 必须由管理员创建,可为空。如果 /etc/containers/podman_preexec_hooks.txt 不存在,插件脚本将不能执行。

以下规则适用于插件脚本:

  • 必须是 root 所有且不可写。
  • 必须位于 /usr/libexec/podman/pre-exec-hooks/etc/containers/pre-exec-hooks 目录中。
  • 按顺序和字母顺序执行。
  • 如果所有插件脚本都返回零值,则 podman 命令执行了。
  • 如果任何插件脚本返回一个非零值,则表示失败。podman 命令退出,并返回第一个失败的脚本的非零值。
  • 红帽建议使用以下命名约定,按正确的顺序执行脚本:DDD_name.lang,其中:

    • DDD 是表示脚本执行顺序的十进制数。如有必要,前面使用一个或多个零。
    • name 是插件脚本的名称。
    • lang (可选)是给定编程语言的文件扩展名。例如,插件脚本的名称可以是:001-check-groups.sh.
注意

插件脚本在创建时是有效的。在插件脚本之前创建的容器不会受到影响。

先决条件

  • container-tools 元数据包已安装。

流程

  • 创建名为 001-check-groups.sh 的脚本插件。例如:

    #!/bin/bash
    if id -nG "$USER" 2> /dev/null | grep -qw "$GROUP" 2> /dev/null ; then
        exit 0
    else
        exit 1
    fi
    • 该脚本检查用户是否在指定的组中。
    • USERGROUP 是 Podman 设置的环境变量。
    • 001-check-groups.sh 脚本提供的退出码将被提供给 podman 二进制文件。
    • podman 命令退出,并返回第一个失败的脚本的非零值。

验证

  • 检查 001-check-groups.sh 脚本是否正常工作:

    $ podman run image
    ...

    如果用户不在正确的组中,则会出现以下错误:

    external preexec hook /etc/containers/pre-exec-hooks/001-check-groups.sh failed