客户端用法¶
要使用 barbicanclient,您首先需要创建 barbicanclient.client.Client 类的实例。
客户端使用 Keystone 会话进行身份验证和处理 HTTP 请求。 您可以通过创建具有适当身份验证插件的 Keystone 会话,然后将该会话传递给新的 Client 来提供身份验证凭据。
有关更多详细信息,请参阅 身份验证。
示例
from barbicanclient import client barbican = client.Client(...)
客户端对象具有不同的属性,可用于与 Barbican 服务交互。 每个属性代表 Barbican 服务中的一个实体:Secrets(密钥)、Orders(订单)和 Containers(容器)。
密钥¶
Secrets 代表由 Barbican 服务存储的密钥、凭据和其他敏感数据。 要在 Barbican 服务中存储或检索 secret,您应该使用 barbicanclient.secrets.SecretManager 类的不同方法,该方法作为 Client 的 secrets 属性公开。
示例
# Store a random text password in Barbican from barbicanclient import client import random import string def random_password(length): sys_random = random.SystemRandom() return ''.join( sys_random.choice(string.ascii_letters + string.digits) for _ in range(length) ) barbican = client.Client(...) my_secret = barbican.secrets.create() my_secret.name = 'Random plain text password' my_secret.payload = random_password(24) my_secret_ref = my_secret.store()
由 barbicanclient.secrets.SecretManager.store() 返回的 secret 引用随后可用于从 barbican 检索 secret 数据。
示例
# Retrieve Secret from secret reference retrieved_secret = barbican.secrets.get(my_secret_ref) my_password = retrieved_secret.payload
Secret 内容类型¶
Barbican 服务定义了一个 Secret 内容类型。 客户端将根据设置在 Secret.payload 属性上的数据的类型选择正确的内容类型。 下表总结了 Python 类型到 Barbican Secret 内容类型的映射
Python 3 类型 |
Barbican 内容类型 |
|---|---|
bytes |
application/octet-stream |
str |
text/plain |
警告
python-barbicanclient 的早期版本允许用户设置任何 secret 的 payload_content_type 和 payload_content_encoding 属性。 这可能导致意外行为,例如在 Python 2 中将 unicode 字符串改回字节字符串,以及删除二进制 secret 的 base64 编码,如 Launchpad Bug #1419166 中所述。 因此,手动设置 payload_content_type 和 payload_content_encoding 已被弃用。
订单¶
订单用于请求 Barbican 服务创建 secret 材料。 提交订单将导致代表您创建一个 Secret。 然后,Secret 可以像您自己上传的任何 Secret 一样使用。 订单应使用 Client 的 orders 属性中的 barbicanclient.orders.OrderManager 实例中的工厂方法创建。
示例
# Submit an order to generate a random encryption key from barbicanclient import client barbican = client.Client(...) my_order = barbican.orders.create_key() my_order.algorithm = 'AES' my_order.mode = 'CBC' my_order.bit_length = 256 my_order_ref = my_order.submit()
由 barbicanclient.orders.Order.submit() 返回的订单引用随后可用于从 Barbican 检索订单。
示例
# Retrieve Order from order reference retrieved_order = barbican.orders.get(my_order_ref)
一旦 Barbican 处理了您的订单,订单状态将被设置为 ‘ACTIVE’。 一个活动的订单将包含所请求 secret(或容器)的引用。
示例
# Retrieve Encryption Key generated by the above KeyOrder generated_secret = barbican.secrets.get(retrieved_order.secret_ref) key = generated_secret.payload
目前,客户端可以提交 barbicanclient.orders.KeyOrder 订单,用于适合对称加密的密钥,以及 barbicanclient.orders.AsymmetricOrder 用于非对称密钥,例如 RSA 密钥。
容器¶
容器可以是 Secrets 的任意分组,也可以是密钥的严格分组,例如 RSA 密钥对的公钥和私钥。
容器应使用 Client 的 containers 属性中的 barbicanclient.containers.ContainerManager 实例进行管理
示例
# Add the Secrets created above to a container my_container = barbican.containers.create() my_container.add('Retrieved Secret', retrieved_secret) my_container.add('Generated Secret', generated_secret) my_container_ref = my_container.store()
由 barbicanclient.containers.Container.store() 返回的容器引用随后可用于从 Barbican 检索容器。
示例
# Retrieve container from Barbican retrieved_container = barbican.containers.get(my_container_ref)
Secret 消费者¶
Secret 消费者由三个属性表示:service(服务)、resource type(资源类型)和 resource id(资源 ID)。 调用者可以注册 secret 消费者以指示他们正在使用 secret。 例如,在下面的示例中,调用者创建了一个 secret 消费者,以指示创建的 secret 正在用于加密特定的 Glance 镜像。
Secret 消费者应使用 Client 的 secrets 属性中的 barbicanclient.secrets.SecretManager 实例以及相应的 register_consumer、remove_consumer 和 list_consumers 方法进行管理。
示例
# Creating a secret and adding a consumer to it secret = barbican.secrets.create(name='image encryption key', payload='encryption_key') secret.store() barbican.secrets.register_consumer( secret.secret_ref, service="image", resource_type="image", resource_id="123e4567-e89b-12d3-a456-426614174002" ) # Listing all the secret's consumers consumers = barbican.secrets.list_consumers(secret.secret_ref) for consumer in consumers: print(f"Service: {consumer['service']}\t" f"Resource Type: {consumer['resource_type']}\t" f"Resource id: {consumer['resource_id']}") # Removing the previously created consumer barbican.secrets.remove_consumer( secret.secret_ref, service="image", resource_type="image", resource_id="123e4567-e89b-12d3-a456-426614174002" )
访问控制列表¶
Barbican 中的访问控制列表 (ACL) 功能为 secret 和容器提供用户级别的访问控制。 默认情况下,Barbican 管理其资源(secret、容器)的访问权限,授权基于用户在该项目中的角色授予。
ACL 应使用 Client 的 acls 属性中的 barbicanclient.acls.ACLManager 实例进行管理。
示例
# Submits ACLs on an existing Secret with URI as 'secret_ref' # create ACL entity object with needed settings acl_entity = barbican.acls.create(entity_ref=secret_ref, users=[u1, u2], project_access=False) acl_ref = acl_entity.submit() # submits ACL setting to server at this point.
secret 或 container URI 可用于读取其所有 ACL 设置。 返回值是 barbicanclient.acls.SecretACL 或 barbicanclient.acls.ContainerACL 的实例。 请参阅各自的类以获取其可用 API。
示例
# Get ACL entity for a Secret # Returned entity will be either SecretACL or ContainerACL. # This entity has ACL settings per operation type (e.g. 'read') secret_acl = barbican.acls.get(secret_ref) # To retrieve (load) ACL using existing ACL entity e.g. container_acl container_acl.load_acls_data()
ACL 设置也可以直接从 secret 或 container 实体检索。 它的数据是延迟加载的,即相关的 ACL 设置不会在 secret 或 container 实体上访问 acls 属性之前读取。
示例
# Get secret entity for a given ref secret = barbican.secrets.get(secret_ref) # To get project access flag or users for 'read' operation project_access_flag = secret.acls.read.project_access read_acl_users = secret.acls.read.users # Get container entity for a given ref container = barbican.containers.get(container_ref) # To get project access flag or users for 'read' operation project_access_flag = container.acls.read.project_access read_acl_users = container.acls.read.users
如果需要将用户添加到 secret 或 container 上的现有“read”ACL 设置,可以使用上述 get 和 submit 方法。
示例
# Every Barbican secret and container has default ACL setting which # reflects default project access behavior. # ACL settings is modified via submit operation on ACL entity. # provide users to be added as list. add_users = ['user1', 'user2', 'users3'] # Case 1 - Add users to 'read' operation ACL setting # -------------------------------------------------- # Get ACL entity from server acl_entity = barbican.acls.get(entity_ref=secret_ref) # add new users to existing users for 'read' operation acl_entity.read.users.extend(add_users) # OR # acl_entity.get('read').users.extend(add_users) acl_ref = acl_entity.submit() # here submits ACL changes to server. # Case 2 - Add same users to ACL settings for each operation type # --------------------------------------------------------------- # Get ACL entity from server acl_entity = barbican.acls.get(entity_ref=secret_ref) # Go through each operation ACL setting and add users to existing list for op_acl in acl_entity.operation_acls op_acl.users.extend(add_users) acl_ref = acl_entity.submit() # here submits ACL changes to server.
如果需要从 secret 或 container 上的现有 ACL 设置中删除一些用户,可以使用与上述 add 示例中类似的方法。
示例
# provide users to be removed as list. remove_users = ['user1', 'user2', 'users3'] # Case 1 - Remove users from 'read' operation ACL setting # ------------------------------------------------------- # Get ACL entity from server acl_entity = barbican.acls.get(entity_ref=container_ref) existing_users = acl_entity.read.users # OR # existing users = acl_entity.get('read').users # remove matching users from existing users list updated_users = set(existing_users).difference(remove_users) # set back updated users to operation specific acl setting acl_entity.read.users = updated_users # OR # acl_entity.get('read').users = updated_users acl_ref = acl_entity.submit() # here submits ACL changes to server. # Case 2 - Remove same users from ACL settings for each operation type # -------------------------------------------------------------------- # Get ACL from server acl_entity = barbican.acls.get(secret_ref) # Go through each operation ACL setting and remove users from existing list for op_acl in acl_entity.operation_acls existing_users = op_acl.users # remove matching users from existing users list updated_users = set(existing_users).difference(remove_users) # set back updated users to operation specific acl setting op_acl.users = updated_users acl_ref = acl_entity.submit() # here submits ACL changes to server.
如果需要取消设置或删除 secret 或 container 上的 ACL 设置,可以使用 barbicanclient.acls.SecretACL.remove() 或 barbicanclient.acls.ContainerACL.remove()。
示例
# create ACL entity object with secret or container ref blank_acl_entity = barbican.acls.create(entity_ref=secret_ref) # removes all ACL settings for the secret on server blank_acl_entity.remove() # To remove 'read' operation specific ACL setting acl_entity = barbican.acls.get(entity_ref=secret_ref) acl_entity.read.remove() # OR # acl_entity.get('read').remove()