我有一个通过 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_t
对samba_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