介绍
本次记录范围:
- 在 Kubernetes 上部署 Dependency-Track。
- 使用 EAuth 作为 OIDC 身份提供方。
- 实现统一登录、用户自动开通与可扩展的团队权限治理。
环境假设:Kubernetes + 外部 PostgreSQL + Ingress 暴露服务。
Dependency-Track 简介
Dependency-Track 是 OWASP 的持续 SBOM 分析平台,核心能力是:
- 接收 CycloneDX SBOM(来自构建流程或供应商)。
- 持续分析组件漏洞、许可证和策略风险。
- 通过通知与集成,把风险结果推送到研发与安全流程。
它不是一次性扫描工具,而是“软件供应链风险持续治理平台”。
对接原因
在这个对接场景里,EAuth 承担统一身份服务:
- 统一身份认证:避免维护多套账号体系。
- 用户自动开通:首次登录即可按策略创建用户。
- 组织信息映射:可通过 claim(如
groups)衔接团队权限模型。 - 审计与合规:认证行为纳入统一审计链路。
对应分工:Dependency-Track 处理组件风险分析,EAuth 处理认证与身份信息来源。
前置条件
开始前请确认:
- Kubernetes 集群可用,
kubectl 已配置,本次部署使用kubekeeper。 - 已准备 PostgreSQL(Dependency-Track 推荐外部数据库)。
- EAuth 已部署并可对外提供 OIDC(含 issuer 和 client)。
- Ingress 域名已解析,例如:
product.efucloud.com。
OIDC 关键前提
根据官方 OIDC 文档,Dependency-Track 的 OIDC 是前后端协同配置:
- 前端是 OIDC Client。
- API Server 是 Resource Server。
- 需要同时配置 API Server 与 Frontend。
因此,采用前后端分离并可分别配置的部署方式更稳妥(例如下方 Kubernetes 清单)。
可直接复制的 Kubernetes 示例 YAML
将下面内容保存为 dependency-track-eauth-oidc.yaml:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
| apiVersion: v1
kind: Namespace
metadata:
name: dtrack
---
apiVersion: v1
kind: Secret
metadata:
name: dtrack-database-secret
namespace: dtrack
type: Opaque
stringData:
ALPINE_DATABASE_USERNAME: "postgres"
ALPINE_DATABASE_PASSWORD: "EfuCloud@pdes"
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: dtrack-api-server
namespace: dtrack
spec:
replicas: 1
selector:
matchLabels:
app: dtrack-api-server
template:
metadata:
labels:
app: dtrack-api-server
spec:
containers:
- name: api-server
image: dependencytrack/apiserver:4.14.0
ports:
- containerPort: 8080
env:
- name: ALPINE_DATABASE_MODE
value: "external"
- name: ALPINE_DATABASE_URL
value: "jdbc:postgresql://postgres.postgres.svc.cluster.local:5432/dependencytrack"
- name: ALPINE_DATABASE_DRIVER
value: "org.postgresql.Driver"
- name: ALPINE_DATABASE_USERNAME
valueFrom:
secretKeyRef:
name: dtrack-database-secret
key: ALPINE_DATABASE_USERNAME
- name: ALPINE_DATABASE_PASSWORD
valueFrom:
secretKeyRef:
name: dtrack-database-secret
key: ALPINE_DATABASE_PASSWORD
- name: ALPINE_METRICS_ENABLED
value: "true"
# OIDC (API Server)
- name: ALPINE_OIDC_ENABLED
value: "true"
- name: ALPINE_OIDC_CLIENT_ID
value: "cajp4fkj2lhvrit26nkzne32y"
- name: ALPINE_OIDC_ISSUER
value: "https://eauth.efucloud.com"
- name: ALPINE_OIDC_USERNAME_CLAIM
value: "username"
- name: ALPINE_OIDC_USER_PROVISIONING
value: "true"
# 先关闭团队同步,确认登录稳定后再开启
- name: ALPINE_OIDC_TEAM_SYNCHRONIZATION
value: "false"
- name: ALPINE_OIDC_TEAMS_CLAIM
value: "groups"
- name: ALPINE_OIDC_TEAMS_DEFAULT
value: "Administrators"
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: dtrack-frontend
namespace: dtrack
spec:
replicas: 1
selector:
matchLabels:
app: dtrack-frontend
template:
metadata:
labels:
app: dtrack-frontend
spec:
containers:
- name: frontend
image: dependencytrack/frontend:4.14.0
ports:
- containerPort: 8080
env:
- name: API_BASE_URL
value: ""
# OIDC (Frontend)
- name: OIDC_ISSUER
value: "https://eauth.efucloud.com"
- name: OIDC_CLIENT_ID
value: "cajp4fkj2lhvrit26nkzne32y"
- name: OIDC_SCOPE
value: "openid profile email"
- name: OIDC_FLOW
value: ""
- name: OIDC_LOGIN_BUTTON_TEXT
value: "OpenID"
---
apiVersion: v1
kind: Service
metadata:
name: dtrack-api-server
namespace: dtrack
spec:
selector:
app: dtrack-api-server
ports:
- port: 8080
targetPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: dtrack-frontend
namespace: dtrack
spec:
selector:
app: dtrack-frontend
ports:
- port: 8080
targetPort: 8080
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: dtrack
namespace: dtrack
spec:
ingressClassName: nginx
tls:
- hosts:
- product.efucloud.com
secretName: product-tls
rules:
- host: product.efucloud.com
http:
paths:
- path: /api
pathType: Prefix
backend:
service:
name: dtrack-api-server
port:
number: 8080
- path: /
pathType: Prefix
backend:
service:
name: dtrack-frontend
port:
number: 8080
|
EAuth 端配置清单
在 EAuth中创建 OIDC应用:
- 在eauth中创建一个应用为
dependencytrack,需要确保回调地址为https://product.efucloud.com/static/oidc-callback.html,eauth支持多种回调地址匹配方式,特别是针对云IDE场景下,能简化运维,减少不必要的应用数量。

部署步骤
- 需要准备tls证书,dependency-track只支持tls访问,文中创建的tls的secret为
product-tls。 - 在kubekeeper中导入项目的yaml文件,按照页面流程操作
在批量验证没有问题后,点击下一步,并执行批量执行

- 手动创建tls的secret
product-tls。
验证
在kubekeeper中国呢部署并查看应用正常后,通过浏览器打开https://product.efucloud.com,
- 先使用
admin/admin登录系统,进入配置页面,修改默认的语言和基本URL

- 本次部署使用的默认组是
Administrators(即上面yaml文件中的ALPINE_OIDC_TEAMS_DEFAULT),可以针对场景创建新的组,在本次部署中发现创建OpenID Connect 组是无效的。

- 在登录页面选择OPENID登录,就可以看到所有的页面(由于授予的组是
Administrators)
常见问题与排障
1) 看不到 OpenID 按钮
优先检查 Dependency-Track 到 EAuth 的 https://eauth.efucloud.com/.well-known/openid-configuration 连通性。官方说明该地址不可达时,前端不会显示 OIDC 登录入口。
2) 登录成功但用户名不正确
检查 ALPINE_OIDC_USERNAME_CLAIM 是否与 EAuth 返回 claim 一致(示例为 username,你的环境也可能是 preferred_username 或 email)。
3) 团队权限不符合预期
- 若
ALPINE_OIDC_TEAM_SYNCHRONIZATION=false,不会按 groups 实时同步。 - 默认团队由
ALPINE_OIDC_TEAMS_DEFAULT 控制。 - 启用同步后,建议先用低风险测试组验证,再切到生产团队策略。
4) 回调失败
核对 EAuth 应用中的 Redirect URI 是否与实际访问域名完全一致:
https://product.efucloud.com/static/oidc-callback.html
注意事项
- 不要把数据库密码明文写进 YAML,使用 Secret 管理并配合密钥托管。
- 默认团队建议使用只读或低权限角色,避免首次登录即高权限。
- 完成 OIDC 后,继续打通 CI/CD 上传 SBOM 到
/api/v1/bom,形成“构建即分析”。 - 接入通知能力,把新增高危漏洞推送到告警系统,形成可追踪的处理流程。
结果记录
完成对接后可确认:
- Dependency-Track 提供供应链风险识别与持续分析能力。
- EAuth 提供企业级统一身份与访问治理能力。
- 在统一身份前提下,风险分析平台可直接纳入组织账号体系。
参考链接
- 智易付 官网: https://efucloud.com
- Dependency-Track 官网: https://dependencytrack.org/
- OIDC 配置文档: https://docs.dependencytrack.org/getting-started/openidconnect-configuration/
- CI/CD 文档: https://docs.dependencytrack.org/usage/cicd/
- 通知文档: https://docs.dependencytrack.org/integrations/notifications/