Как я исправил ошибку aws SignatureDoesNotMatch при настройке приложения

Все началось здесь.

level=error ts=2021–08–10T15:37:08.952533603Z caller=cortex.go:401 msg=”module failed” module=alertmanager err=”invalid service state: Failed, ожидаемо: Running, failure: SignatureDoesNotMatch : Рассчитанная нами подпись запроса не соответствует предоставленной вами подписи. Проверьте свой ключ и метод подписи.\n\tКод статуса: 403, идентификатор запроса: 1699FC02BBE5816F, идентификатор хоста: “

Я пытался настроить метрики cortex и использовал приведенную ниже конфигурацию для alertmanager.

alertmanager:
  external_url: http://random.com/alertmanager
  enable_api: true
  storage:
    type: s3
    s3:
      endpoint: 172.17.0.1:9000
      bucketnames: cortex/am
      access_key_id: admin
      secret_access_key: admin
      signature_version: v4
      insecure: true

Используемый здесь подход в целом похож на то, как вы отлаживаете любую проблему, и не относится к кортексу как таковому.

Проблема:

Cortex не запускался с ошибкой SignatureDoesNotMatch.
Во время запуска cortex инициализирует alertmanager, который извлекает информацию о корзине из minio для настройки предупреждений, и minio выдает ошибку.

Я использовал minio в качестве магазина s3. Поэтому в дальнейшем я буду использовать термины s3 или minio как синонимы.

Теперь давайте отладим эту проблему, например, как вы пересекаете уровни в игре.

Основные проверки

Услуги запущены, и мы используем правильные значения по умолчанию.

Сам по себе minio был доступен по адресу 172.17.0.1:9000, и я смог создать корзину с помощью клиента minio cli. Политика ведра открыта для тестирования.

Происхождение ошибки

2021-08-11T01:49:10:000 [403 Forbidden] s3.ListObjectsV2 172.17.0.1/cortex/am?delimiter=&list-type=2&prefix=alerts%2F  172.30.0.1        341µs       ↑ 93 B ↓ 643 B

Выше приведен журнал доступа minio при запуске cortex.
Попытался использовать неправильный ключ доступа в конфигурации alertmanager s3 и получил ошибку ниже. Это означает, что запрос достиг minio и выдал ошибку.

Предоставленный вами идентификатор ключа доступа не существует в наших записях

Возможная причина

Поскольку ошибка была связана с ошибкой подписи aws, я просмотрел поля запроса, которые использовались для создания подписи aws.

  • Регион был исключен, так как us-east-1 был по умолчанию в minio, и то же самое было явно указано в конфигурации alertmanager.
  • В minio подпись по умолчанию — v4, и я смог это проверить.

Так что, скорее всего, некоторые поля, такие как путь запроса или параметры хоста или запроса, вызывали проблему, поскольку эти поля используются при создании и проверке подписи?

Запрос на отслеживание

Я проверил, что с помощью aws cli я смог создать и перечислить сегменты в minio. Так что даже aws cli работал нормально.

AWS_PROFILE=s3-store aws --debug --endpoint-url http://172.17.0.1:9000 s3 ls s3://cortex/am

Круто!

Итак, давайте сравним запрос от aws cli и от cortex. Для этого вместо фактической конечной точки minio я запустил прослушиватель nc на случайном порту (8000) и указал конечную точку aws cli и конечную точку alertmanager s3 на этот поддельный minio.

nc -l 8000
  • запрос коры на подделку минио
Logs from cortex to fake minio
GET /cortex%2Fam?delimiter=&list-type=2&prefix=alerts%2F HTTP/1.1
Host: my-system-ip:8000
User-Agent: aws-sdk-go/1.35.31 (go1.16.2; linux; amd64)
Authorization: AWS4-HMAC-SHA256 Credential=admin/20210810/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=3ebb08e65c83270ea50f4ef0ec7ae74d26b196cb1f706ec495c540496f787e79
X-Amz-Content-Sha256: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
X-Amz-Date: 20210810T201626Z
Accept-Encoding: gzip
  • aws cli запрос на подделку minio
Command
AWS_PROFILE=s3-store aws --debug --endpoint-url http://localhost:8000 s3 ls s3://cortex/am
aws cli to fake minio Logs
GET /cortex?list-type=2&prefix=am&delimiter=%2F&encoding-type=url HTTP/1.1
Host: 192.168.43.205:10920
Accept-Encoding: identity
User-Agent: aws-cli/2.0.45 Python/3.7.3 Linux/5.4.0-72-generic exe/x86_64.ubuntu.18 command/s3.ls
X-Amz-Date: 20210810T201104Z
X-Amz-Content-SHA256: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Authorization: AWS4-HMAC-SHA256 Credential=admin/20210810/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=ef09dc9ac293f65a92ed45f87c3758251127d8f7c893982db4ec0906f2cb222d

Итак, если вы видите, кроме пути, оба журнала похожи в большинстве аспектов (поля подписи aws и т. д.)

Основное отличие выглядит как путь.

cortex: /cortex%2Fam
aws cli: /cortex

Двигайтесь в направлении ошибки :-)

Теперь, когда у нас есть некоторая информация из трассировки, я использовал cortex в качестве имени корзины вместо cortex/am в конфигурации alertmanager s3, и это сработало. Хой ……

Поэтому, когда имя корзины s3 имеет / , возникает ошибка SignatureDoesNotMatch .

Повышаем уровень (часть 2)