Профиль 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.