EdgeX Foundry (以下统一简称:EdgeX)安全组件是一个可选的模块,在针对安全性要求比较高的环境,这个 Security 还是非常好用的。EdgeX 是一个完全中立的开源软件平台,各种功能也是建立在开放接口、可插拔、可更换模块的基础上的。使用 JWT(Json Web Token)作为资源访问控制,利于各种系统的对接和二次开发。
本文,我们将介绍一些关于 EdgeX 安全相关的应用技巧。
EdgeX 之 Security 介绍
Security 在 EdgeX 中的位置
Security 组件由一系列的微服务组成,有内置的 Core 相关,也有外部的 Secret 管理中心。
V3 以后版本还有一个特殊要求:服务与服务之间也必须有验证和授权才能访问服务,目的是,以防万一绕过 API Gateway 来直接获取数据。这些说明在 Architectural Design Records (ADRs) 中有所说明:
小试牛刀
在项目 Docker Compose 下,启动安全模式
使用以下命令:
建议使用最新发布分支或 main 分支,且尽量使用 dev
开发者模式
X86
git clone https://github.com/edgexfoundry/docker-compose.git cd docker-compose make run # 安全模式
ARM64/macOS ARM
git clone https://github.com/edgexfoundry/docker-compose.git cd docker-compose make run arm64 # 安全模式
开发者模式
git clone https://github.com/edgexfoundry/docker-compose.git cd docker-compose make run dev # 开发者安全模式 docker compose ps
开发者模式下,需要预先编译好 docker image( edgex-go 项目下),然后才能以 0.0.0-dev
结尾的 image 进行启动容器,也不需要指定硬件架构参数(X86/ARM64)效果如下:
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
edgex-app-rules-engine nexus3.edgexfoundry.org:10004/app-service-configurable:latest "/edgex-init/ready_t…" app-rules-engine 20 hours ago Restarting (127) 22 seconds ago
edgex-core-command edgexfoundry/core-command:0.0.0-dev "/edgex-init/ready_t…" core-command 20 hours ago Up 20 hours 127.0.0.1:59882->59882/tcp
edgex-core-common-config-bootstrapper edgexfoundry/core-common-config-bootstrapper:0.0.0-dev "/edgex-init/ready_t…" core-common-config-bootstrapper 20 hours ago Up 20 hours
edgex-core-consul hashicorp/consul:1.16.2 "/edgex-init/consul_…" consul 20 hours ago Up 20 hours 8300-8302/tcp, 8301-8302/udp, 8600/tcp, 8600/udp, 127.0.0.1:8500->8500/tcp
edgex-core-data edgexfoundry/core-data:0.0.0-dev "/edgex-init/ready_t…" core-data 20 hours ago Up 20 hours 127.0.0.1:59880->59880/tcp
edgex-core-metadata edgexfoundry/core-metadata:0.0.0-dev "/edgex-init/ready_t…" core-metadata 20 hours ago Up 20 hours 127.0.0.1:59881->59881/tcp
edgex-kuiper lfedge/ekuiper:1.11.4-alpine "/edgex-init/kuiper_…" rules-engine 20 hours ago Up 20 hours 9081/tcp, 20498/tcp, 127.0.0.1:59720->59720/tcp
edgex-nginx nginx:1.25.3-alpine-slim "/bin/sh /edgex-init…" nginx 20 hours ago Up 20 hours 80/tcp, 0.0.0.0:8443->8443/tcp
edgex-proxy-auth edgexfoundry/security-proxy-auth:0.0.0-dev "/bin/sh /edgex-init…" security-proxy-auth 20 hours ago Up 20 hours 127.0.0.1:59842->59842/tcp
edgex-redis redis:7.0.14-alpine "/edgex-init/redis_w…" database 20 hours ago Up 20 hours 127.0.0.1:6379->6379/tcp
edgex-security-bootstrapper edgexfoundry/security-bootstrapper:0.0.0-dev "/entrypoint.sh gate" security-bootstrapper 20 hours ago Up 20 hours
edgex-security-proxy-setup edgexfoundry/security-proxy-setup:0.0.0-dev "/edgex-init/proxy_s…" security-proxy-setup 20 hours ago Up 20 hours
edgex-security-secretstore-setup edgexfoundry/security-secretstore-setup:0.0.0-dev "entrypoint.sh" security-secretstore-setup 20 hours ago Up 20 hours
edgex-support-notifications edgexfoundry/support-notifications:0.0.0-dev "/edgex-init/ready_t…" support-notifications 20 hours ago Up 20 hours 127.0.0.1:59860->59860/tcp
edgex-support-scheduler edgexfoundry/support-scheduler:0.0.0-dev "/edgex-init/ready_t…" support-scheduler 20 hours ago Up 20 hours 127.0.0.1:59861->59861/tcp
edgex-ui-go edgexfoundry/edgex-ui:0.0.0-dev "./edgex-ui-server -…" ui 20 hours ago Up 20 hours 0.0.0.0:4000->4000/tcp
edgex-vault hashicorp/vault:1.14.5 "/edgex-init/vault_w…" vault 20 hours ago Up 20 hours 127.0.0.1:8200->8200/tcp
访问 UI
访问 EdgeX UI 界面,使用 http://localhost:4000 ,结果如下:
通过 docker compose ,获取临时通讯 JWT,填入上图的 Token 中即可登录 UI:
make get-token
eyJhbGciOiJFUzM4NCIsImtpZCI6IjEwZmM2ZmE5LTAxZWUtMTFmYi1hNTdmLWNhZGJmZDA2ZjVlNSJ9.eyJhdWQiOiJlZGdleCIsImV4cCI6MTY5OTE5NTU4NSwiaWF0IjoxNjk5MTkxOTg1LCJpc3MiOiIvdjEvaWRlbnRpdHkvb2lkYyIsIm5hbWUiOiJlZGdleHVzZXIiLCJuYW1lc3BhY2UiOiJyb290Iiwic3ViIjoiNzEwZWM5NGUtMjEyMy03NGI3LTRiMWYtMTlmYjMxZWJhNjQ4In0.oZ8TR4HsnOtkb2HW2oR6okiQNBnNiQ8qlGnqeKpx1MKrh5Nsz5Q3bJPQ_8W3yAL8sJhEPHyd-JUp-4pdqJ96D7tX0ILOwLJTwA79XwcWSzzzr92mU0ltmwWc1q1Bu24o
登陆成功,进入 UI 操作:
Security 二次开发
向 EdgeX 微服务进行身份验证
先来看一段官方的表达:
为了对 EdgeX 服务的 REST API 进行经过身份验证调用,HTTP 授权标头中必须存在适当的身份验证令牌(你可以认为就是:JWT)。要被识别为有效,这些令牌必须由 EdgeX 的秘密存储库颁发。
EdgeX 秘密存储库(Secret Store),是一个非常重要的概念,也是比较复杂难以理解的概念,有兴趣的可以查看这里:Secret Store。
实际应用过程中,有几种可能的身份验证场景:
非服务客户端的身份验证(包括 EdgeX UI),需要应用程序自己提供 JWT,并遵循 Security 接口规范,V3.0 版本以后,官方使用:SecretProvider 接口,由我司进行了 bug 修复和 pr 代码提交 ;- 使用 EdgeX 服务客户端的本地服务到服务客户端
- 使用 SecretProvider 接口的本地服务到服务客户端(我们将重点介绍这一种方法)
使用 SecretProvider 接口
这里使用 EdgeX UI 作为实例
首先,修改 docker compose
我们需要启用 SecretProvider 管理 EdgeX UI 的 Secret。在 docker-compose.yml 中,启用:
security-secretstore-setup:
...
...
environment:
EDGEX_ADD_SECRETSTORE_TOKENS: edgex-ui-service # 对应的 EdgeX UI 服务名称
...
...
其次,修改代码
我们需要告知 go-mod-bootstrap 启动时,需要使用 SecretProvider;
在代码中使用 SecretProvider 接口来获取 JWT;
jwtSecretProvider := secret.NewJWTSecretProvider(bootstrapContainer.SecretProviderExtFrom(dic.Get))
EdgeX UI 应用程序在调用 EdgeX 核心数据接口时,会自动加上 Token。
curl -H"Authorization: Bearer ${token}" "http://localhost:4000/api/v3/profile/yaml/name/MODBUS"
dbtimestamp:
created: 1699120423763
modified: 1699120423763
id: 7a46a088-187e-41c8-ad2b-802e9d884931
name: MODBUS
manufacturer: Audon Electronics
description: TEST MODBUS
model: MODBUS
labels: [Web, Modbus TCP, SNMP]
deviceResources:
- description: 1 - OFF (disabled), 2 - Lower, 3 - Higher, 4 - Lower or Higher
name: clock
isHidden: true
properties:
valueType: Int16
readWrite: RW
attributes:
primaryTable: HOLDING_REGISTERS
startingAddress: 80
deviceCommands:
- name: All
isHidden: false
readWrite: RW
resourceOperations:
- deviceResource: clock
defaultValue: ""
mappings: {}
关于我们
亿琪软件
上海亿琪软件有限公司成立于 2016 年,专注于 5G 通信、AI 人工智能、边缘计算和大数据网络安全多项技术领域,致力于物联网领域前沿技术的创新,为用户提供全方位、智能化和安全的物联网解决方案。
2023 年,公司发布“YiFUSION |工业边缘智能融合一体机”产品,为工业客户提供一整套的边缘计算+AI 能力:高性能数据采集、多类型数据融合、AI 算法集成、云端业务对接。在边缘网关的基础上,集成了 IoT 平台的边缘协同能力、本地 Web SCADA 和 HMI 功能、本地数据存储、边缘 AI 视频分析、行业应用集成等。
2022 年,公司推出 “YiCLOUD |亿琪云”一站式物联网应用解决方案。公司的业务涵盖了智慧城市、智慧农业、智能工厂和智慧园区等多个领域,公司软硬件产品和解决方案获得华为技术认证,得到中国移动 OCP 认证,公司还是边缘计算产业联盟 ECC 成员。
联系我们--商业服务
- 网站:http://yiqisoft.cn
- 邮件:support@yiqisoft.cn
- 电话:021-68863086
- 手机:186-1666-9123