ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

JumpServer PAM 账号密钥查询 API 实战:Go 语言集成开发指南

JumpServer PAM 账号密钥查询 API 实战:Go 语言集成开发指南 JumpServer PAM 账号密钥查询 API 实战Go 语言集成开发指南【免费下载链接】jumpserverJumpServer is an open-source Privileged Access Management (PAM) platform that provides DevOps and IT teams with on-demand and secure access to SSH, RDP, Kubernetes, Database and RemoteApp endpoints through a web browser.项目地址: https://gitcode.com/GitHub_Trending/ju/jumpserver导读本文以 JumpServer 仓库内置的 Go 语言 SDK 示例为线索系统讲解 PAM 资产账号密码Secret查询服务的完整集成方案从 RESTful 接口的请求规范、HMAC-SHA256 签名认证原理到 Go 代码的逐段实现与常见问题排查。读完本文你将掌握使用 Go 安全调用 JumpServer 账号密钥接口的完整能力包括签名请求构造、参数校验、错误处理与结果解析并能直接复用仓库提供的现成代码。1. 接口概览PAM 账号密码查询服务JumpServer 作为开源特权访问管理PAM平台允许第三方系统如运维平台、工单系统、自动化脚本通过 RESTful API 按需获取资产账号的密码用于自动登录、批量巡检等场景。该能力由IntegrationApplication集成应用机制提供管理员先在 JumpServer 中创建应用绑定账号并生成密钥对第三方服务持密钥调用接口换取账号密码全程无需把密码明文存储在自己的系统中。仓库中该功能的核心实现位于接口视图apps/accounts/api/account/application.py数据模型apps/accounts/models/application.py参数校验序列化器apps/accounts/serializers/account/service.py路由注册apps/accounts/urls.pyrouter.register(rintegration-applications, ...)官方 SDK 示例Go 版位于 apps/accounts/demos/go/1.1 接口基本信息项目内容请求方式GET接口路径api/v1/accounts/integration-applications/account-secret/返回格式JSON认证方式HTTP SignatureHMAC-SHA256请求参数asset资产名称必填、account账号名称必填响应示例{ id: 72b0b0aa-ad82-4182-a631-ae4865e8ae0e, secret: 123456 }其中id为发起请求的集成应用服务IDsecret为查询到的账号密码明文。1.2 服务端参数校验不止 asset 与 account值得注意的是从源码看服务端实际支持的查询参数比原文档列出的两个更丰富。序列化器 IntegrationAccountSecretSerializer 定义了四个可选字段参数类型必填说明assetstr条件必填资产名称asset_idUUID条件必填资产 IDaccountstr条件必填账号名称account_idUUID条件必填账号 ID校验规则为account_id一旦提供即直接通过否则asset/asset_id至少提供一个、account/account_id至少提供一个否则返回 400 与提示At least one of the following fields must be provided: ...。因此使用assetaccount名称组合是最直观的调用方式而account_id则提供了更精确的定位手段demo.go 与 jms_pam.go 中均有体现。服务端在 get_account_secret 动作中的完整处理流程为校验参数 → 调用service.get_account(**data)定位账号对应模型方法 get_account支持按名称或 ID 组合查询且账号必须在该应用的accounts绑定列表中→ 写入审计日志IntegrationApplicationLog→ 依据全局开关SECURITY_DISABLE_VIEW_SECRET决定是否返回密码明文。2. 环境要求与准备工作2.1 环境要求编写 Go 版本 SDK 客户端需要Go 1.16标准库crypto/hmac、crypto/sha256、encoding/base64、net/http可选第三方库github.com/google/uuidUUID 校验、gopkg.in/twindagger/httpsig.v1HTTP Signature 签名jms_pam.go 使用2.2 获取 API KeyKEY_ID 与 KEY_SECRET在 JumpServer 的PAM → 应用管理中创建集成应用系统会生成一对凭证KEY_ID应用 ID形如72b0b0aa-ad82-4182-a631-ae4865e8ae0e的 UUIDKEY_SECRET应用密钥36 位随机字符串创建时需绑定允许访问的账号模型中的accounts字段并将来源 IP 加入ip_group白名单默认[*]见 IntegrationApplicationSerializer。密钥可随时在应用中刷新服务端提供GET api/v1/accounts/integration-applications/{id}/refresh-secret/动作调用模型方法refresh_secret()重新生成 36 位随机串application.py。2.3 配置项仓库示例通过环境变量注入配置均有默认值demo.go环境变量默认值说明API_URLhttp://127.0.0.1:8080JumpServer 服务地址API_KEY_ID示例 UUID应用 IDAPI_KEY_SECRET示例密钥应用密钥ORG_ID00000000-0000-0000-0000-000000000002组织 ID通过X-JMS-ORG请求头传递生产环境务必通过环境变量覆盖默认值切勿使用仓库中的示例凭证。3. 签名认证HMAC-SHA256 HTTP SignatureJumpServer 的账号密钥接口采用 HTTP Signature 方案做请求签名防篡改、防重放。核心思想是将请求方法、目标路径与若干请求头拼接成待签名字符串用KEY_SECRET做 HMAC-SHA256 计算Base64 编码后放入Authorization头。3.1 签名串构造规则以 demo.go 为例签名过程分五步第一步准备参与签名的请求头。示例固定签名以下字段(request-target) accept date x-jms-org第二步构造待签名字符串。每行格式为字段名: 值行间以换行符拼接(request-target): get /api/v1/accounts/integration-applications/account-secret/?assetubuntu_dockeraccountroot accept: application/json date: Mon, 09 Sep 2026 02:12:25 GMT x-jms-org: 00000000-0000-0000-0000-000000000002关键细节(request-target)为小写请求方法 空格 完整 URI必须包含 query 参数date使用 RFC 1123 GMT 格式Go 布局字符串Mon, 02 Jan 2006 15:04:05 GMTx-jms-org为组织 ID需与请求头一致。第三步计算签名mac : hmac.New(sha256.New, []byte(c.KeySecret)) mac.Write([]byte(signatureString)) signatureB64 : base64.StdEncoding.EncodeToString(mac.Sum(nil))第四步拼装 Authorization 头authHeader : fmt.Sprintf( Signature keyId%s,algorithmhmac-sha256,headers%s,signature%s, c.KeyID, strings.Join(headersList, ), signatureB64, )headers字段声明参与签名的头列表服务端据此重建签名串。第五步发送请求同时携带Accept: application/json、Date、X-JMS-ORG、X-Source: jms-pam头X-Source用于标识调用来源。3.2 利用第三方库简化签名仓库还提供了使用httpsig库的精简实现 jms_pam.gofunc (c *JumpServerPAM) SignRequest(r *http.Request) error { headers : []string{(request-target), date} signer, err : httpsig.NewRequestSigner(c.KeyID, c.KeySecret, hmac-sha256) if err ! nil { return err } return signer.SignRequest(r, headers, nil) }该版本只需签名(request-target)与date两个字段库会自动生成Authorization头代码更简洁而 demo.go 的手写版本完整展示了签名原理更适合学习与无外部依赖的场景。4. Go 代码实战从最小示例到完整 SDK4.1 最小可运行示例demo.godemo.go 是开箱即用的完整示例核心调用逻辑如下func (c *APIClient) GetAccountSecret(asset, account string) (map[string]interface{}, error) { u, err : url.Parse(c.APIURL) // ... u.Path /api/v1/accounts/integration-applications/account-secret/ q : u.Query() q.Add(asset, asset) q.Add(account, account) u.RawQuery q.Encode() req, err : http.NewRequest(GET, u.String(), nil) // ... 设置 Accept / X-JMS-ORG / Date / X-Source 头 // ... 按第 3 节构造签名并写入 Authorization 头 resp, err : c.Client.Do(req) // ... if resp.StatusCode ! http.StatusOK { return nil, fmt.Errorf(API returned non-200 status: %d, resp.StatusCode) } var result map[string]interface{} if err : json.NewDecoder(resp.Body).Decode(result); err ! nil { return nil, fmt.Errorf(failed to decode response: %v, err) } return result, nil } func main() { client : NewAPIClient() result, err : client.GetAccountSecret(ubuntu_docker, root) if err ! nil { log.Fatalf(Error: %v, err) } fmt.Printf(Result: %v\n, result) }运行方式cd apps/accounts/demos/go API_URLhttp://your-jumpserver:8080 \ API_KEY_IDyour-key-id \ API_KEY_SECRETyour-key-secret \ ORG_IDyour-org-id \ go run demo.go4.2 完整 SDK 封装jms_pam.gojms_pam.go 提供了更工程化的封装适合集成进大型项目包含三个核心抽象1请求对象SecretRequest封装参数与校验逻辑。NewSecretRequest 接收asset、assetID、account、accountID四个参数默认Method为 GETvalidate 实现服务端同样的校验规则——accountID提供则直接通过须为合法 UUID否则要求资产与账号的名称/ID 至少各提供一个非法 UUID 会返回invalid UUID错误。GetQuery 将非空参数编码进 query。2响应对象Secret统一结果解析。FromResponse 在状态码为 200 时解码secret并置valid true非 200 时将原始错误体原样存入Desc便于上层展示服务端错误信息如Account not found。3客户端JumpServerPAM通过NewJumpServerPAM(endpoint, keyID, keySecret, orgID)构造jms_pam.goorgID为空时默认使用00000000-0000-0000-0000-000000000002Send方法负责拼接 URL、设置请求头、签名并发送网络错误同样写入Desc返回而非中断调用。典型调用示例client : NewJumpServerPAM(http://your-jumpserver:8080, keyID, keySecret, ) req, _ : NewSecretRequest(ubuntu_docker, , root, ) secret, err : client.Send(req) if err ! nil { log.Fatal(err) } fmt.Printf(secret%s valid%v\n, secret.Secret, secret.Valid)4.3 与服务端实现对照客户端 SDK 的行为与服务端源码一一对应IntegrationApplicationViewSet.get_account_secret要求RBACPermission权限即调用方必须是通过X-JMS-ORG指定组织内的有效集成应用模型 is_authenticated 返回is_active请求成功会写入 IntegrationApplicationLog记录来源 IP、服务名、账号与资产信息便于审计追溯若settings.SECURITY_DISABLE_VIEW_SECRET开启接口返回的secret为None——这是全局禁用查看密钥策略调用方需据此调整业务逻辑。5. 常见问题FAQQ: API Key 如何获取A: 在 JumpServer 的PAM → 应用管理中创建应用即可生成KEY_ID和KEY_SECRET。创建后需在应用中绑定目标账号并确保调用方 IP 在ip_group白名单内。Q: 请求返回 400 At least one of the following fields must be providedA: 未满足参数组合要求。检查是否提供了asset/asset_id与account/account_id名称与 ID 组合亦可但至少各一个。另外若传了account_id但格式非法非 UUID会提示invalid UUID。Q: 返回 Account not foundA: 账号不存在或该账号未绑定到当前集成应用。请确认应用管理中的绑定账号列表以及asset名称是否与资产名称完全一致。Q: 签名校验失败401A: 重点核对三点date头是否为 RFC 1123 GMT 格式(request-target)是否包含完整 query 且方法为小写getheaders声明顺序与签名串中头的顺序、取值是否完全一致。建议先对照 demo.sh 用 curl 打通再用 Go 复现。Q: 响应中 secret 为 nullA: JumpServer 开启了全局SECURITY_DISABLE_VIEW_SECRET安全策略密钥查看被禁用需要管理员在系统设置中调整。6. 版本历史Changelog版本号变更内容日期1.0.0初始版本2025-02-117. 延伸阅读本主题在仓库中还提供了其他语言的等价示例可对照阅读Pythonapps/accounts/demos/python/demo.py 与 apps/accounts/demos/python/jms_pam/main.pyJavaapps/accounts/demos/java/demo.javaNode.jsapps/accounts/demos/node/demo.jscurlapps/accounts/demos/curl/demo.sh最适合先验证签名链路各语言示例的 README 与代码文件结构一致签名规则完全相同理解了本文的 Go 实现即可举一反三。【免费下载链接】jumpserverJumpServer is an open-source Privileged Access Management (PAM) platform that provides DevOps and IT teams with on-demand and secure access to SSH, RDP, Kubernetes, Database and RemoteApp endpoints through a web browser.项目地址: https://gitcode.com/GitHub_Trending/ju/jumpserver创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表