REST API を使用して CEPH radosgw ユーザーを作成しようとしています。基本的には次のものと同等です:
$ radosgw-admin user create --uid=test --display-name='Test user'
CEPH のドキュメントには、REST を介したユーザー作成の詳細が記載されており、十分に簡単に思えました。認証についてはあまり詳しく説明されていません。
管理 API の承認は、S3 承認メカニズムを複製します
S3認証メカニズムを実行する方法のように思われるHTTPリクエストの署名に関するこのAWSドキュメントを使用しようとしました。
私はpythonを使用してモジュールPOST
を試してみましたが、いつも戻ってきました.requests
urllib
403 Forbidden
Authorization
#!/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-MD5
andCanonicalizedAmzHeaders
を空の文字列 (改行) として残し、残りを埋めます。
例えばを使用せずに、CEPH/RGW REST API を使用して成功した人はいboto3
ますか?
boto3
たとえば、バケットを作成したい場合は問題ありませんが (これにはさまざまな例があります)、任意POST
のトランザクションを使用したり、radosgw ユーザーを作成したりすることはできません。