Поделиться через


Устранение неполадок конфигурации профиля seccomp в службе Azure Kubernetes

Безопасные вычисления (seccomp) — это функция ядра Linux, которая ограничивает контейнеры системных вызовов (syscalls), повышая безопасность контейнерных рабочих нагрузок. В службе Azure Kubernetes (AKS) контейнерная среда выполнения, используемая узлами AKS, изначально поддерживает seccomp. Включение профиля seccomp может привести к сбою нагрузок AKS, так как критически важные системные вызовы блокируются. В этой статье рассматриваются профили seccomp, их работа и устранение неполадок с помощью проекта с открытым исходным кодом Inspektor Gadget.

Предыстория

Syscalls — это интерфейс, позволяющий программам пространства пользователей запрашивать службы ядра. Профили Seccomp указывают системные вызовы, которые разрешены или запрещены для конкретного контейнера. AKS поддерживает два значения:

  • RuntimeDefault: используйте профиль seccomp по умолчанию, заданный средой выполнения.
  • Unconfined: разрешены все системные вызовы.

Чтобы включить seccomp в пулах узлов AKS, см. статью «Безопасный доступ контейнеров к ресурсам с использованием встроенных функций безопасности Linux». Вы также можете настроить пользовательский профиль для удовлетворения конкретных потребностей рабочей нагрузки, см. статью "Настройка пользовательского профиля seccomp ".

При использовании профилей seccomp важно тестировать и проверять их влияние на рабочие нагрузки. Для некоторых рабочих нагрузок может потребоваться меньшее количество ограничений на системные вызовы по сравнению с другими. Это означает, что если для нагрузок требуются syscalls, которые не включены в настроенный профиль, они могут не сработать во время выполнения.

В этой статье показано, как использовать проект с открытым исходным кодом Inspektor Gadget для диагностики проблем и получения видимости заблокированных системных вызовов.

Симптомы

После настройки рабочих нагрузок AKS для использования профиля seccomp они неожиданно прекращают работу с одной из следующих ошибок:

  • Отклонено разрешение

  • функция не реализована

Предпосылки

  • Средство для подключения к кластеру Kubernetes, например к инструменту kubectl . Чтобы установить kubectl с помощью Azure CLI, выполните команду az aks install-cli .
  • Диспетчер пакетов krew для установки плагина Inspektor Gadget. Вы можете следовать краткому руководству по установке krew, чтобы установить его.
  • Профиль seccomp, который вы пытаетесь диагностировать.
  • Проект с открытым исходным кодом Inspektor Gadget.

Контрольный список устранения неполадок

Шаг 1. Изменение профиля seccomp

Создайте настраиваемый профиль seccomp, соответствующий тому, который вы исследуете, и замените его действие по умолчанию, например, SCMP_ACT_ERRNO на SCMP_ACT_LOG, чтобы регистрировать заблокированные системные вызовы вместо их блокировки.

Пользовательский профиль seccomp может выглядеть следующим образом:

{
    "defaultAction": "SCMP_ACT_ALLOW",
    "syscalls": [
      {
        "names": ["acct",
                "add_key",
                "bpf",
                "clock_adjtime",
                "clock_settime",
                "clone",
                "create_module",
                "delete_module",
                "finit_module",
                "get_kernel_syms",
                "get_mempolicy",
                "init_module",
                "ioperm",
                "iopl",
                "kcmp",
                "kexec_file_load",
                "kexec_load",
                "keyctl",
                "lookup_dcookie",
                "mbind",
                "mount",
                "move_pages",
                "nfsservctl",
                "open_by_handle_at",
                "perf_event_open",
                "personality",
                "pivot_root",
                "process_vm_readv",
                "process_vm_writev",
                "ptrace",
                "query_module",
                "quotactl",
                "reboot",
                "request_key",
                "set_mempolicy",
                "setns",
                "settimeofday",
                "stime",
                "swapon",
                "swapoff",
                "sysfs",
                "_sysctl",
                "umount",
                "umount2",
                "unshare",
                "uselib",
                "userfaultfd",
                "ustat",
                "vm86",
                "vm86old"],
        "action": "SCMP_ACT_LOG"
      }
    ]
  }

В статье "Настройка пользовательского профиля seccomp" показано, как применить настраиваемый профиль seccomp к кластеру AKS. Кроме того, можно выполнить следующие действия.

  1. Получите имена узлов в кластере AKS, выполнив следующую команду:

    kubectl get nodes 
    
  2. Используйте команду kubectl debug, чтобы запустить отладочный pod на узле и убедиться, что папка seccomp существует, а инструмент tar установлен (для копирования профиля в узел на следующем шаге).

    kubectl debug node/<node-name> -it --image=mcr.microsoft.com/azurelinux/base/core:3.0
    root [ / ]# mkdir -p /host/var/lib/kubelet/seccomp
    root [ / ]# tdnf install -y tar
    
  3. Скопируйте имя pod, напечатанное при выполнении kubectl debug команды. Оно выглядит следующим образом: node-debugger-<node-name>-<random-sufix>. Его также можно получить, перечислив поды в default пространстве имен.

  4. В другом терминале перенесите файл профиля seccomp непосредственно на узел:

    kubectl cp <the path of the local seccomp profile>/my-profile.json <pod name>:/host/var/lib/kubelet/seccomp/my-profile.json
    

Замечание

Повторите предыдущие шаги для каждого узла в кластере, чтобы убедиться, что профиль seccomp доступен на всех узлах, где может выполняться рабочая нагрузка.

Теперь можно изменить спецификацию целевого пода seccompProfile, которая должна быть ограничена записанными системными вызовами. Рассмотрим пример.

apiVersion: v1
kind: Pod
metadata:
  name: default-pod
  labels:
    app: default-pod
spec:
  securityContext:
    seccompProfile:
      type: Localhost
      localhostProfile: my-profile.json
  containers:
  - name: test-container
    image: docker.io/library/nginx:latest

Шаг 2. Установка гаджета Inspektor

Inspektor Gadget предоставляет аналитические сведения о системных вызовах, влияющих на контейнеры. Чтобы его использовать, выполните следующие команды для установки плагина gadget kubectl на вашей системе и развертывания Inspektor Gadget в кластере:

kubectl krew install gadget
kubectl gadget deploy

Дополнительные сведения см. в разделе "Установка Inspektor Gadget" в кластере AKS.

Шаг 3. Запуск гаджета audit_seccomp

После установки Inspektor Gadget запустите audit_seccomp гаджет с помощью команды запуска гаджета kubectl:

kubectl gadget run audit_seccomp

Шаг 4. Анализировать заблокированные системные вызовы

Запустите рабочую нагрузку при помощи команды kubectl apply -f. Затем audit_seccomp гаджет регистрирует syscalls, которые должен блокировать профиль seccomp, а также связанные подсистемы, контейнеры и процессы. Эти сведения можно использовать для выявления первопричин сбоев рабочей нагрузки.

Например, если запустить указанный выше default-pod pod с my-profile.json профилем, выходные данные будут следующими:

K8S.NODE                           K8S.NAMESPACE K8S.PODNAME  K8S.CONTAINERNAME  COMM                 PID      TID  CODE             SYSCALL
aks-nodepool1-38695788-vmss000002  default       default-pod  test-container     docker-entrypoi  3996610  3996610  SECCOMP_RET_LOG  SYS_CLONE
aks-nodepool1-38695788-vmss000002  default       default-pod  test-container     docker-entrypoi  3996610  3996610  SECCOMP_RET_LOG  SYS_CLONE
aks-nodepool1-38695788-vmss000002  default       default-pod  test-container     docker-entrypoi  3996610  3996610  SECCOMP_RET_LOG  SYS_CLONE
aks-nodepool1-38695788-vmss000002  default       default-pod  test-container     docker-entrypoi  3996610  3996610  SECCOMP_RET_LOG  SYS_CLONE
aks-nodepool1-38695788-vmss000002  default       default-pod  test-container     docker-entrypoi  3996610  3996610  SECCOMP_RET_LOG  SYS_CLONE
aks-nodepool1-38695788-vmss000002  default       default-pod  test-container     10-listen-on-ip  3996628  3996628  SECCOMP_RET_LOG  SYS_CLONE
aks-nodepool1-38695788-vmss000002  default       default-pod  test-container     10-listen-on-ip  3996628  3996628  SECCOMP_RET_LOG  SYS_CLONE
aks-nodepool1-38695788-vmss000002  default       default-pod  test-container     10-listen-on-ip  3996632  3996632  SECCOMP_RET_LOG  SYS_CLONE
aks-nodepool1-38695788-vmss000002  default       default-pod  test-container     10-listen-on-ip  3996632  3996632  SECCOMP_RET_LOG  SYS_CLONE
aks-nodepool1-38695788-vmss000002  default       default-pod  test-container     10-listen-on-ip  3996632  3996632  SECCOMP_RET_LOG  SYS_CLONE
aks-nodepool1-38695788-vmss000002  default       default-pod  test-container     10-listen-on-ip  3996628  3996628  SECCOMP_RET_LOG  SYS_CLONE
aks-nodepool1-38695788-vmss000002  default       default-pod  test-container     10-listen-on-ip  3996628  3996628  SECCOMP_RET_LOG  SYS_CLONE
aks-nodepool1-38695788-vmss000002  default       default-pod  test-container     20-envsubst-on-  3996639  3996639  SECCOMP_RET_LOG  SYS_CLONE
aks-nodepool1-38695788-vmss000002  default       default-pod  test-container     20-envsubst-on-  3996639  3996639  SECCOMP_RET_LOG  SYS_CLONE
aks-nodepool1-38695788-vmss000002  default       default-pod  test-container     20-envsubst-on-  3996641  3996641  SECCOMP_RET_LOG  SYS_CLONE
aks-nodepool1-38695788-vmss000002  default       default-pod  test-container     30-tune-worker-  3996643  3996643  SECCOMP_RET_LOG  SYS_CLONE
aks-nodepool1-38695788-vmss000002  default       default-pod  test-container     nginx            3996610  3996610  SECCOMP_RET_LOG  SYS_CLONE
aks-nodepool1-38695788-vmss000002  default       default-pod  test-container     nginx            3996610  3996610  SECCOMP_RET_LOG  SYS_CLONE

Выходные данные указывают на то, что test-container выполняет вызов системы SYS_CLONE, который должен блокироваться профилем seccomp. Используя эту информацию, вы можете решить, разрешить ли перечисленные системные вызовы в контейнере. В этом случае настройте профиль seccomp, удалив их, что предотвращает сбой рабочей нагрузки.

Вот некоторые часто блокируемые системные вызовы, за которыми стоит следить. Более полный список доступен в значительных системных вызовах, заблокированных профилем по умолчанию.

Заблокированный syscall Рассмотрение
clock_settime или clock_adjtime Если для рабочей нагрузки требуется точную синхронизацию времени, убедитесь, что этот syscall не заблокирован.
add_key или key_ctl Если для вашей рабочей нагрузки требуется управление ключами, системные вызовы, которые заблокированы, не позволяют контейнерам использовать ключевое хранилище ядра, которое служит для хранения данных безопасности, ключей аутентификации, ключей шифрования и других данных в ядре.
clone Этот syscall предотвращает клонирование новых пространств имен, за исключением CLONE_NEWUSER. Рабочие нагрузки, зависящие от создания новых пространств имен, могут быть затронуты, если этот системный вызов заблокирован.
io_uring Этот системный вызов блокируется при переходе на containerd 2.0. Однако он не заблокирован в профиле для containerd версии 1.7.

Дальнейшие шаги

При возникновении проблем с рабочими нагрузками из-за заблокированных системных вызовов, рассмотрите возможность использования настраиваемого профиля seccomp, подходящего для конкретных потребностей вашего приложения. Вы можете ознакомиться с гаджетом Inspektor Gadget advise_seccomp.

Тестирование и уточнение профилей seccomp помогает поддерживать производительность и безопасность рабочих нагрузок AKS. Дополнительные сведения см. в разделе "Безопасные вычисления".

Защита доступа к контейнерам к ресурсам с помощью встроенных функций безопасности Linux

Отказ от ответственности за информацию третьих лиц

Продукты сторонних производителей, о которых говорится в этой статье, изготовлены компаниями, независимыми от Microsoft. Корпорация Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, о надежности или производительности этих продуктов.

Отказ от ответственности за контакт с третьими лицами

Microsoft предоставляет контактную информацию сторонних организаций, чтобы помочь вам найти дополнительную информацию по этой теме. Эти контактные данные могут изменяться без уведомления. Корпорация Майкрософт не гарантирует точность сторонних контактных данных.