前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >玩转企业云计算平台系列(十四):Openstack 密钥管理服务 Barbican

玩转企业云计算平台系列(十四):Openstack 密钥管理服务 Barbican

作者头像
民工哥
发布于 2024-01-18 07:49:02
发布于 2024-01-18 07:49:02
58100
代码可运行
举报
运行总次数:0
代码可运行

Barbican 介绍

OpenStack 密钥管理器(Barbican)是一个用于管理和保护敏感数据的工具。它的主要功能是存储、生成和分发加密密钥、证书和其他敏感信息。在计算机领域中,密钥是用于加密和解密数据的重要组成部分。加密可以帮助保护数据的机密性,确保只有授权的用户能够访问和解读数据。

然而,密钥的管理和保护是一个复杂的任务,因为密钥本身也是敏感的信息,需要保证其机密性和完整性。Barbican 提供了一个集中化的密钥管理和保护解决方案,以帮助组织更好地管理密钥。

它提供了以下功能:

  • 1.密钥存储:Barbican 提供了一个安全的存储库,用于存储和管理密钥、证书和其他敏感数据。这样,用户可以将密钥和其他敏感信息存储在一个安全的地方,而不是分散在多个系统中。
  • 2.密钥生成:Barbican 可以生成随机、安全的密钥,以供用户使用。这些密钥可以用于加密和解密数据,确保数据在传输和存储过程中的安全性。
  • 3.密钥分发:Barbican 可以安全地将密钥分发给需要使用它们的系统和应用程序。它提供了一种安全的方式来共享密钥,以确保只有授权的用户能够访问和使用密钥。
  • 4.密钥轮换:Barbican 还提供了密钥轮换功能,可以定期生成新的密钥,并替换旧的密钥。这样可以增加密钥的安全性,减少密钥被破解的风险。

Barbican 架构图

各组件之间的关系图
Secrets

Secrets是需要存储的密钥,可能的形式如:私钥、证书、密码等。

ACL

除了基于角色的权限控制外,ACL可以提供基于用户访问列表的权限控制。即可以指定哪些用户对该密钥有访问权限。

Containers

Containers是一个容器,用于存储多个secret引用。当不得不跟踪、访问上百个secret时,container非常有用。

barbican支持3种类型的container:

  • Generic
  • Certificate
  • RSA

每种类型的container应该保存什么类型的secret,有明确的限制。

Generic Containers

用于存储任意类型的secret。对于secret的类型和存储数量没有任何限制。

Certificate Containers 用于存储如下类型的secret:

  • certificate (如PEM格式的x509证书)
  • private_key (可选)
  • private_key_passphrase (optional)
  • intermediates (optional) (如PEM格式的PKCS7证书链)
RSA Container

用于存储如下类型的secret:

  • RSA public key
  • RSA private key
  • RSA private key pass phrase

即非对称密钥的公钥、私钥、以及私钥密码。目前只支持RSA算法。用order创建非对称密钥的时候,自动会创建一个该类型的container,并把公钥和私钥放到该container。

Orders

order允许用户请求barbican自己产生secret。并且支持异步生成secret。当希望请求生成多个公私钥对时,非常有用。

order支持如下两种类型:

  • symmetric keys 对称密钥
  • asymmetric keys 非对称密钥

一个order生成一个对应的secret,order可以异步生成。

Consumer

consumer可以把一组用户或服务注册给container,表明这组用户或服务对该container感兴趣。

该设计的初衷是,当一个container被删除时,所有的consumer应该被通知该事件。

其它

barbican除了启动api web 服务之外,还会默认启动两个消息队列的server:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
service barbican-keystone-listener start/stop
service barbican-worker start/stop

#启动流程
/etc/init.d/barbican-keystone-listener -> /usr/bin/barbican-keystone-listener -> barbican.cmd.keystone_listener -> main

/etc/init.d/barbican-worker -> /usr/bin/barbican-worker -> barbican.cmd.worker -> main

作用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
barbican-keystone-listener
#监听keystone发出的事件,执行相应的操作。目前只有一个功能,即捕获keystone删除project的事件,然后删除对应project下的资源(container、secret等)

barbican-worker
#监听order操作的异步事件,执行相应的操作。如创建密钥等。事件源来自order api
Barbican的加解密插件系统

安装准备

在安装和配置密钥管理器服务之前,您必须创建数据库、服务凭证和 API 端点

创建数据库

①连接数据库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@controller ~]# mysql -uroot -p000000

②创建barbican数据库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MariaDB [(none)]> CREATE DATABASE barbican;

③授权

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MariaDB [(none)]> GRANT ALL PRIVILEGES ON barbican.* TO 'barbican'@'localhost' IDENTIFIED BY '000000';

MariaDB [(none)]> GRANT ALL PRIVILEGES ON barbican.* TO 'barbican'@'%' IDENTIFIED BY '000000';

④退出数据库

加载 admin user 的环境变量
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@controller ~]# source admin-openrc.sh
创建服务凭证

①创建barbican用户

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@controller ~]# openstack user create --domain default --password 000000 barbican
+---------------------+----------------------------------+
| Field               | Value                            |
+---------------------+----------------------------------+
| domain_id           | default                          |
| enabled             | True                             |
| id                  | 7d982c41976147c6a0b0d8339c408acd |
| name                | barbican                         |
| options             | {}                               |
| password_expires_at | None                             |
+---------------------+----------------------------------+

admin为用户添加角色barbican

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@controller ~]# openstack role add --project service --user barbican admin

③创建creator角色

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@controller ~]#  openstack role create creator
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | None                             |
| domain_id   | None                             |
| id          | 3589b190b9ff4ef582a0417ba0f055e6 |
| name        | creator                          |
| options     | {}                               |
+-------------+----------------------------------+

creator为用户添加角色barbican

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@controller ~]# openstack role add --project service --user barbican creator

⑤创建barbican服务实体

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@controller ~]# openstack service create --name barbican --description "Key Manager" key-manager
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | Key Manager                      |
| enabled     | True                             |
| id          | 623e7b3cb14e4bffaaeff7424950719e |
| name        | barbican                         |
| type        | key-manager                      |
+-------------+----------------------------------+
创建密钥管理器服务 API 端点
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@controller ~]# openstack endpoint create --region RegionOne key-manager public http://controller:9311
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 00a78500310445bd8f728884d0acebac |
| interface    | public                           |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 6ba9579e9acd449a904327c0cd6efac8 |
| service_name | barbican                         |
| service_type | key-manager                      |
| url          | http://controller:9311           |
+--------------+----------------------------------+

[root@controller ~]# openstack endpoint create --region RegionOne key-manager internal http://controller:9311
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 8a0a51041d494daea036b40fd840cc17 |
| interface    | internal                         |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 6ba9579e9acd449a904327c0cd6efac8 |
| service_name | barbican                         |
| service_type | key-manager                      |
| url          | http://controller:9311           |
+--------------+----------------------------------+

[root@controller ~]# openstack endpoint create --region RegionOne key-manager admin http://controller:9311
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 71d5a7a9b394408c945d209fc55552d1 |
| interface    | admin                            |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 6ba9579e9acd449a904327c0cd6efac8 |
| service_name | barbican                         |
| service_type | key-manager                      |
| url          | http://controller:9311           |
+--------------+----------------------------------+

安装和配置Barbican组件

安装软件包
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@controller ~]# yum install openstack-barbican-api cryptsetup -y
配置文件

编辑/etc/barbican/barbican.conf文件并完成以下操作:

[DEFAULT]部分中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[DEFAULT]
sql_connection = mysql+pymysql://barbican:000000@controller/barbican
transport_url = rabbit://openstack:000000@controller
bind_host = 0.0.0.0
bind_port = 9311
host_href = http://controller:9311
log_file = /var/log/barbican/api.log

[keystone_authtoken]部分中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[keystone_authtoken]
www_authenticate_uri = http://controller:5000
auth_url = http://controller:5000
memcached_servers = controller:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = barbican
password = 000000

[oslo_policy]部分中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[oslo_policy]
policy_file = /etc/barbican/policy.json
policy_default_rule = default

[secretstore]部分中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[secretstore]
namespace = barbican.secretstore.plugin
enabled_secretstore_plugins = store_crypto

[crypto]部分中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[crypto]
namespace = barbican.crypto.plugin
enabled_crypto_plugins = simple_crypto

[simple_crypto_plugin]

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[simple_crypto_plugin]
kek = 'YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoxMjM0NTY='
同步数据库
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@controller ~]# su -s /bin/sh -c "barbican-manage db upgrade" barbican
完成安装
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@controller ~]# systemctl restart openstack-barbican-api && systemctl enable openstack-barbican-api

验证

加载环境变量
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@controller ~]# source admin-openrc.sh
创建密钥
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@controller ~]# openstack secret store --name secret01 --payload secretkey
+---------------+------------------------------------------------------------------------+
| Field         | Value                                                                  |
+---------------+------------------------------------------------------------------------+
| Secret href   | http://controller:9311/v1/secrets/f9fa0edf-c2b3-4482-818a-7418c7226f66 |
| Name          | secret01                                                               |
| Created       | None                                                                   |
| Status        | None                                                                   |
| Content types | None                                                                   |
| Algorithm     | aes                                                                    |
| Bit length    | 256                                                                    |
| Secret type   | opaque                                                                 |
| Mode          | cbc                                                                    |
| Expiration    | None                                                                   |
+---------------+------------------------------------------------------------------------+

获取一个指定密钥的信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@controller ~]# openstack secret get http://controller:9311/v1/secrets/f9fa0edf-c2b3-4482-818a-7418c7226f66
+---------------+------------------------------------------------------------------------+
| Field         | Value                                                                  |
+---------------+------------------------------------------------------------------------+
| Secret href   | http://controller:9311/v1/secrets/f9fa0edf-c2b3-4482-818a-7418c7226f66 |
| Name          | secret01                                                               |
| Created       | 2023-07-02T10:43:36+00:00                                              |
| Status        | ACTIVE                                                                 |
| Content types | {u'default': u'text/plain'}                                            |
| Algorithm     | aes                                                                    |
| Bit length    | 256                                                                    |
| Secret type   | opaque                                                                 |
| Mode          | cbc                                                                    |
| Expiration    | None                                                                   |
+---------------+------------------------------------------------------------------------+

获取一个指定密钥的明文内容

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@controller ~]# openstack secret get http://controller:9311/v1/secrets/f9fa0edf-c2b3-4482-818a-7418c7226f66 --payload
+---------+-----------+
| Field   | Value     |
+---------+-----------+
| Payload | secretkey |
+---------+-----------+

参考文章:https://www.cnblogs.com/tian-jiang- ming/p/8718319.html https://blog.csdn.net/ qq_52089863/article/details/131503907

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-01-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 民工哥技术之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Kafka学习四
在kafka启动时,首先执行的broker的操作,然后接着会执行生产者操作,接着将生产者的消息放入到存储中,此时生产者和broker会进行交互,而消费者发送消息,接着消费者会和broker交互。前面我们知道kafka在kafkaApi中会处理具体的请求。首先,我们再次来看kafkaApi的handle,可以看到其入参的参数是RequestChannel.request,也即我们需要找到ReuqestChannel,回忆在RocketMQ中,我们也可以看到请求的参数:ChannelHandlerContext和request在Processor中。也即request.header.apiKey匹配到case样例函数。从Sender中,我们可以看到sendProducerData和poll两个方法中有构建请求和完整响应,此时可以看到kafkaApi中基于请求的,也即必然会有处理器。
路行的亚洲
2020/10/26
6010
Kafka Producer整体架构概述及源码分析
它是一个ConcurrentMap,key是TopicPartition类,代表一个topic的一个partition。value是一个包含ProducerBatch的双端队列。等待Sender线程发送给broker。画张图来看下:
857技术社区
2022/05/17
5690
Kafka Producer整体架构概述及源码分析
KafkaProducer源码分析
Broker:Kafka的服务端即Kafka实例,Kafka集群由一个或多个Broker组成,主要负责接收和处理客户端的请求
用户6070864
2019/09/04
6230
KafkaProducer源码分析
5、深潜KafkaProducer——Sender线程
通过上一课时的介绍我们了解到,业务线程通过 KafkaProducer.send() 方法将 message 放入 RecordAccumulator 中进行能缓冲,并没有进行实际的网络 I/O 操作,真正的网络 I/O 操作是由 Sender 线程完成。
杨四正
2021/05/26
1.1K0
源码分析 Kafka 消息发送流程(文末附流程图)
从上文 初识 Kafka Producer 生产者,可以通过 KafkaProducer 的 send 方法发送消息,send 方法的声明如下:
丁威
2019/11/12
1.4K0
源码分析 Kafka 消息发送流程(文末附流程图)
kafka实践(十二):生产者(KafkaProducer)源码详解和调试
在前面已经完成win环境下zk(3.4.12版本)的运行,并对kafka源码编译, 参考:本地kafka源码的编译和调试,在idea的run-->debug-->中新增configuration来创建topic:yzg(3分区1备份),本地启动运行效果:
数据社
2020/12/08
8850
kafka实践(十二):生产者(KafkaProducer)源码详解和调试
KafkaProducer Sender 线程详解(含详细的执行流程图)
上文 《源码分析 Kafka 消息发送流程》 已经详细介绍了 KafkaProducer send 方法的流程,该方法只是将消息追加到 KafKaProducer 的缓存中,并未真正的向 broker 发送消息,本文将来探讨 Kafka 的 Sender 线程。
丁威
2019/11/19
1.7K0
KafkaProducer Sender 线程详解(含详细的执行流程图)
4、深潜KafkaProducer —— RecordAccumulator
通过上一课时的介绍我们了解到,业务线程使用 KafkaProducer.send() 方法发送 message 的时候,会先将其写入RecordAccumulator 中进行缓冲,当 RecordAccumulator 中缓存的 message 达到一定阈值的时候,会由 IO 线程批量形成请求,发送到 kafka 集群。本课时我们就重点来看一下 RecordAccumulator 这个缓冲区的结构。
杨四正
2021/05/26
1.3K0
Kafka生产者的使用和原理
本文将学习Kafka生产者的使用和原理,文中使用的kafka-clients版本号为2.6.0。下面进入正文,先通过一个示例看下如何使用生产者API发送消息。
草捏子
2020/09/14
1.1K0
Kafka生产者的使用和原理
多图详解kafka生产者消息发送过程
KafkaProducer通过解析producer.propeties文件里面的属性来构造自己。 例如 :分区器、Key和Value序列化器、拦截器、RecordAccumulator消息累加器 、元信息更新器、启动发送请求的后台线程
石臻臻的杂货铺[同名公众号]
2022/04/30
1.9K0
多图详解kafka生产者消息发送过程
多图详解kafka生产者消息发送过程
KafkaProducer通过解析producer.propeties文件里面的属性来构造自己。 例如 :分区器、Key和Value序列化器、拦截器、RecordAccumulator消息累加器 、元信息更新器、启动发送请求的后台线程
石臻臻的杂货铺[同名公众号]
2022/09/26
6560
kafka0.8生产者异常处理
本文简单解析一下kafka0.8.2.2版本中的java producer的异常处理。
code4it
2018/09/17
6560
kafka0.8生产者异常处理
kafka全面解析(二)
oldproducer是生产者scala版本的生产者,支持同步模式,和异步模式,通过实行producer.type进行配置。
小土豆Yuki
2021/05/11
5840
Kafka基础篇学习笔记整理
KafkaProducer会将消息先放入缓冲区中,然后由单独的sender线程异步发送到broker服务端,那么既然消息是批量发送的,那么触发批量发送的条件是什么呢?
大忽悠爱学习
2023/04/23
3.8K0
Kafka基础篇学习笔记整理
八股必备|Kafka幂等性原理深入解析
在正常情况下,Producer向Broker投递消息,Broker将消息追加写到对应的流(即某一Topic的某一Partition)中,并向Producer返回ACK信号,表示确认收到。
王知无-import_bigdata
2022/04/13
3K0
八股必备|Kafka幂等性原理深入解析
(六)Kafka系列:十分钟,了解Kafka的Sender线程
在上两篇文章《连Producer端的主线程模块运行原理都不清楚,就敢说自己精通Kafka》和《一文了解Kafka的消息收集器RecordAccumulate》中,我们介绍了Main Thread和RecordAccumulate的工作原理,那么在本篇文章中,我们继续介绍第三部分内容:Sender线程。
爪哇缪斯
2023/09/19
2010
(六)Kafka系列:十分钟,了解Kafka的Sender线程
Kafka 生产者解析
Producer 的拦截器(Interceptor)和 Consumer 的 Interceptor 主要⽤于实现Client端的定制化控制逻辑。 对于Producer⽽⾔,Interceptor使得⽤户在消息发送前以及Producer回调逻辑前有机会对消息做⼀些定制化需求,⽐如修改消息等。同时,Producer允许⽤户指定多个Interceptor按序作⽤于同⼀条消息从⽽形成⼀个拦截链(Interceptor Chain)。Intercetpor 的实现接⼝是org.apache.kafka.clients.producer.ProducerInterceptor,其定义的⽅法包括:
用户7353950
2022/06/23
5920
Kafka 生产者解析
十分钟,了解Kafka的Sender线程
在上两篇文章《连Producer端的主线程模块运行原理都不清楚,就敢说自己精通Kafka》和《一文了解Kafka的消息收集器RecordAccumulate》中,我们介绍了Main Thread和RecordAccumulate的工作原理,那么在本篇文章中,我们继续介绍第三部分内容:Sender线程。
爪哇缪斯
2023/09/08
4480
十分钟,了解Kafka的Sender线程
「kafka」kafka-clients,java编写生产者客户端及原理剖析
构建的消息对象ProducerRecord并不是单纯意义上的消息,它包含了多个属性,原本需要发送的业务相关的消息体只是其中的一个value属性,比如“hello world”,ProducerRecord的源码如下:
源码之路
2020/09/04
1.7K0
「kafka」kafka-clients,java编写生产者客户端及原理剖析
从源码来分析kafka生产者原理
源码学习是一种挺好的方式,不过根据我的经验最好是先学习大致的原理,再回头看源码,更能抓住重点。
崩天的勾玉
2024/03/12
1570
从源码来分析kafka生产者原理
相关推荐
Kafka学习四
更多 >
LV.9
这个人很懒,什么都没有留下~
目录
  • Barbican 介绍
  • Barbican 架构图
    • 各组件之间的关系图
    • Barbican的加解密插件系统
  • 安装准备
    • 创建数据库
    • 加载 admin user 的环境变量
    • 创建服务凭证
    • 创建密钥管理器服务 API 端点
  • 安装和配置Barbican组件
    • 安装软件包
    • 配置文件
    • 同步数据库
    • 完成安装
  • 验证
    • 加载环境变量
    • 创建密钥
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档