Разница между --cap-add = NET_ADMIN и возможностями добавления в .yml - PullRequest
0 голосов
/ 14 октября 2019

У меня есть вопрос и проблема с возможностями.

Почему моя программа работает, когда я запускаю docker run --cap-add=NET_ADMIN ...?

И это не работает, если я запускаю свою программу с файлом. yml:

      containers:
      - name: snake
        image: docker.io/kelysa/snake:lastest
        imagePullPolicy: Always
        securityContext:
          privileged: true
          capabilities:
            add: ["NET_ADMIN","NET_RAW"]

В чем разница между запуском docker с параметром --cap-add и запуском модуля с такими же возможностями?

Ответы [ 2 ]

1 голос
/ 14 октября 2019

Как описано David Maze и Согласно докеру docs: привилегии времени выполнения и возможности Linux

По умолчанию контейнеры Docker являются «непривилегированными»и не может, например, запустить демон Docker внутри контейнера Docker. Это связано с тем, что по умолчанию контейнеру не разрешен доступ к каким-либо устройствам, а «привилегированному» контейнеру предоставляется доступ ко всем устройствам (см. Документацию по устройствам cgroups).

--cap-add: Add Linux capabilities,
--cap-drop: Drop Linux capabilities,
--privileged=false: Give extended privileges to this container
--device=[]: Allows you to run devices inside the container without the --privileged flag.

Когда оператор выполняет docker run --privileged, Docker разрешит доступ ко всем устройствам на хосте, а также установит некоторую конфигурацию в AppArmor или SELinux, чтобы позволить контейнеру практически такой же доступ к хосту, как процессам, выполняющимся вне контейнеров на хосте.

В дополнение к --privileged оператор может точно контролировать возможности, используя --cap-add и --cap-drop.

Вы можете найти там два вида возможностей:

  • Докер со списком сохраненных по умолчанию возможностей.
  • возможности, которые не предоставлены по умолчаниюи могут быть добавлены.

Эта команда docker run --cap-add=NET_ADMIN будет применять дополнительные возможности linux.

Согласно документации:

Для взаимодействия с сетевым стекомвместо использования --privileged они должны использовать --cap-add = NET_ADMIN для изменения сетевых интерфейсов.

Примечание :

Чтобы уменьшить атаки системного вызоваХорошей практикой является предоставление контейнеру только необходимых привилегий. Пожалуйста, обратитесь также к Включение политик безопасности Pod .

Из контейнера это может быть достигнуто с помощью:

securityContext:
  capabilities:
    drop: ["all"]
    add: ["NET_BIND"]

Для просмотра примененных возможностей внутри вашего контейнера вы можете использовать:getpcaps process_id or $(pgrep your-proces_name) для просмотра и изучения возможностей Linux, которые вы используете capsh --print

Ресурсы :

Надеюсь, эта помощь.

0 голосов
/ 15 октября 2019

Хорошо, извините, я знаю все это, и вы не правильно ответили на мой вопрос.

Когда я запускаю с помощью Docker, моя программа использует TC NETWORK (RTNETLINK), и она работает.

Но когда я использую с kubernetes, это не работает, и скажите мне RTNETLINK answers: No such file or directory

или modprobe: ERROR: ../libkmod/libkmod.c:586 kmod_search_moddep() could not open moddep file '/lib/modules/4.15.0/modules.dep.bin' modprobe: FATAL: Module sch_netem not found in directory /lib/modules/4.15.0

...