0

REST API を使用して CEPH radosgw ユーザーを作成しようとしています。基本的には次のものと同等です:

$ radosgw-admin user create --uid=test --display-name='Test user'

CEPH のドキュメントには、REST を介したユーザー作成の詳細が記載されており、十分に簡単に思えました。認証についてはあまり詳しく説明されていません。

管理 API の承認は、S3 承認メカニズムを複製します

S3認証メカニズムを実行する方法のように思われるHTTPリクエストの署名に関するこのAWSドキュメントを使用しようとしました。

私はpythonを使用してモジュールPOSTを試してみましたが、いつも戻ってきました.requestsurllib403 ForbiddenAuthorization

#!/usr/bin/python3.6

import requests

from urllib.parse import urlencode
from urllib.request import Request, urlopen

import base64
import hmac
from hashlib import sha1
import datetime


access_key = 'ABCDEFGHIJKL'.encode("UTF-8")
secret_key = 'abcdefghijklmnopqrst'.encode("UTF-8")
url = 'http://rgw.local:8080/admin/user'

now = datetime.datetime.now()
now_date = now.strftime("%a, %d %b %Y %H:%M:%S %z") # 'Tue, 27 Mar 2007 19:36:42 +0000'

# String to sign:
string_to_sign = 'POST\n\napplication/json\n{}\n\n/admin/user'.format(now_date).encode("UTF-8")
print("string_to_sign = {}\n".format(string_to_sign))

# Signing
signature = base64.encodestring(
    hmac.new(secret_key, string_to_sign, sha1).digest()
    ).strip()

headers = {'content-type':'application/json'}
headers['Authorization'] = "AWS " + access_key.decode() + ":" + signature.decode()
print("Post headers:")
for k in headers.keys():
    print("'{}': '{}'".format(k, headers[k]))
print("")

user_info = {
        'uid': 'test-usercreate',
        'display-name': 'This is a test user created via the API',
        'key-type': 's3',
        'generate-key': True,
}

r = requests.post(url, data=user_info, headers=headers, verify=False)

print(repr(r), r.reason)
print(r.text)
print(r.headers)

print("Return headers:")
for k in r.headers.keys():
    print("'{}': '{}'".format(k, r.headers[k]))
print("")


"""
# urllib
request = Request(url=url, data=urlencode(user_info).encode(), headers=headers)
r = urlopen(request).read().decode()
print(r)
"""

出力:

string_to_sign = b'POST\n\napplication/json\nMon, 15 Nov 2021 11:36:35 \n\n/admin/user'

Post headers:
'content-type': 'application/json'
'Authorization': 'AWS ABCDEFGHIJKL:base64encodeddigest='

<Response [403]> Forbidden
{"Code":"AccessDenied","RequestId":"tx000000000000000001b7e-006191e3d3-e96d94-default","HostId":"e96d94-default-default"}
{'Content-Length': '121', 'x-amz-request-id': 'tx000000000000000001b7e-006191e3d3-e96d94-default', 'Accept-Ranges': 'bytes', 'Content-Type': 'application/json', 'Date': 'Mon, 15 Nov 2021 04:36:35 GMT'}
Return headers:
'Content-Length': '121'
'x-amz-request-id': 'tx000000000000000001b7e-006191e3d3-e96d94-default'
'Accept-Ranges': 'bytes'
'Content-Type': 'application/json'
'Date': 'Mon, 15 Nov 2021 04:36:35 GMT'

rgwtcpdump側で ing すると、投稿しているこのトランザクションが表示されます。

POST /admin/user HTTP/1.1
Host: rgw.local:8080
User-Agent: python-requests/2.20.0
Accept-Encoding: gzip, deflate
Accept: */*
content-type: application/json
Authorization: AWS ABCDEFGHIJKL:base64encodeddigest=
Content-Length: 102
Connection: close

uid=test-usercreate&display-name=This+is+a+test+user+created+via+the+API&key-type=s3&generate-key=True

署名はAuthorizationヘッダーにありますが、悲しいことに、radosgw にたどり着くことができませんでした。署名を作成しようとしている方法にばかげたエラーがあるのか​​もしれません。

上記の AWS doc は、署名する文字列を次のように説明しています。

HTTP-Verb + "\n" +
    Content-MD5 + "\n" +
    Content-Type + "\n" +
    Date + "\n" +
    CanonicalizedAmzHeaders +
    CanonicalizedResource

Content-MD5andCanonicalizedAmzHeadersを空の文字列 (改行) として残し、残りを埋めます。

例えばを使用せずに、CEPH/RGW REST API を使用して成功した人はいboto3ますか? boto3たとえば、バケットを作成したい場合は問題ありませんが (これにはさまざまな例があります)、任意POSTのトランザクションを使用したり、radosgw ユーザーを作成したりすることはできません。

4

0 に答える 0