SPIRE适配GaussDB开源开发任务

举报
Fermion 发表于 2025/02/12 16:51:00 2025/02/12
【摘要】 本任务的主要目的是让SPIRE支持GaussDB数据库,帮助拓展GaussDB的影响力,方便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历史:
image.png

2.2 任务目的和范围

本任务的主要目的是让SPIRE支持GaussDB数据库,帮助拓展GaussDB的影响力,方便SPIRE的用户能够顺利对接GaussDB数据库。同时,该任务可以为一些项目迁移打下基础,方便用户在做方案选型时,可以选择GaussDB作为后端存储。

3 SPIRE适配GaussDB数据库功能介绍

在完成GaussDB数据库的适配之后可以将GaussDB作为SPIRE的SQL Database进行使用,SPIRE的相关使用和功能皆和官网保持一致。

image.png

目前已经完成了如下任务:

  • 在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

拉取代码并提前安装好gomake等基础软件包

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 请求以获取用户帐户详细信息。
image.png
如图所示,前端服务通过 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 的账户详细信息。
image.png

按照相同的步骤,当您连接到 frontend-2 服务的 URL 时,浏览器会显示用户 Alex Fergus 的帐户详细信息。
image.png

我们可以通过修改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已经无法获取相关服务信息
image.png

image.png

至此DEMO的验证流程结束,我们在基于GaussDB的SPIRE部署中实现了微服务中的身份认证和访问控制功能

原生使用

GaussDB是基于Postgres开发的,在后续的迭代开发中更改了一些功能,在连接上为了安全性没有使用和Postgres一致可适配的连接认证方式。GaussDB默认使用sha256,因此我们只要在创建GaussDB数据库时将连接认证方式修改为md5即可。具体参考下图:

在创建数据库时,拉到参数模板处,点击查看参数模板
image.png

点击创建参数模板
image.png

选择要使用的数据库版本基于基础模板创建模板参数
image.png

在自定义中找到刚才生成的模板并点击
image.png

在高风险参数中搜索cn:password_encryption_type
image.png

image.png

然后把参数值改为0
image.png

修改模板完成后,在创建数据库页面使用刚才的模板
image.png

然后创建完成的数据库就可以直接作为SPIRE的数据存储了。

参考资料

  1. 开源for Huawei介绍、环境搭建、示例项目、开发和部署指南(gitcode .com/HuaweiCloudDeveloper/OpenSourceForHuaweiWiki/overview)
  2. SPIFFE官方文档(spiffe .io/docs/latest/spiffe-about/overview/)
  3. SPIRE(github .com/spiffe/spire)
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。