Загружаем изображение…
Публичные контейнерные образы: доверяй только digest
«Образ из публичного registry — внешний исполняемый артефакт, а не готовый к запуску пакет. Официальный namespace, знакомый тег и чистый CVE-отчёт не подтверждают происхождение и безопасность. Надёжная проверка связывает один digest с издателем, сборкой, платформой, SBOM, слоями и фактическими правами контейнера — а затем непрерывно пересматривает это решение.»
Где скрывается риск
Публикацию могут подменить через похожий namespace, захваченный CI/CD или украденные credentials издателя. Корректная подпись тоже не доказывает безвредность: скомпрометированный доверенный workflow способен подписать вредоносную сборку.
Тег `latest` или `1.2` изменяем и завтра может указывать на другой объект. Digest фиксирует конкретный манифест, но не делает его безопасным. Для multi-platform образа учитывайте digest индекса и манифест каждой разрешённой платформы: проверка `linux/amd64` ничего не говорит о `linux/arm64`.
Зафиксируйте объект и происхождение
Запишите полный `registry/repository`, время разрешения тега, digest индекса, целевую платформу и digest её манифеста. После допуска deployment должен ссылаться именно на проверенный digest: совпадение тега не переносит одобрение на новый объект.
Проверьте подпись Cosign с явно заданными ожидаемыми OIDC issuer и certificate identity. Слишком широкое регулярное выражение для identity обесценивает контроль. Затем отдельно проверьте provenance attestation: subject digest, исходный repository и commit, builder, workflow, ref и параметры сборки.
SBOM показывает заявленный состав, provenance — как и из чего создан артефакт. Ни один из этих документов сам по себе не доказывает отсутствие вредоносного поведения.
Проверьте состав, слои и конфигурацию
Постройте независимую SBOM для каждой разрешённой платформы, например с помощью Syft в CycloneDX JSON или SPDX JSON. Сравните её с SBOM издателя по пакетам, версиям, purl и лицензиям. Расхождения должны быть объяснены: статически связанные, переименованные и нестандартно установленные компоненты анализаторы нередко пропускают.
Запустите как минимум сканирование уязвимостей и секретов, сохранив версии инструментов, баз и время проверки. Для критичных образов полезен второй сканер. Не принимайте решение только по CVSS: учитывайте наличие исправления, применимость компонента, KEV, EPSS и подписанное VEX-обоснование из доверенного источника.
Отдельно изучите `User`, `Entrypoint`, `Cmd`, `Env`, healthcheck и историю слоёв. Ищите добавленные ключи, токены, загрузчики, package-manager cache, неожиданные setuid-файлы и попытки скрыть артефакты удалением в следующем слое.
Изоляция, допуск и повторная проверка
Если нужен динамический анализ, запускайте штатный startup в одноразовой VM без production-секретов, Docker socket, SSH-agent, внутренних сетей и metadata service. Ограничьте исходящий трафик, CPU, память, процессы и диск; журналируйте DNS, соединения, процессы и изменения файлов. Неожиданные назначения, persistence или privilege escalation должны блокировать допуск.
В runtime применяйте non-root, `allowPrivilegeEscalation: false`, read-only root filesystem, seccomp `RuntimeDefault` и удаление capabilities с точечным возвратом необходимых. Запрещайте privileged mode, host namespaces, неутверждённые `hostPath` и управляющие сокеты.
Повторяйте проверку при изменении digest, появлении новых данных об уязвимостях, отзыве подписи или изменении политики. Храните решение вместе с digest, платформой, результатами сканирования и сроком действия допуска.
Что почитать и попробовать
• Syft
— Строит независимую SBOM образа; задавайте CycloneDX JSON или SPDX JSON явно и проверяйте каждую разрешённую платформу.
• Trivy
— Ищет известные уязвимости и секреты; фиксируйте версии инструмента и баз, время проверки и применённые исключения.
• Cosign
— Проверяет подписи и attestations; закрепляйте ожидаемые OIDC issuer, identity издателя и digest проверяемого образа.
Я в соцсетях
TG · TikTok · Сетка · MAX
Просмотры: 61