ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

goidentity 认证身份抽象接口解析:Sliver 仓库中 goidentity.v3 的 Identity 模型与用法

goidentity 认证身份抽象接口解析:Sliver 仓库中 goidentity.v3 的 Identity 模型与用法 网络安全【免费下载链接】sliverAdversary Emulation Framework项目地址https://gitcode.com/gh_mirrors/sl/sliver点击查看免费下载导读goidentity.v3 是 jcmturner 系列 Go 库中负责承载已认证身份authenticated identities及其属性的标准接口层它通过一组统一的Identity接口与Authenticator接口把认证过程与身份数据结构解耦让上层业务如 Kerberos SPNEGO、HTTP 基础认证无需关心具体身份由哪种认证机制产生。本指南以 Sliver 仓库中 vendored 的 goidentity.v3 包 为线索结合其配套的 gokrb5.v7 实现完整讲解Identity/Authenticator接口的字段语义、默认实现User的用法、接入方式以及它在真实认证栈credentials → service → spnego中的调用关系。读完本文你将能够独立实现一个符合该接口的自定义身份类型并理解它在 Kerberos 认证流水线中的位置。包定位一个身份的标准化协议goidentity包本身并不实现任何具体的认证算法它只定义两个核心抽象Identity描述一个经过认证的主体用户/服务及其属性、授权信息的数据接口Authenticator描述某个具体认证机制如何产出一个Identity的统一入口。正如该包 README 所述它提供的是Standard interface to holding authenticated identities and their attributes承载已认证身份及其属性的标准接口。这一设计的价值在于上层服务端代码只需面向接口编程无论底层是 Kerberos、SPNEGO、JWT 还是未来新增的认证方式都可以用同一套代码消费身份信息。从仓库结构看该包位于 implant/vendor/gopkg.in/jcmturner/goidentity.v3/共四个文件identity.go接口定义、authenticator.go认证器接口、user.go默认实现、LICENSEApache-2.0。它由 Sliver 的植入端依赖链gokrb5.v7 → goidentity.v3带入相关依赖记录可分别在 implant/go-mod、implant/go-sum 与 implant/vendor/modules.txt 中查阅。安装与导入按 README 提供的标准方式获取并导入该包go get gopkg.in/jcmturner/goidentity.v3import gopkg.in/jcmturner/goidentity.v3在 Sliver 的 vendor 体系中该包已被 vendored因此植入端编译时无需额外下载Go 1.14 在vendor目录存在且-modvendor生效时自动使用本地副本这也保证了构建的离线可复现性。Identity 接口身份的全部语义identity.go 定义了完整的Identity接口共 30 个方法可归纳为五类语义1. 身份标识Who am I方法含义UserName() string/SetUserName(s string)用户名登录名如aliceDomain() string/SetDomain(s string)域 / Realm如EXAMPLE.COMDisplayName() string/SetDisplayName(s string)显示名在User实现中未设置时回退为用户名Human() bool/SetHuman(b bool)该身份是否代表自然人false 可代表服务账号、机器账户等2. 认证状态How strong is the proof方法含义AuthTime() time.Time/SetAuthTime(t time.Time)认证发生的时刻Authenticated() bool/SetAuthenticated(b bool)是否已完成成功认证Expired() bool凭据是否已过期User与Credentials的实现均以设置了有效截止时间且当前 UTC 时间已超过该时间为判定标准3. 授权属性What can I do方法含义AuthzAttributes() []string返回全部授权属性的名称集合AddAuthzAttribute(a string)添加一个授权属性RemoveAuthzAttribute(a string)移除一个授权属性Authorized(a string) bool判断是否持有某个且被启用的授权属性User实现内部用map[string]bool承载这些属性且额外提供了EnableAuthzAttribute/DisableAuthzAttribute两个方法用于在不删除属性的前提下切换其启用状态见 user.go。因此存在与被授权是两个维度Authorized只有在属性存在且值为true时才返回trueuser.go。4. 会话与通用属性Session extensibility方法含义SessionID() string会话唯一标识NewUser构造时通过github.com/hashicorp/go-uuid生成 UUID若 UUID 生成失败则回退到固定字符串00unique-sess-ions-uuid-unavailable0见 user.goAttributes() map[string]interface{}返回任意键值属性表供扩展字段使用SetAttribute(k, v)/SetAttributes(m)/RemoveAttribute(k)属性表的增、批量替换、删操作这一组方法让Identity既能承载标准字段也能通过Attributes挂载认证机制特有的附加数据如后面 gokrb5 将整个 AD 凭据结构塞入属性表。接口文件顶部还定义了包级常量const ( CTXKey jcmturner/goidentity )CTXKey约定用于在context.Context中存放Identity的键名方便认证中间件把身份注入请求上下文供后续业务代码取用。Authenticator 接口认证机制的统一入口authenticator.go 定义了极简的认证器接口type Authenticator interface { Authenticate() (Identity, bool, error) Mechanism() string // gives the name of the type of authentication mechanism }Authenticate()返回三元组成功时产出Identity布尔值标识认证是否成功error携带失败原因Mechanism()返回该认证机制的名称如krb5-basic用于日志、审计与机制协商。这一接口的意义在于认证的怎么做被完全封装在实现内部消费方只关心得到什么。无论机制如何演进调用方拿到(Identity, bool, error)即可继续处理。默认实现 User开箱即用的身份对象user.go 提供了Identity的默认具体实现User可通过工厂函数快速创建u : goidentity.NewUser(alice)构造时会自动生成会话 UUID并初始化groupMembership授权属性表随后即可用接口方法填充数据u.SetDomain(EXAMPLE.COM) u.SetDisplayName(Alice Anderson) u.SetHuman(true) u.SetAuthTime(time.Now().UTC()) u.SetAuthenticated(true) u.AddAuthzAttribute(admin) u.SetAttribute(ticketID, TGT-12345) fmt.Println(u.Authorized(admin)) // true fmt.Println(u.Expired()) // false需要注意一个从源码可见的实现细节NewUser只初始化了groupMembership与sessionIDattributes字段并未预分配。因此如果先调用SetAttribute会触发对 nil map 的写入 panic正确做法是先通过SetAttributes(make(map[string]interface{}))初始化或在构造后立刻用SetAttributes注入属性表——这一点与 gokrb5 的credentials.Credentials其在构造函数里显式make(map[string]interface{})形成对照见 credentials.go。仓库内的真实实现gokrb5 如何落地这套接口goidentity 的价值需要结合真实实现才能体现。在 Sliver 的 vendor 树中gokrb5.v7 完整实现了这套接口Credentials第二个 Identity 实现credentials.go 中的Credentials结构体实现了goidentity.Identity的全部方法文件内以注释// Methods to implement goidentity.Identity interface明确标注Domain()直接返回 Kerberosrealmcredentials.go认证成功后通过SetAuthTime/SetAuthenticated标记状态PAC特权属性证书解析后把用户的 SID 组信息批量转换为授权属性AddAuthzAttribute并把完整的ADCredentials含 UserID、PrimaryGroupID、LogonTime、LogonDomain 等通过SetAttribute(AttributeKeyADCredentials, adCreds)挂到属性表上credentials.go。这正是标准接口 扩展属性组合的典型用法接口保证统一消费属性表承载机制特有细节。KRB5BasicAuthenticator一个 Authenticator 实现service/authenticator.go 中的KRB5BasicAuthenticator明确声明实现了goidentity.v3.Authenticator接口文件注释KRB5BasicAuthenticator implements gopkg.in/jcmturner/goidentity.v3.Authenticator interface。其Authenticate()流程为解析 HTTP Basic 认证头中的 realm / username / password构造 Kerberos 客户端并执行Login()获取服务票据并解密校验完整性解析 PAC 并将组 SID 等注入Credentials设置AuthTime、Authenticated(true)最终返回(Identity, true, nil)。该实现完整演示了认证器产出标准 Identity的闭环service/authenticator.go。SPNEGO 层从 context 中取出 Identity在 spnego/http.go 中可以看到消费侧用法认证中间件把Credentials以goidentity.Identity类型放入请求上下文键名为CTXKeyCredentials注释明确其为the request context key holding the credentials gopkg.in/jcmturner/goidentity.v2/Identity object业务处理器随后用类型断言取回id : ctx.Value(CTXKeyCredentials).(goidentity.Identity)至此一条完整的链路清晰可见具体认证机制KRB5BasicAuthenticator→ 产出标准 IdentityCredentials→ 注入 contextCTXKey→ 上层以接口消费。任何新增的认证机制只要产出实现goidentity.Identity的对象即可无缝接入这条流水线。在自己的代码中实现自定义身份类型如果默认的User或 gokrb5 的Credentials不满足需求例如要接入 OAuth/OIDC 身份只需实现Identity的 30 个方法即可无需改动任何消费方代码。最小骨架如下type OIDCIdentity struct { subject, issuer string claims map[string]interface{} authed bool exp time.Time } func (o *OIDCIdentity) UserName() string { return o.subject } func (o *OIDCIdentity) SetUserName(s string) { o.subject s } func (o *OIDCIdentity) Domain() string { return o.issuer } func (o *OIDCIdentity) SetDomain(s string) { o.issuer s } // ...其余方法按语义补齐即可再配合一个Authenticator实现type OIDCAuthenticator struct{ /* 客户端配置等 */ } func (a OIDCAuthenticator) Authenticate() (goidentity.Identity, bool, error) { // 执行 OIDC 验证成功后返回 OIDCIdentity return id, true, nil } func (a OIDCAuthenticator) Mechanism() string { return oidc-bearer }这样上层服务无需感知认证机制差异即可统一获得Identity并调用Authenticated()、Authorized()、Expired()等能力做鉴权决策。小结goidentity.v3 用两个精简的接口完成了认证机制与身份模型的解耦Identity定义了身份的标准化视图标识、认证状态、授权属性、会话、扩展属性Authenticator定义了认证机制的接入形态。在 Sliver 的 vendor 依赖链中gokrb5.v7 通过Credentials与KRB5BasicAuthenticator完整落地了这套抽象并在 SPNEGO 层以 context 键CTXKey/CTXKeyCredentials贯穿认证中间件与业务处理器。理解这套接口无论是阅读 Kerberos 认证代码还是接入新认证机制都能事半功倍。相关文件索引goidentity.v3 READMEIdentity 接口定义Authenticator 接口定义User 默认实现gokrb5 Credentials 实现gokrb5 KRB5BasicAuthenticator 实现SPNEGO 中 Identity 的 context 消费赞分享网络安全【免费下载链接】sliverAdversary Emulation Framework项目地址https://gitcode.com/gh_mirrors/sl/sliver点击查看免费下载相关推荐RedwoodJS 接入 Netlify Identity 身份认证从部署、配置到前后端源码解析RedwoodJS 接入 Netlify Identity 身份认证从部署、配置到前后端源码解析 Netlify Identity 是 RedwoodJS 官后端前端Web框架开发工具Litestar 仓库抽象层repository.abc全解析AbstractAsyncRepository 与 AbstractSyncRepository 接口深度指南Litestar 仓库抽象层repository.abc全解析AbstractAsyncRepository 与 AbstractSyncReposito后端Web框架探索Microsoft Identity Web一站式身份认证解决方案探索Microsoft Identity Web一站式身份认证解决方案 项目简介 是Azure Active Directory团队开发的一个开源库旨在简化创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表