Ceph/Rados AWS S3 API 通过 CURL 的存储桶策略

Ceph/Rados AWS S3 API Bucket Policy via CURL

我目前正在努力解决对由 rados/ceph 网关托管的 AWS s3 API 进行休息调用时遇到的问题。

由于我不想深入的原因,我无法使用提供的 SDK 与之对话,这将解决我所有的问题 - 我正在通过 CURL 重新创建一些我需要的更简单的工作 -在大多数情况下,我可以创建存储桶、删除它们、添加 objects、创建角色,但我最新的问题是存储桶策略,它们的 GETPUT。我每次都收到 403,我不知道为什么。

我试图做的是使用另一个带有 SDK 的盒子与 API (boto3) 和 AWS s3API 调用来做同样的事情并且它们工作得很好与用户访问和密钥,所以我不认为它是一个帐户的事情。

使用 SDK 作业的日志,我尝试重新创建正在发送的所有内容,headers、有效负载等...

现在我只能认为作为 403 也许它是 Auth4 策略,但是....这个策略适用于我需要做的所有其他工作。

代码:

#!/bin/bash
set -x
ACCESS_KEY="accesskey"
SECRET_KEY="secret"
SERVICE="s3"
REGION="default"
ENDPOINT="s3-test.example.com"
BUCKET="bucketname"
PATH="?policy"
TIMEDATE="$(date -u '+%Y%m%d')"
TIMEDATEISO="${TIMEDATE}T$(date -u '+%H%M%S')Z"

# Create sha256 hash in hex
function hash_sha256 {
  printf "" | openssl dgst -sha256 | sed 's/^.* //'
}

# Create sha256 hmac in hex
function hmac_sha256 {
  printf "{2}" | openssl dgst -sha256 -mac HMAC -macopt "" | sed 's/^.* //'
}

PAYLOAD="$(printf "" | openssl dgst -sha256 |  sed 's/^.* //')"
CANONICAL_URI="/${BUCKET}${PATH}"
CANONICAL_HEADERS="host:${ENDPOINT}
x-amz-content-sha256:${PAYLOAD}
x-amz-date:${TIMEDATEISO}"

SIGNED_HEADERS="host;x-amz-content-sha256;x-amz-date"
CANONICAL_REQUEST="GET
${CANONICAL_URI}\n
${CANONICAL_HEADERS}\n
${SIGNED_HEADERS}\n
${PAYLOAD}"

# Create signature
function create_signature {
  stringToSign="AWS4-HMAC-SHA256\n${TIMEDATEISO}\n${TIMEDATE}/${REGION}/${SERVICE}/aws_request\n$(hash_sha256 "${CANONICAL_REQUEST}")"
  dateKey=$(hmac_sha256 key:"AWS4${SECRET_KEY}" "${TIMEDATE}")
  regionKey=$(hmac_sha256 hexkey:"${dateKey}" "${REGION}")
  serviceKey=$(hmac_sha256 hexkey:"${regionKey}" "${SERVICE}")
  signingKey=$(hmac_sha256 hexkey:"${serviceKey}" "aws4_request")

  printf "${stringToSign}" | openssl dgst -sha256 -mac HMAC -macopt hexkey:"${signingKey}" |  sed 's/(stdin)= //'
}

SIGNATURE="${create_signature}"
AUTH_HEADER="\
AWS4-HMAC-SHA256 Credential=${ACCESS_KEY}/${TIMEDATE}/\
${REGION}/${SERVICE}/aws4_request, \
SignedHeaders=${SIGNED_HEADERS}, Signature=${SIGNATURE}"

curl -vvv "https://${ENDPOINT}${CANONICAL_URI}" \
    -H "Accept:" \
    -H "Authorization: ${AUTH_HEADER}" \
    -H "x-amz-content-sha256: ${PAYLOAD}" \
    -H "x-amz-date: ${TIMEDATEISO}" \

非常感谢任何帮助或指点 - 必须手动转置它,所以如果有明显的拼写错误......我会修复并重新运行。

正如我所说,很想使用 SDK,但从我将用来执行这些请求的设备来看,这是不可能的

设法解决了我自己的问题。 在 ceph 日志中注意到(不确定我第一次错过它的原因)来自我的客户端的签名与 ceph radosgw 签署相同签名的方式不匹配。

将其返回到 canonicalRequest 上的任务,出于某种原因,如果我去掉所有换行符 (\n),它会计算....但我的所有其他工作,如更新角色、添加存储桶等。 .. 失败,因为他们需要换行符。不知道为什么,有些 Ceph 怪异?

我进行了数据包捕获并剥离了 SSL,以查看来自工作 SDK 和我的 curl 的请求都发送了什么,它们是相同的...

哦,好的,工作:)