Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Безопасные вычисления (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. Кроме того, можно выполнить следующие действия.
Получите имена узлов в кластере AKS, выполнив следующую команду:
kubectl get nodesИспользуйте команду
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Скопируйте имя pod, напечатанное при выполнении
kubectl debugкоманды. Оно выглядит следующим образом:node-debugger-<node-name>-<random-sufix>. Его также можно получить, перечислив поды вdefaultпространстве имен.В другом терминале перенесите файл профиля 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 предоставляет контактную информацию сторонних организаций, чтобы помочь вам найти дополнительную информацию по этой теме. Эти контактные данные могут изменяться без уведомления. Корпорация Майкрософт не гарантирует точность сторонних контактных данных.