Как убедиться, что скачал именно тот файл, который хотел?

«Как убедиться, что скачал именно тот файл, который хотел?» — вопрос из категории Безопасность, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В DevOps-практике мы используем многоуровневую систему верификации для всех артефактов, особенно для образов контейнеров, бинарных файлов и конфигураций.

Мой стандартный процесс проверки:

  1. Проверка хеш-сумм (целостность)

    # Скачивание файла и его сигнатуры
    wget https://example.com/artifact.tar.gz
    wget https://example.com/artifact.tar.gz.sha256
    
    # Проверка SHA-256 (предпочтительнее MD5/SHA-1)
    sha256sum -c artifact.tar.gz.sha256
    
    # Для Docker образов
    docker pull nginx:1.23
    docker inspect nginx:1.23 --format='{{.RepoDigests}}'
  2. Верификация GPG-подписей (аутентичность)

    # Импорт публичного ключа разработчика
    gpg --keyserver keyserver.ubuntu.com --recv-keys 0xAB123456
    
    # Скачивание и проверка подписи
    wget https://releases.hashicorp.com/terraform/1.5.0/terraform_1.5.0_SHA256SUMS
    wget https://releases.hashicorp.com/terraform/1.5.0/terraform_1.5.0_SHA256SUMS.sig
    
    gpg --verify terraform_1.5.0_SHA256SUMS.sig terraform_1.5.0_SHA256SUMS
  3. Для контейнеров: проверка подписей Cosign

    # Установка Cosign
    curl -sSfL https://github.com/sigstore/cosign/releases/download/v2.0.0/cosign-linux-amd64 
        -o /usr/local/bin/cosign
    
    # Проверка подписи образа
    cosign verify ghcr.io/myorg/myapp:latest 
     --certificate-identity=https://github.com/myorg/myapp/.github/workflows/build.yaml@refs/heads/main 
     --certificate-oidc-issuer=https://token.actions.githubusercontent.com
  4. В CI/CD пайплайнах автоматизируем проверку:

    # GitLab CI пример
    verify-artifact:
     stage: verify
     script:
       - echo "Downloading artifact..."
       - wget $ARTIFACT_URL -O artifact.bin
       - echo "Expected SHA256: $EXPECTED_SHA256"
       - ACTUAL_SHA256=$(sha256sum artifact.bin | cut -d' ' -f1)
       - if [ "$ACTUAL_SHA256" != "$EXPECTED_SHA256" ]; then exit 1; fi
       - echo "Verification passed"

Критические практики:

  • Никогда не доверяйте хешам с той же страницы, что и файл — используйте отдельный канал
  • Проверяйте цепочку сертификатов для GPG-ключей
  • Для production используйте Sigstore с прозрачным журналом (Rekor)
  • Храните ожидаемые хеши в защищенном месте (Vault, AWS Secrets Manager), а не в коде