Профиль Seccomp
На этой странице
Общая информация
Seccomp профиль - это механизм безопасности ядра Linux, который позволяет ограничить доступ к определенным системным вызовам из контейнера. В Kubernetes seccomp профили могут быть использованы для усиления безопасности при запуске подов.
Seccomp профили позволяют разработчикам определить список разрешенных системных вызовов и их параметров, что помогает предотвратить потенциальные уязвимости в системе. Этот механизм позволяет создавать более безопасные среды выполнения для приложений.
Профиль определяет регламент действий:
SCMP_ACT_ERRNO
: блокирует системные вызовы, подобно тому как это делают черный список. Если системный вызов находится в этом списке, то он не будет выполнен и процесс получит ошибку.SCMP_ACT_ALLOW
: разрешает системные вызовы, подобно тому как это делает белый список. Если системный вызов находится в этом списке, то он будет выполнен.SCMP_ACT_LOG
: разрешает системный вызов, но при этом он будет записан в лог файл.
Параметр defaultAction
определяет действие, которое будет принято по умолчанию для системных вызовов, не указанных в профиле seccomp. Вызовы, не попавшие в “белый” или “черный” списки по умолчанию будут залогированы.
Логи блокировок или аудита можно получить на узле, на котором запущен Pod в директориях /var/log/messages
или /var/log/syslog
по ключевому слову SECCOMP.
Подробнее о настройке инструмента на официальном сайте k8s и linux manual page.
Создание seccomp профиля
Создания seccomp профиля в кластере происходит с помощью ресурса NCI. Создать NCI можно с помощью применения манифеста или в разделе Администрирование/Конфигурация узлов. Создайте объект NCI, в селекторе узлов выберите “kubernetes.io/os: linux”, в блоке “Настраиваемые разделы” выберите “Файлы и директории”. Создайте директорию, затем разместите в ней конфигурацию профиля в виде файла.
Подробнее о конфигурации NCI.
Пример NCI, создающей тестовый профиль с белым и черным списками:
apiVersion: node.shturval.tech/v1beta2
kind: NodeConfigItem
metadata:
name: seccomp-profile
spec:
files:
- group: root
mode: "0644"
owner: root
path: /var/lib/kubelet/seccomp/
type: directory
- content: |-
{
"defaultAction": "SCMP_ACT_LOG",
"architectures": [
"SCMP_ARCH_X86_64",
"SCMP_ARCH_X86",
"SCMP_ARCH_X32"
],
"syscalls": [
{
"names": [
"arch_prctl",
"sched_yield",
"futex",
"write",
"mmap",
"exit_group",
"madvise",
"rt_sigprocmask",
"getpid",
"gettid",
"tgkill",
"rt_sigaction",
"read",
"getpgrp"
],
"action": "SCMP_ACT_ALLOW"
},
{
"names": [
"add_key",
"keyctl",
"ptrace"
],
"action": "SCMP_ACT_ERRNO"
}
]
}
group: root
mode: "0644"
owner: root
path: /var/lib/kubelet/seccomp/myprofile.json
type: file
nodeconfigselector:
kubernetes.io/os: linux
priority: 100
Запуск нагрузок с профилем seccomp
При создании нагрузки в созданный профиль нужно указать в блоке securityContext спецификации контейнера. Пример:
apiVersion: v1
kind: Pod
metadata:
labels:
run: nettool
name: nettool
namespace: namespacename
spec:
containers:
- image: r.shturval.tech/network-multitool:alpine-extra
name: nettool
resources: {}
securityContext:
seccompProfile:
type: Localhost
localhostProfile: myprofile.json
dnsPolicy: ClusterFirst
restartPolicy: Always
Обратите внимание! Невозможно применить профиль seccomp к контейнеру, работающему с параметром privileged: true
, установленным в файле securityContext.