что делает опция демона docker --selinux-enabled - PullRequest
0 голосов
/ 27 августа 2018

Полагаю, он будет помечать контейнеры, которые он запустил, но из вывода ps -eZ я не вижу никакой разницы.Например, контейнер etcd имеет один и тот же домен, независимо от того, есть ли у демона эта опция и без нее:

system_u:system_r:container_runtime_t:s0 16212 ? 00:00:00 dnsmasq-nanny

Но это мешает моему контейнеру (k8s-dns-dnsmasq-nanny-amd64:1.14.8) при запуске и в журналах отказа отображается доступ к /etc/localtime, а / usr / sbin / dnsmasq запрещен.Я думаю, что это файлы внутри контейнерной файловой системы.Как я могу написать политику SELinux, чтобы разрешить доступ внутри файловой системы контейнера?

1 Ответ

0 голосов
/ 30 августа 2018

Краткий ответ

  • --selinux-enabled активирует политику selinux, которая позволяет процессам контейнера с меткой svirt_lxc_net_t читать и записывать в файлы с меткой svirt_sandbox_file_t.
  • Метки контейнера можно проверить, проверив контейнер с помощью docker inspect -f '{{ .ProcessLabel }}' <container name> и docker inspect -f '{{ .MountLabel }}' <container name>

Длинный ответ

Опция --selinux-enabled обеспечивает безопасность докера selinuxполитика, которая подробно описана здесь .При включении эта политика будет:

  • Помечать контейнеры метками svirt_sandbox_file_t и svirt_lxc_net_t.Это можно подтвердить, запустив контейнер и проверив метки, примененные к нему:

    docker inspect <container id> | grep "Label"
    
    "MountLabel": "system_u:object_r:svirt_sandbox_file_t:s0:c557,c611",
    "ProcessLabel": "system_u:system_r:svirt_lxc_net_t:s0:c557,c611",
    

    svirt_sandbox_file_t - это MountLabel, который ограничивает доступ к файлам в файловой системе хоста. docker selinux docs говорит:

    Если файл помечен как svirt_sandbox_file_t, то по умолчанию все контейнеры могут его читать.Но если контейнеры записывают в каталог с владельцем svirt_sandbox_file_t, они пишут, используя свою собственную категорию

    Категория в приведенном выше примере: c557,c611.

    . svirt_lxc_net_tиспользуется для защиты процессов.В соответствии с решением Redhat здесь он используется для:

    ... изоляции процессов контейнера от хоста и генерирует уникальную метку безопасности Multi-Category дляSELinux для предотвращения атаки одного контейнерного процесса на другие контейнерные процессы и содержимое.

Скорее всего, проблема с доступом связана с тем, что метки selinux в файловой системе хоста препятствуют доступу изнутриконтейнер.Например, selinux docs говорит:

По умолчанию docker получает доступ ко всему в / usr и большинству вещей в /etc.

Таким образом, вы можете либо:

  1. Вручную пометить файлы в системе хостов с помощью system_u:object_r:svirt_sandbox_file_t.Это часто не рекомендуется для системных файлов и каталогов, поскольку это может привести к непреднамеренным последствиям для хоста.

  2. Запускать контейнер как неограниченный тип.Это отключит изоляцию для этого контейнера, только продолжая применять selinux на хосте:

    docker run -it --security-opt label:disable alpine sh
    
...