Доверие к содержимому Docker
Azure DevOps Services
Docker Content Trust (DCT) позволяет использовать цифровые подписи для данных, отправляемых и полученных из удаленных реестров Docker. Эти сигнатуры позволяют выполнять проверку целостности и издателя определенных тегов изображений на стороне клиента или среды выполнения.
Примечание
Необходимым условием для подписи образа является реестр Docker с подключенным сервером нотариа (например, Docker Hub или Реестр контейнеров Azure).
Подписывание образов в Azure Pipelines
Предварительные требования на компьютере разработки
- Используйте встроенный генератор Docker Trust или создайте пару ключей делегирования вручную. Если используется встроенный генератор , закрытый ключ делегирования импортируется в локальное хранилище доверия Docker. В противном случае закрытый ключ потребуется импортировать вручную в локальное хранилище доверия Docker. Дополнительные сведения см. в разделе Создание ключей вручную .
- Используя ключ делегирования, созданный на предыдущем шаге, отправьте первый ключ в делегирование и запустите репозиторий.
Совет
Чтобы просмотреть список ключей локального делегирования, выполните следующую команду с помощью интерфейса командной строки Notary: $ notary key list
.
Настройка конвейера для подписывания образов
Получите закрытый ключ делегирования, который находится в локальном хранилище доверия Docker на компьютере разработки, который использовался ранее, и добавьте такой же, как безопасный файл в Pipelines.
Авторизуйте этот безопасный файл для использования во всех конвейерах.
Субъект-служба, связанный с
containerRegistryServiceConnection
, должен иметь роль AcrImageSigner в целевом реестре контейнеров.Создайте конвейер на основе следующего фрагмента YAML:
pool: vmImage: 'Ubuntu 16.04' variables: system.debug: true containerRegistryServiceConnection: serviceConnectionName imageRepository: foobar/content-trust tag: test steps: - task: Docker@2 inputs: command: login containerRegistry: $(containerRegistryServiceConnection) - task: DownloadSecureFile@1 name: privateKey inputs: secureFile: cc8f3c6f998bee63fefaaabc5a2202eab06867b83f491813326481f56a95466f.key - script: | mkdir -p $(DOCKER_CONFIG)/trust/private cp $(privateKey.secureFilePath) $(DOCKER_CONFIG)/trust/private - task: Docker@2 inputs: command: build Dockerfile: '**/Dockerfile' containerRegistry: $(containerRegistryServiceConnection) repository: $(imageRepository) tags: | $(tag) arguments: '--disable-content-trust=false' - task: Docker@2 inputs: command: push containerRegistry: $(containerRegistryServiceConnection) repository: $(imageRepository) tags: | $(tag) arguments: '--disable-content-trust=false' env: DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE: $(DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE)
В предыдущем примере
DOCKER_CONFIG
переменная задается с помощьюlogin
команды в задаче Docker. РекомендуетсяDOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE
настроить в качестве секретной переменной для конвейера. Альтернативный подход к использованию переменной конвейера в YAML предоставляет парольную фразу в виде обычного текста.DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE
В этом примере ссылается на парольную фразу закрытого ключа (а не парольную фразу репозитория). В этом примере нам нужна только парольная фраза закрытого ключа, так как репозиторий уже инициирован (предварительные требования).