客户端用法

要使用 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_typepayload_content_encoding 属性。 这可能导致意外行为,例如在 Python 2 中将 unicode 字符串改回字节字符串,以及删除二进制 secret 的 base64 编码,如 Launchpad Bug #1419166 中所述。 因此,手动设置 payload_content_typepayload_content_encoding 已被弃用。

订单

订单用于请求 Barbican 服务创建 secret 材料。 提交订单将导致代表您创建一个 Secret。 然后,Secret 可以像您自己上传的任何 Secret 一样使用。 订单应使用 Clientorders 属性中的 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 密钥对的公钥和私钥。

容器应使用 Clientcontainers 属性中的 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 消费者应使用 Clientsecrets 属性中的 barbicanclient.secrets.SecretManager 实例以及相应的 register_consumerremove_consumerlist_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 应使用 Clientacls 属性中的 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.SecretACLbarbicanclient.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()