开源|EdgeX 边缘计算之安全组件 Security
使用 JWT(Json Web Token)作为资源访问控制,利于各种系统的对接和二次开发。

EdgeX Foundry (以下统一简称:EdgeX)安全组件是一个可选的模块,在针对安全性要求比较高的环境,这个 Security 还是非常好用的。EdgeX 是一个完全中立的开源软件平台,各种功能也是建立在开放接口、可插拔、可更换模块的基础上的。使用 JWT(Json Web Token)作为资源访问控制,利于各种系统的对接和二次开发。

本文,我们将介绍一些关于 EdgeX 安全相关的应用技巧。

EdgeX 之 Security 介绍

Security 在 EdgeX 中的位置

EdgeX Security

Security 组件由一系列的微服务组成,有内置的 Core 相关,也有外部的 Secret 管理中心。

V3 以后版本还有一个特殊要求:服务与服务之间也必须有验证和授权才能访问服务,目的是,以防万一绕过 API Gateway 来直接获取数据。这些说明在 Architectural Design Records (ADRs) 中有所说明:

更多原始资料,请访问 EdgeX Foundry 官方网站 

小试牛刀

在项目 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 ,结果如下:

edgex login

通过 docker compose ,获取临时通讯 JWT,填入上图的 Token 中即可登录 UI:

make get-token
eyJhbGciOiJFUzM4NCIsImtpZCI6IjEwZmM2ZmE5LTAxZWUtMTFmYi1hNTdmLWNhZGJmZDA2ZjVlNSJ9.eyJhdWQiOiJlZGdleCIsImV4cCI6MTY5OTE5NTU4NSwiaWF0IjoxNjk5MTkxOTg1LCJpc3MiOiIvdjEvaWRlbnRpdHkvb2lkYyIsIm5hbWUiOiJlZGdleHVzZXIiLCJuYW1lc3BhY2UiOiJyb290Iiwic3ViIjoiNzEwZWM5NGUtMjEyMy03NGI3LTRiMWYtMTlmYjMxZWJhNjQ4In0.oZ8TR4HsnOtkb2HW2oR6okiQNBnNiQ8qlGnqeKpx1MKrh5Nsz5Q3bJPQ_8W3yAL8sJhEPHyd-JUp-4pdqJ96D7tX0ILOwLJTwA79XwcWSzzzr92mU0ltmwWc1q1Bu24o

登陆成功,进入 UI 操作:

edgex dashboard

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;

edegx ui code

在代码中使用 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 成员。

关注我们

yiqisoftedgexfoundry

联系我们--商业服务

  • 网站:http://yiqisoft.cn
  • 邮件:support@yiqisoft.cn
  • 电话:021-68863086
  • 手机:186-1666-9123
分享|EdgeX FAQ2 常见问题和解答二
性能相关问题,设备驱动开发,数据采集,已有驱动情况。