У меня есть папка, доступная через 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 (чего я раньше не делал, но хочу попробовать).
Я что-то упустил? Есть ли более простой способ сделать это?
Я бы пошел по пути добавления правила, разрешающего samba писать в svirt_sandbox_file_t. Поскольку вы хотите, чтобы самбе было разрешено загружать контент в контейнер. Is samba нужно только прочитать контент, а затем просто добавить разрешающие правила, чтобы это произошло.
Вы должны иметь возможность установить соответствующее логическое значение SELinux, virt_sandbox_use_samba
.
setsebool -P virt_sandbox_use_samba 1
Если кто-то столкнется с той же проблемой, я выбрал альтернативное решение, т.е. smbd_t
для доступа к материалам с пометкой svirt_sandbox_file_t
. Это копия 1: 1 с samba_share_t
в системе CentOS 7.
# 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