DaemonSet для kubernetes прекрасно работает в привилегированном режиме, но не работает, даже если все возможности Linux добавлены - PullRequest
0 голосов
/ 03 февраля 2019

У меня есть 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 Ответ

0 голосов
/ 04 февраля 2019

Я не уверен на 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-the-not-not-hard-way-with-ansible-ingress-with-traefik со следующими пояснениями:

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

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

Или еще 1 из официальной статьи Kubernetes security-context *1018*, но на этот разКонфигурация для 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"]

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

...