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

Azure DevOps Services

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

Примечание

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

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

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

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

Совет

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

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

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

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

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

  4. Создайте конвейер на основе следующего фрагмента 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 В этом примере ссылается на парольную фразу закрытого ключа (а не парольную фразу репозитория). В этом примере нам нужна только парольная фраза закрытого ключа, так как репозиторий уже инициирован (предварительные требования).