SELinux 创建自定义角色

SELinux 创建自定义角色

我有一个通过 Samba 共享的文件夹和一个 Docker 容器,我想通过将其作为卷添加到 Docker 容器来授予对该文件夹的访问权限(是的,我知道这不是可移植的)。

SELinux 阻止容器访问该文件夹,因为该文件夹及其内容被标记为samba_share_t,而不是svirt_sandbox_file_t

我知道 smbd_t 域可以访问许多 SELinux 标签(例如httpd_sys_content_t,尽管sesearch -s smbd_t --allow提供了完整列表),但svirt_sandbox_file_t不是其中之一。

我发现有几种解决这个问题的方法:

  • 通过网络从容器访问 Samba 共享(不可取,因为这需要在容器中安装 Samba,并且有网络开销)

  • 将文件夹及其内容重新标记为svirt_sandbox_file_t(阻止 Samba 访问该文件夹)

  • 将文件夹及其内容重新标记为public_content_rw_t(但这也会允许访问一些我不希望访问该文件夹的其他服务)

  • 创建一个策略来授予svirt_lxc_net_tsamba_share_t标签的访问权限(由 audit2allow 生成,但允许任何容器访问标记为 samba_share_t 的任何文件/文件夹)

我能想到的另一个选择是创建自己的 SELinux 角色,它具有自己的标签,只允许 Samba 和 svirt 访问(我以前没有这样做过,但愿意尝试)。

我是不是漏掉了什么?有没有更简单的方法可以做到这一点?

答案1

我会选择添加规则以允许 samba 写入 svirt_sandbox_file_t。因为您希望允许 samba 将内容上传到容器。如果 samba 只需要读取内容,那么只需添加允许规则即可实现这一点。

答案2

您应该能够设置适当的 SELinux 布尔值virt_sandbox_use_samba

setsebool -P virt_sandbox_use_samba 1

答案3

如果有人遇到同样的问题,我选择了另一种解决方案,即允许smbd_t访问标记为的内容。这是从CentOS 7 系统中svirt_sandbox_file_t进行的 1:1 复制。samba_share_t

# cat >samba_docker_policy.te<<EOF
module samba_docker_policy 1.0;
require {
    type smbd_t;
        type svirt_sandbox_file_t;
        class dir { ioctl read write create getattr setattr lock unlink link rename add_name remove_name reparent search rmdir open };
        class lnk_file { ioctl read write create getattr setattr lock append unlink link rename };
        class file { ioctl read write create getattr setattr lock append unlink link rename open };
        class filesystem { getattr quotaget };
        class fifo_file { ioctl read write create getattr setattr lock append unlink link rename open };
        class sock_file { ioctl read write create getattr setattr lock append unlink link rename open };
}

#============= svirt_sandbox_file_t ==============

allow smbd_t svirt_sandbox_file_t : dir { ioctl read write create getattr setattr lock unlink link rename add_name remove_name reparent search rmdir open } ;
allow smbd_t svirt_sandbox_file_t : lnk_file { ioctl read write create getattr setattr lock append unlink link rename } ;
allow smbd_t svirt_sandbox_file_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ;
allow smbd_t svirt_sandbox_file_t : filesystem { getattr quotaget } ;
allow smbd_t svirt_sandbox_file_t : fifo_file { ioctl read write create getattr setattr lock append unlink link rename open } ;
allow smbd_t svirt_sandbox_file_t : sock_file { ioctl read write create getattr setattr lock append unlink link rename open } ;
EOF
# checkmodule -M -m -o samba_docker_policy.mod samba_docker_policy.te
# semodule_package -o samba_docker_policy.pp -m samba_docker_policy.mod
# semodule -i samba_docker_policy.pp

相关内容