SPIRE适配GaussDB开源开发任务
1 背景介绍
开源共创(developer .huaweicloud.com/programs/opensource/contributing/)通过和公司、高校、社区的开发者合作,完成鲲鹏、昇腾、欧拉、鸿蒙、高斯、云服务等与开源软件的适配开发,帮助繁荣Huawei的基础生态,同时让开源软件能够更加简单、高效的运行于华为云上。
开始之前,开发者可以下载开源for Huawei Wiki(gitcode .com/HuaweiCloudDeveloper/OpenSourceForHuaweiWiki/overview)了解详细的开发步骤,技术准备,以及开发过程需要的各种资源。
2 需求分析
2.1 项目影响力
SPIRE是SPIFFE的运行时环境,是一个生成就绪、开源的SPIFFE实现。用于在各种托管平台上建立软件系统之间的信任的API工具链。SPIRE包含了两个主要组件:服务端和代理,服务端负责验证代码和生成SVID,而代理负责提供Workload API,并与服务端通信。SPIRE可以使工作负载安全地对秘密存储、数据库或云提供商服务进行身份验证。
项目数据:Fork 471, Star 1.8k, Contributor 177, 最近一次提交:2024-9-25
主要开发语言:Go
源代码仓库:github .com/spiffe/spire
star历史:
2.2 任务目的和范围
本任务的主要目的是让SPIRE支持GaussDB数据库,帮助拓展GaussDB的影响力,方便SPIRE的用户能够顺利对接GaussDB数据库。同时,该任务可以为一些项目迁移打下基础,方便用户在做方案选型时,可以选择GaussDB作为后端存储。
3 SPIRE适配GaussDB数据库功能介绍
在完成GaussDB数据库的适配之后可以将GaussDB作为SPIRE的SQL Database进行使用,SPIRE的相关使用和功能皆和官网保持一致。
目前已经完成了如下任务:
- 在GitCode完成项目Fork,并完成GaussDB数据库适配需要的脚本和代码开发。
- 使用spire的datastore插件配置Gaussdb,能够从Gaussdb查询、存储、更新信息
数据存储适配参考如下文档:github .com/spiffe/spire/blob/main/doc/plugin_server_datastore_sql.md
如果你想原生使用SPIRE接入GaussDB可以直接参考第5章内容
4 安装部署指导
4.1 linux安装使用
4.1.1 构建spire
拉取代码并提前安装好go
和make
等基础软件包
git clone https://gitcode.com/HGZ-20/spire.git
cd spire
make bin/spire-server
make bin/spire-agent
4.1.2 配置存储插件
原始的服务配置信息如下,需要将存储插件配置为gauss数据库
server {
bind_address = "127.0.0.1"
bind_port = "8081"
socket_path = "/tmp/spire-server/private/api.sock"
trust_domain = "example.org"
data_dir = "./.data"
log_level = "DEBUG"
}
plugins {
DataStore "sql" {
plugin_data {
database_type = "sqlite3"
connection_string = "./.data/datastore.sqlite3"
}
}
NodeAttestor "join_token" {
plugin_data {
}
}
KeyManager "memory" {
plugin_data = {}
}
UpstreamAuthority "disk" {
plugin_data {
key_file_path = "./conf/server/dummy_upstream_ca.key"
cert_file_path = "./conf/server/dummy_upstream_ca.crt"
}
}
}
修改配置后的配置文件格式如下,注意请填写GaussDB数据库的真实用户名,密码,地址等信息
server {
bind_address = "127.0.0.1"
bind_port = "8081"
socket_path = "/tmp/spire-server/private/api.sock"
trust_domain = "example.org"
data_dir = "./.data"
log_level = "DEBUG"
}
plugins {
DataStore "sql" {
plugin_data {
database_type = "opengauss"
connection_string = "dbname=*** user=*** password=*** host=*** port=*** sslmode=disable"
}
}
NodeAttestor "join_token" {
plugin_data {
}
}
KeyManager "memory" {
plugin_data = {}
}
UpstreamAuthority "disk" {
plugin_data {
key_file_path = "./conf/server/dummy_upstream_ca.key"
cert_file_path = "./conf/server/dummy_upstream_ca.crt"
}
}
}
4.1.3 运行SPIRE Server
SPIRE 服务器管理和颁发身份,运行以下命令启动服务器:
bin/spire-server run -config conf/server/server.conf &
检查服务器是否正在运行
bin/spire-server healthcheck
4.1.4 创建连接令牌以向服务器证明代理
生成一次性令牌以用于证明代理:
bin/spire-server token generate -spiffeID spiffe://example.org/myagent
记下令牌,在下一步中需要它来证明初始启动时的代理。
4.1.5 运行SPIRE agent
SPIRE 代理查询 SPIRE 服务器以证明(验证)节点和工作负载。
使用在上一步中创建的令牌启动并证明代理:
bin/spire-agent run -config conf/agent/agent.conf -joinToken <token_string> &
检查代理是否正在运行:
bin/spire-agent healthcheck
4.1.6 为工作负载创建注册策略
为了使 SPIRE 能够识别工作负载,您必须通过注册条目向 SPIRE 服务器注册工作负载。工作负载注册告诉 SPIRE 如何识别工作负载以及为其提供哪个 SPIFFE ID。
bin/spire-server entry create -parentID spiffe://example.org/myagent \
-spiffeID spiffe://example.org/myservice -selector unix:uid:$(id -u)
4.1.7 检索和查看x509-SVID
此命令将复制工作负载从代理获取 x509-SVID 所采用的过程。x509-SVID 可用于向另一个工作负载验证工作负载。要获取 x509-SVID 并将其写入 /tmp/:
$ bin/spire-agent api fetch x509 -write /tmp/
Received 1 bundle after 254.780649ms
SPIFFE ID: spiffe://example.org/myservice
SVID Valid After: 2019-10-25 19:07:49 +0000 UTC
SVID Valid Until: 2019-10-25 20:07:21 +0000 UTC
Intermediate #1 Valid After: 2019-10-25 19:07:11 +0000 UTC
Intermediate #1 Valid Until: 2019-10-25 20:07:21 +0000 UTC
CA #1 Valid After: 2018-05-13 19:33:47 +0000 UTC
CA #1 Valid Until: 2023-05-12 19:33:47 +0000 UTC
Writing SVID #0 to file /tmp/svid.0.pem.
Writing key #0 to file /tmp/svid.0.key.
Writing bundle #0 to file /tmp/bundle.0.pem.
4.1.8 其它操作
可以查看SPIRE文档(spiffe .io/docs/latest/spiffe-about/overview/)了解更多SPIRE相关的功能和配置
4.2 k8s中部署
参考SPIRE官方的K8s部署文档(spiffe .io/docs/latest/try/getting-started-k8s/)
注意镜像需要替换为适配了GaussDB版本的镜像:
- spire-server:
docker pull fermion20/spire-server:gauss
- spire-agent:
docker pull fermion20/spire-agent:gauss
5 DEMO设计与验证
5.1 DEMO设计
在DEMO的设计上直接采用了SPIRE官方的一个示例DEMO,使用X.509 SPIFFE IDs保护与Envoy的微服务通信。
为了说明 X.509 身份验证,我们创建了一个包含三个服务的简单方案。一个服务将是后端,它是一个提供静态数据的简单 nginx 实例。另一方面,我们运行两个 Symbank 模拟银行应用程序实例,作为前端服务。Symbank 前端服务向 nginx 后端发送 HTTP 请求以获取用户帐户详细信息。
如图所示,前端服务通过 Envoy 实例建立的 mTLS 连接连接到后端服务,该实例代表每个工作负载执行 X.509 SVID 身份验证。
5.2 DEMO部署
DEMO的部署参考官方文档(spiffe .io/docs/latest/microservices/envoy-x509/readme/)即可,仅需将对应的SPIRE镜像替换为第四节中的对应镜像。
部署需求:
- 创建CCE集群的鲲鹏环境
- 购买鲲鹏云中的GaussDB实例
- CCE集群中购买相关节点服务资源
- 将spire适配版的镜像上传至华为云容器服务中便于集群部署
完成部署需求的准备即可按照官方文档(spiffe .io/docs/latest/microservices/envoy-x509/readme/)部署。
5.3 DEMO验证
按照官方文档部署后会有两个前端服务,通过对应端口可以查询到相关信息。打开浏览器并导航到环境中为 frontend 显示的 IP 地址,添加端口 :3000。加载页面后,您将看到用户 Jacob Marley 的账户详细信息。
按照相同的步骤,当您连接到 frontend-2 服务的 URL 时,浏览器会显示用户 Alex Fergus 的帐户详细信息。
我们可以通过修改TLS配置来实验仅一个前端可以访问后端,达到访问控制功能
后端服务的 Envoy 配置使用 TLS 配置,通过验证 TLS 连接上显示的证书的主题备用名称 (SAN) 来过滤传入连接。对于 SVID,证书的 SAN 字段使用与服务关联的 SPIFFE ID 进行设置。因此,通过在 match_typed_subject_alt_names 过滤器中指定 SPIFFE ID,我们向 Envoy 指示哪些服务可以建立连接。
现在让我们更新后端服务的 Envoy 配置,以仅允许来自前端服务的请求。这是通过从 Envoy 配置的 combined_validation_context 部分中删除 frontend-2 服务的 SPIFFE ID 来实现的。更新的配置如下所示:
combined_validation_context:
# validate the SPIFFE ID of incoming clients (optionally)
default_validation_context:
match_typed_subject_alt_names:
- san_type: URI
matcher:
exact: "spiffe://example.org/ns/default/sa/default/frontend"
修改配置后重新部署后端服务,服务部署成功后会发现,只有frontend可以获取账户信息,frontend-2已经无法获取相关服务信息
至此DEMO的验证流程结束,我们在基于GaussDB的SPIRE部署中实现了微服务中的身份认证和访问控制功能
原生使用
GaussDB是基于Postgres开发的,在后续的迭代开发中更改了一些功能,在连接上为了安全性没有使用和Postgres一致可适配的连接认证方式。GaussDB默认使用sha256,因此我们只要在创建GaussDB数据库时将连接认证方式修改为md5即可。具体参考下图:
在创建数据库时,拉到参数模板处,点击查看参数模板
点击创建参数模板
选择要使用的数据库版本基于基础模板创建模板参数
在自定义中找到刚才生成的模板并点击
在高风险参数中搜索cn:password_encryption_type
然后把参数值改为0
修改模板完成后,在创建数据库页面使用刚才的模板
然后创建完成的数据库就可以直接作为SPIRE的数据存储了。
参考资料
- 开源for Huawei介绍、环境搭建、示例项目、开发和部署指南(gitcode .com/HuaweiCloudDeveloper/OpenSourceForHuaweiWiki/overview)
- SPIFFE官方文档(spiffe .io/docs/latest/spiffe-about/overview/)
- SPIRE(github .com/spiffe/spire)
- 点赞
- 收藏
- 关注作者
评论(0)