DaemonSet для kubernetes отлично работает в привилегированном режиме, но не работает, даже если все возможности Linux добавлены

У меня есть Daemonset, работающий в привилегированном режиме в кластере kubernetes. Это спецификация YAML набора демонов.

apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: my-daemon
spec:
  template:
    metadata:
      labels:
        app: my-daemon
    spec:
      hostNetwork: true
      serviceAccountName: my-sa-account
      containers:
      - name: my-daemon
        image: akhilerm/my-daemon:0.5
        imagePullPolicy: Always
        securityContext:
          privileged: true
...
...

Вместо того, чтобы использовать privileged:trueЯ перехожу к возможностям Linux, чтобы дать разрешения DaemonSet. Поэтому я добавил все возможности linux в контейнер и удалил privileged:true, Это новая спецификация YAML

apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: my-daemon
spec:
  template:
    metadata:
      labels:
        app: my-daemon
    spec:
      hostNetwork: true
      serviceAccountName: my-sa-account
      containers:
      - name: my-daemon
        image: akhilerm/my-daemon:0.5
        imagePullPolicy: Always
        securityContext:
          capabilities:
            add: ["NET_BROADCAST", "NET_ADMIN", ..all CAPs..,"SYS_ADMIN"]
...
...

Но при использовании возможностей linux демон работает не так, как ожидалось. В обоих случаях растровое изображение разрешения в /proc/1/status внутри контейнера то же самое.

...
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000010000
SigIgn: 0000000000000004
SigCgt: 0000000000014002
CapInh: 0000003fffffffff
CapPrm: 0000003fffffffff
CapEff: 0000003fffffffff
CapBnd: 0000003fffffffff
CapAmb: 0000000000000000
...

Есть ли еще поля или разрешения, которые мне нужно установить при использовании возможностей linux с модулем в kubernetes?

1 ответ

Я не уверен на 100%, но эта проблема может отсутствовать capabilities: поле.

apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: my-daemon
spec:
  template:
    metadata:
      labels:
        app: my-daemon
    spec:
      hostNetwork: true
      serviceAccountName: my-sa-account
      containers:
      - name: my-daemon
        image: akhilerm/my-daemon:0.5
        imagePullPolicy: Always
        securityContext:
          capabilities:
            add: ["NET_BROADCAST", "NET_ADMIN", ..all CAPs..,"SYS_ADMIN"]
...
...

или же

apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: my-daemon
spec:
  template:
    metadata:
      labels:
        app: my-daemon
    spec:
      hostNetwork: true
      serviceAccountName: my-sa-account
      containers:
      - name: my-daemon
        image: akhilerm/my-daemon:0.5
        imagePullPolicy: Always
        securityContext:
          capabilities:
            add:
            - NET_BROADCAST
            - NET_ADMIN
            - ...
            - SYS_ADMIN
...
...

Проверьте это и дайте мне знать, если есть успех. Если нет - я постараюсь покопаться глубже и предоставлю вам другое решение. Я нашел именно этот формат во всех примерах, поэтому надеюсь, что он поможет. В качестве реального примера, я могу предоставить вам статью kubernetes "не так уж сложно" с anible-ingress-with-traefik со следующими объяснениями:

securityContext:
  capabilities:
    drop:
    - ALL
    add:
    - NET_BIND_SERVICE

Без этого параметра мы не сможем привязать Traefik к портам 80 и 443 (что в основном верно для всех служб, которые хотят использовать порты< 1024). Мы также можем использовать привилегированное: true, но это увеличивает поверхность атаки. Таким образом, использование возможностей Linux дает нам детальный контроль над разрешениями суперпользователя и сводит разрешения к минимуму.

Или еще 1 из официальной статьи о безопасности в Kubernetes, но на этот раз конфигурация для Pod:

apiVersion: v1
kind: Pod
metadata:
  name: security-context-demo-4
spec:
  containers:
  - name: sec-ctx-4
    image: gcr.io/google-samples/node-hello:1.0
    securityContext:
      capabilities:
        add: ["NET_ADMIN", "SYS_TIME"]

Надеюсь, что это поможет вам.

Другие вопросы по тегам