[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-bezopasnost-konteynerov-chto-takoe-podpis-i-verifikatsiya-obrazov":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":21,"progress":22,"seo":23},312,"chto-takoe-podpis-i-verifikatsiya-obrazov",9,"bezopasnost-konteynerov","Безопасность контейнеров","🛡️","Что такое подпись и верификация образов?","Подпись образов -- это криптографический механизм, гарантирующий, что контейнерный образ создан доверенным источником и не был изменён (не был подменён или скомпрометирован) с момента сборки.\n\nАналогия: подпись образа -- как сургучная печать на письме. Она подтверждает отправителя и гарантирует, что содержимое не вскрывали в пути.\n\n### Docker Content Trust (DCT)\n\nDCT использует Notary для подписи тегов образов:\n\n```bash\n# Включить обязательную верификацию подписей\nexport DOCKER_CONTENT_TRUST=1\n\n# При push Docker автоматически подпишет образ\ndocker push registry.bank.local\u002Fbanking-service:1.0.0\n\n# При pull Docker откажется скачивать неподписанный образ\ndocker pull registry.bank.local\u002Fbanking-service:1.0.0\n```\n\nПри первом использовании DCT генерируются два ключа: **root key** (хранить в офлайн-хранилище, например HSM) и **repository key** (используется для подписи конкретного репозитория).\n\n### Cosign (Sigstore) -- современный стандарт\n\nCosign -- более современный инструмент, активно вытесняющий DCT благодаря простоте и поддержке keyless-подписи через OIDC.\n\n```bash\n# Генерация ключевой пары\ncosign generate-key-pair\n\n# Подпись образа (всегда по digest, не по тегу!)\ncosign sign --key cosign.key registry.bank.local\u002Fbanking-service@sha256:abc123...\n\n# Верификация подписи\ncosign verify --key cosign.pub registry.bank.local\u002Fbanking-service@sha256:abc123...\n\n# Keyless-подпись через OIDC\u002FFulcio (без локальных ключей)\ncosign sign registry.bank.local\u002Fbanking-service@sha256:abc123...\n```\n\n### Верификация в Kubernetes с помощью Kyverno\n\nKyverno -- policy engine, который может блокировать запуск подов с неподписанными образами:\n\n\u003Cdetails>\n\u003Csummary>Пример ClusterPolicy для верификации подписей\u003C\u002Fsummary>\n\n```yaml\napiVersion: kyverno.io\u002Fv1\nkind: ClusterPolicy\nmetadata:\n  name: verify-image-signature\nspec:\n  validationFailureAction: Enforce\n  background: false\n  rules:\n  - name: check-cosign-signature\n    match:\n      any:\n      - resources:\n          kinds:\n          - Pod\n    verifyImages:\n    - imageReferences:\n      - \"registry.bank.local\u002F*\"\n      attestors:\n      - count: 1\n        entries:\n        - keys:\n            publicKeys: |-\n              -----BEGIN PUBLIC KEY-----\n              MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE...\n              -----END PUBLIC KEY-----\n```\n\n\u003C\u002Fdetails>\n\nЭта политика запретит запуск любого пода с образом из `registry.bank.local`, если образ не подписан соответствующим ключом. Альтернативный admission controller -- **Connaisseur**.\n\n### Интеграция подписи в CI\u002FCD\n\n\u003Cdetails>\n\u003Csummary>Пример GitHub Actions с Cosign\u003C\u002Fsummary>\n\n```yaml\n- name: Sign image with Cosign\n  run: |\n    cosign sign \\\n      --key env:\u002F\u002FCOSIGN_PRIVATE_KEY \\\n      --yes \\\n      registry.bank.local\u002Fbanking-service@${{ steps.build.outputs.digest }}\n  env:\n    COSIGN_PRIVATE_KEY: ${{ secrets.COSIGN_KEY }}\n    COSIGN_PASSWORD: ${{ secrets.COSIGN_PASSWORD }}\n```\n\n\u003C\u002Fdetails>\n\n### Подпись по digest vs по тегу\n\n| Способ ссылки | Пример | Безопасность |\n|---------------|--------|-------------|\n| По тегу | `registry\u002Fapp:1.0.0` | Тег можно переназначить на другой образ |\n| По digest | `registry\u002Fapp@sha256:abc123...` | Неизменная ссылка на конкретный контент |\n\nВсегда подписывать по **digest** (`@sha256:...`), а не по тегу.\n\n### Вывод\n\nПодпись образов -- обязательная практика для production-окружений. Cosign (Sigstore) стал де-факто стандартом. В связке с Kyverno или Connaisseur в Kubernetes можно гарантировать, что ни один неподписанный образ не попадёт в кластер.\n\n> **На собеседовании:** объясните разницу между DCT и Cosign, упомяните keyless-подпись через OIDC. Обязательно скажите, что подписывать нужно по digest, а не по тегу -- это частая ошибка, которую интервьюер проверяет.","","middle",[15,16,17,18,19,20],"image-signing","docker-content-trust","sigstore","kyverno","cosign","container-security",[],null,{"title":24,"description":25,"ogTitle":26,"ogDescription":27,"keywords":28,"schemaAnswer":34,"featuredSnippetReady":35},"Подпись и верификация Docker-образов — Cosign, DCT, Kyverno — Gymterview","Подпись образов гарантирует целостность и происхождение. Docker Content Trust, Cosign (Sigstore), верификация в Kubernetes через Kyverno. Интеграция в CI\u002FCD.","Подпись и верификация Docker-образов — Cosign, DCT, Kyverno","Docker Content Trust (Notary), Cosign (Sigstore) для подписи образов. Kyverno и Connaisseur для верификации в Kubernetes. Подпись по digest, не по тегу.",[29,30,31,32,33],"подпись Docker образов","Cosign Sigstore","Docker Content Trust","верификация образов Kubernetes","Kyverno verify image","Подпись образов гарантирует, что образ создан доверенным источником и не был изменён. Инструменты: Docker Content Trust (Notary) — встроенный механизм, Cosign (Sigstore) — современный стандарт с keyless-подписью через OIDC. Верификация в Kubernetes через Kyverno или Connaisseur (admission controller). Важно подписывать по digest (@sha256:...), а не по тегу.",true]