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"]
Надеюсь, что это поможет вам.