关键词:
ceph、User、Subuser、S3、swift、radosgw-admin
前言:
对象存储用户管理是对象存储的基本功能,必须通过创建用户、access_key 和 secrect_key,才能使终端用户能够与对象网关服务进行交互。本文将介绍用户的创建、修改、查看、禁用/启用、访问控制、密钥管理、设置配额、设置存储策略等操作。以及如何使用 python 的 rgwadmin 库进行操作。
有两种用户类型:
- 用户:术语“用户”反映了 S3 接口的用户。
- 子用户:术语“子用户”反映了 Swift 接口的用户。子用户与用户相关联。
用户管理
创建用户(S3):
radosgw-admin user create --uid={username} --display-name="{display-name}" [--email={email}]
如:
radosgw-admin user create --uid=johndoe --display-name="John Doe" --email=john@example.com
{ "user_id": "johndoe",
"display_name": "John Doe",
"email": "john@example.com",
"suspended": 0,
"max_buckets": 1000,
"subusers": [],
"keys": [
{ "user": "johndoe",
"access_key": "11BS02LGFB6AL6H1ADMW",
"secret_key": "vzCEkuryfn060dfee4fgQPqFrncKEIkh3ZcdOANY"}],
"swift_keys": [],
"caps": [],
"op_mask": "read, write, delete",
"default_placement": "",
"placement_tags": [],
"bucket_quota": { "enabled": false,
"max_size_kb": -1,
"max_objects": -1},
"user_quota": { "enabled": false,
"max_size_kb": -1,
"max_objects": -1},
"temp_url_keys": []
}
创建子用户(swift):
radosgw-admin subuser create --uid={uid} --subuser={uid} --access=[ read | write | readwrite | full ]
这里 full 不等同于 readwrite,因为它还包括访问控制策略。
如:
radosgw-admin subuser create --uid=johndoe --subuser=johndoe:swift --access=full
{ "user_id": "johndoe",
"display_name": "John Doe",
"email": "john@example.com",
"suspended": 0,
"max_buckets": 1000,
"subusers": [
{ "id": "johndoe:swift",
"permissions": "full-control"}],
"keys": [
{ "user": "johndoe",
"access_key": "11BS02LGFB6AL6H1ADMW",
"secret_key": "vzCEkuryfn060dfee4fgQPqFrncKEIkh3ZcdOANY"}],
"swift_keys": [],
"caps": [],
"op_mask": "read, write, delete",
"default_placement": "",
"placement_tags": [],
"bucket_quota": { "enabled": false,
"max_size_kb": -1,
"max_objects": -1},
"user_quota": { "enabled": false,
"max_size_kb": -1,
"max_objects": -1},
"temp_url_keys": []}
查询用户信息:
radosgw-admin user info --uid=johndoe
修改用户信息:
要修改有关用户的信息,必须指定用户 ID ( --uid={username}) 和要修改的属性。典型的修改是邮箱(--email)、显示名(--display-name)、访问级别(--access)。例如:
radosgw-admin user modify --uid=johndoe --display-name="John E. Doe" --email=hello@test.com
如果修改子用户,指定 uid 和 subuser
radosgw-admin subuser modify --uid=johndoe --subuser=johndoe:swift --access=full
用户禁用:
注意禁用用户会禁用子用户。
radosgw-admin user suspend --uid=johndoe
用户启用:
radosgw-admin user enable --uid=johndoe
删除用户:
删除用户时,该用户和子用户将从系统中删除。但是,如果愿意,可以只删除子用户。要删除用户(和子用户),请指定用户 ID。
radosgw-admin user rm --uid=johndoe
要仅删除子用户,请指定子用户 ID。
radosgw-admin subuser rm --subuser=johndoe:swift
可以使用 --purge-data 选项清除与 UID 关联的所有数据,以及 --purge-keys 选项清除与 UID 关联的所有密钥。
添加/删除密钥
用户和子用户都需要密钥才能访问 S3 或 Swift 接口。要使用 S3,用户需要一个由 access-key 和 secret-key 组成的密钥对。另一方面,要使用 Swift,用户通常需要一个 secret-key(密码),并将其与关联的用户 ID 一起使用。可以创建密钥时指定或自动生成。也可以删除密钥。选项包括:
- --key-type=<type> 指定密钥类型。选项有:s3、swift
- --access-key=<key> 手动指定 S3 访问密钥。
- --secret-key=<key> 手动指定 S3 密钥或 Swift 密钥。
- --gen-access-key 自动生成随机 S3 访问密钥。
- --gen-secret 自动生成随机 S3 密钥或随机 Swift 密钥。
如:
radosgw-admin key create --uid=foo --key-type=s3 --access-key fooAccessKey --secret-key fooSecretKey
{ "user_id": "foo",
"rados_uid": 0,
"display_name": "foo",
"email": "foo@example.com",
"suspended": 0,
"keys": [
{ "user": "foo",
"access_key": "fooAccessKey",
"secret_key": "fooSecretKey"}],
}
可以为一个用户创建多个 S3 密钥对。
为子用户附加指定的 swift 密钥:
radosgw-admin key create --subuser=foo:bar --key-type=swift --secret-key barSecret
{ "user_id": "foo",
"rados_uid": 0,
"display_name": "foo",
"email": "foo@example.com",
"suspended": 0,
"subusers": [
{ "id": "foo:bar",
"permissions": "full-control"}],
"swift_keys": [
{ "user": "foo:bar",
"secret_key": "asfghjghghmgm"}]}
请注意,子用户只能拥有一个 swift 密钥。
配额管理
能够为用户和用户拥有的存储桶设置配额。配额包括存储桶中的最大对象数和存储桶可以容纳的最大存储大小。
- 存储桶:该--bucket选项允许为用户拥有的存储桶指定配额。
- 最大对象:该--max-objects设置允许指定最大对象数。负值禁用此设置。
- 最大大小:该--max-size选项允许在 B/K/M/G/T 中指定配额大小,其中 B 是默认值。负值禁用此设置。
- 配额范围:该--quota-scope选项设置配额的范围。选项是bucket和user。存储桶配额适用于用户拥有的存储桶。用户配额适用于用户。
设置用户配额
radosgw-admin quota set --quota-scope=user --uid=<uid> [--max-objects=<num objects>] [--max-size=<max size>]
如
radosgw-admin quota set --quota-scope=user --uid=johndoe --max-objects=1024 --max-size=1024B
启用/禁用用户配额
启用禁用分别为:
radosgw-admin quota enable --quota-scope=user --uid=<uid>
radosgw-admin quota disable --quota-scope=user --uid=<uid>
设置桶配额
radosgw-admin quota set --uid=<uid> --quota-scope=bucket [--max-objects=<num objects>] [--max-size=<max size]
启用/禁用存储桶配额
radosgw-admin quota enable --quota-scope=bucket --uid=<uid>
radosgw-admin quota disable --quota-scope=bucket --uid=<uid>
用户存储策略
假设当前 zone 有非默认存储策略为 placement_1。
以用户foo为例,对用户设置方法如下:
先查询用户 metadata 到文件
radosgw-admin metadata get user:foo > foo_metadata.json
然后编辑 foo_metadata.json 中 default_placement 对应的 value,保存。
...
],
"swift_keys": [],
"caps": [],
"op_mask": "read, write, delete",
"default_placement": "placement_1",
"default_storage_class": "",
"placement_tags": [],
"bucket_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
},
"user_quota": {
...
最后加载这个文件:
radosgw-admin metadata put user:foo < foo_metadata.json
rgwadmin 库(python)
rgwadmin 是一个python 库,对 Ceph Object Storage Admin API 进行了封装。
若其它语言若没有可用的库,可以参考 https://docs.ceph.com/en/latest/radosgw/adminops/直接通过 HTTP 客户端库进行调用。
这里只简单介绍代码示例,可自行安装进行了解。
from rgwadmin import RGWAdmin
rgw = RGWAdmin(access_key='XXX', secret_key='XXX', server='obj.example.com')
rgw.create_user(
uid='liam',
display_name='Liam Monahan',
email='liam@umiacs.umd.edu',
user_caps='usage=read, write; users=read',
max_buckets=1000)
rgw.set_user_quota(
uid='liam',
quota_type='user',
max_size_kb=1024*1024,
enabled=True)
rgw.remove_user(uid='liam', purge_data=True)
from rgwadmin import RGWAdmin, RGWUser
RGWAdmin.connect(access_key='XXX', secret_key='XXX', server='obj.example.com')
u = RGWUser.create(user_id='test', display_name='Test User')
u.user_quota.size = 1024 * 1024 # in bytes
u.user_quota.enabled = True
u.save()
u.delete()
总结
以上是对象存储用户管理的介绍,以及如何使用 python 的 rgwadmin 进行操作。
在实际环境中,可与对象桶的使用(桶权限,桶配额等)密切配合,灵活使用。