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


Доверие к содержимому Docker

Azure DevOps Services

Docker Content Trust (DCT) позволяет использовать цифровые подписи для данных, отправленных и полученных из удаленных реестров Docker. Эти сигнатуры позволяют проверить целостность и издателя определенных тегов изображений на стороне клиента или во время выполнения.

Замечание

Чтобы подписать образ, требуется реестр Docker с подключенным нотарионным сервером (например, Docker Hub или Реестр контейнеров Azure).

Подписывание образов в Azure Pipelines

Предварительные требования на компьютере разработки

  1. Используйте встроенный генератор Docker trust или вручную создайте пару ключей делегирования. Если используется встроенный генератор , закрытый ключ делегирования импортируется в локальное хранилище доверия Docker. В противном случае необходимо вручную импортировать закрытый ключ в локальное хранилище доверия Docker. Дополнительные сведения см. в разделе "Создание ключей вручную ".
  2. Используйте ключ делегирования, созданный на предыдущем шаге, чтобы загрузить первый ключ в делегирование и инициализировать репозиторий.

Подсказка

Чтобы просмотреть список ключей локального делегирования, используйте нотарийный интерфейс командной строки для выполнения следующей команды: $ notary key list

Настройка конвейера для подписывания образов

  1. Получите закрытый ключ делегирования из локального хранилища доверия Docker на компьютере разработки и добавьте его в качестве безопасного файла в Pipelines.

  2. Авторизовать данный безопасный файл для использования во всех конвейерах.

  3. Учетная запись службы, связанная с containerRegistryServiceConnection, должна иметь роль AcrImageSigner в целевом реестре контейнеров.

  4. Создайте конвейер на основе следующего фрагмента КОДА YAML:

    pool:
      vmImage: 'ubuntu-latest'
    
    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)
    
     - task: Docker@2
       inputs:
         command: push
         containerRegistry: $(containerRegistryServiceConnection)
         repository: $(imageRepository)
         tags: |
           $(tag)
       env:
         DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE: $(DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE)
         DOCKER_CONTENT_TRUST_ROOT_PASSPHRASE: $(rootPassphrase)
    

    В предыдущем примере DOCKER_CONFIG переменная устанавливается командой login в задаче Docker. Настройте DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE и DOCKER_CONTENT_TRUST_ROOT_PASSPHRASE как секретные переменные для вашего конвейера.

    DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE В этом примере ссылается на парольную фразу закрытого ключа (а не парольную фразу репозитория). В этом примере требуется только парольная фраза закрытого ключа, так как репозиторий уже был инициирован (предварительные требования).