云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

域名备案_cmd连接服务器_新注册优惠

小七 141 0

构建保险库安全插件

Vault是一个用于管理机密的开源工具。前面我们展示了Vault如何提供加密服务,以及newrelic如何信任HashiCorp Vault作为他们的平台。本文通过编写适用于Vault开放源代码和Vault Enterprise的自定义身份验证插件,进一步探讨了对Vault的扩展。»保险库插件由于其安全性,Vault的插件系统采取了额外的步骤,以确保插件在使用前是完全可信的。在上一篇文章中,我们探讨了如何用定制插件扩展Terraform。Vault的插件系统在概念上类似于其他HashiCorp工具,如Terraform和Packer,但增加了额外的预防措施和验证步骤。每个插件都充当一个服务器,Vault对该服务器进行API调用。这是通过一个相互验证的TLS连接完成的,所有这些都在本地计算机上进行。过程如下:Vault管理员在Vault的插件目录中注册插件。注册包括到磁盘上插件二进制文件的路径、插件二进制文件的SHA256校验和、二进制文件的名称,以及可选的要执行的命令(默认为插件的名称)。执行时,Vault会验证插件是否已(按名称)注册到Vault的插件目录中。插件在使用前必须在目录中注册。Vault确保磁盘上插件的校验和与插件目录中注册的校验和相匹配。这可以确保二进制文件在安装后未被篡改或更改。Vault生成插件,向它传递包含TLS证书和私钥的包装令牌。包装的令牌只有一个用途和一个非常小的TTL。该插件展开提供的包装令牌,并对Vault进行API调用以展开提供的令牌。插件提取令牌包装的唯一TLS证书和私钥。该插件使用这些TLS证书和私钥来启动用TLS加密的RPC服务器。Vault和插件通过RPC over TLS使用相互TLS进行通信。需要注意的是,这个过程是由插件包自动处理的。插件作者不需要自己实现这个流。但是,对插件模型有一个基本的了解有助于构建定制的保险库插件。»编写保险库插件以下所有代码示例在GitHub上都是完整的。目前,有三种插件-audit、auth和secrets。审计插件负责管理审计日志。Auth插件负责验证用户或计算机提供的信息,并将该标识映射到策略。Secrets插件负责生成、存储或检索机密。这篇文章的重点是构建一个auth插件,但是这些概念基本上适用于所有三种类型的Vault插件。像大多数软件项目一样,编写Vault插件的第一步是研究。了解正在为其构建Vault插件的API非常重要。此外,您应该标识任何管理身份验证和与Golang(编写保险库插件的语言)中的API交互的客户端库。这个示例帖子实现了一个虚拟身份验证插件,该插件验证用户提供的正确的共享机密代码,因此我们不需要了解上游工具或API的复杂性。在理解了API之后,需要一些样板代码才能开始。这段代码将二进制文件配置为插件,管理上面描述的TLS握手,并提供适当的插件api。函数main(){顶点时间:=&pluginutil.APIClientMeta插件{}标志:=apiClientMeta.FlagSet()标志。解析(操作系统参数[1:])TLS配置:=apiClientMeta.GetTLSConfig()tlsProviderFunc:=pluginutil.VaultPluginTLSProvider(TLS配置)如果错误:=插件。服务(&plugin.ServeOpts插件{后端工厂功能:工厂,TLSProviderFunc:TLSProviderFunc,});呃!=无{日志。致命(错误)}}功能工厂(ctx上下文。上下文,c*logical.BackendConfig) (逻辑后端,错误){//托多返回零,零}首先,创建一个main函数。这是在调用二进制文件时执行的函数。该函数调用Vault的内置插件。服务调用,它构建所有必需的插件api、TLS连接和RPC服务器。BackendFactoryFunc调用本地工厂函数,该函数当前只是一个存根。工厂负责设置和配置插件(有时内部称为"后端"),返回安装过程中发生的任何错误。接下来,创建实际的后端。保险库后端是作为接口实现的,这使得编写我们自己的后端变得很容易。类型backend struct{*框架。后端}功能后端(c*logical.BackendConfig)*后端{var b后端b、 后端=&框架。后端{后端类型:逻辑类型凭证,授权更新:b.pathAuthRenew,特殊路径:&逻辑路径{未经验证:[]string{"login"},},路径:[]*框架.路径{&框架.路径{模式:"登录",字段:映射[字符串]*framework.FieldSchema{"密码":&framework.FieldSchema{类型:框架.TypeString,},},映射:回调[逻辑运算]framework.OperationFunc{逻辑更新操作:b.pathAuthLogin,},},},}返回(&b)}后端结构嵌入标准框架。后端. 这使得我们的后端可以继承几乎所有必需的函数和属性,而无需编写更多的样板代码。后端本身声明其类型-在本例中逻辑类型凭证. 这将告诉Vault后端(插件)是凭据(身份验证)提供程序。因为这是一个auth插件,所以AuthRenew字段是必需的。这指向一个函数,该函数将处理从此后端续订身份验证的请求。注意,我们还没有定义pathAuthRenew函数,所以这段代码还可以编译。Vault中的几乎每个操作都需要身份验证令牌。但是,由于我们正在构建一个auth插件,我们需要告诉Vault允许未经身份验证的请求到达我们的端点。用户还没有令牌(这是我们的auth插件将提供的)。我们将登录端点标记为未经验证,这意味着Vault将不需要Vault令牌来访问此端点。最后,我们定义这个后端将响应的路径。在本例中,只有一个路径登录。大多数后端将有多个路径,每个路径具有不同的功能。在路径中,我们定义字段(schema)。这些是Vault期望作为JSON负载的字段。在本例中,我们期望一个字段password作为字符串。最后,我们定义此路径上的回调集合,下面将对此进行更详细的描述。每个路径定义一系列"回调"。回调是请求方法(如"创建"、"读取"、"更新"或"删除")到路径的映射。在上面的示例中,我们映射了逻辑更新操作到pathAuthLogin方法。这将告诉Vault使用解析的架构字段将任何PUT/POST请求路由到pathAuthLogin方法(尚未定义)。需要注意的是,Vault本身处理这些路径的请求解析、身份验证和授权。请注意,我们的插件没有使用策略或其他授权细节。作为插件模型的一部分,Vault在内部对此进行处理。Vault还优雅地处理与插件通信时发生的任何错误。通过这种方式,插件相对简单,因为它们只是在RPC接口上呈现一个API。拱顶本身承担了大部分的重担。要允许代码编译,请截取上面讨论的两种方法:func(b*后端)pathAuthLogin(\上下文。上下文,要求*逻辑请求,d*框架.FieldData) (*逻辑响应,错误){//托多返回零,零}函数(b*后端)pathAuthRenew(ctx上下文。上下文,要求*逻辑请求,d*框架.FieldData) (*逻辑响应,错误){//托多返回零,零}下一节将介绍如何使用pathAuthLogin实现"登录"功能。»实现登录"登录"路径未经验证。插件负责从请求接收有效负载,解析并处理这些信息。如果结果成功,该方法将返回"ok"并包含一些元数据。如果结果不成功,该方法将向用户返回一个错误,该错误将转换为"未经授权"。一旦成功,vaultcore将根据我们的元数据响应处理保险库令牌和策略附件的生成。这个auth插件使用一个共享的秘密值:"super secret password"。如果用户提供正确的密码,则对其进行身份验证。如果用户没有提供正确的密码,则拒绝用户。下面是一些完成此行为的示例代码:func(b*后端)pathAuthLogin(\上下文。上下文,要求*逻辑请求,d*框架.FieldData) (*逻辑响应,错误){密码:=d.Get("密码")(字符串)如果微妙的。恒定的比较([]字节(密码),[]字节("超级机密密码")!=1{返回零,逻辑.ErrPermissionDenied}ttl,错误:=b.SanitizeTTLStr("30s","30s")如果出错!=无{返回nil,err}//撰写回应返回&逻辑响应{授权:&逻辑验证{InternalData:map[string]接口{}{"secret_value":"abcd1234",},策略:[]string{"我的策略","其他策略"},元数据:映射[string]字符串{"水果":"香蕉",},租赁:逻辑租赁期权{TTL:TTL,电话:,可再生能源:真的,},},},无}从字段模式中提取"密码"。这来自于我们在上面定义后端时在path部分中的Fields声明。执行相等性检查,查看用户提供的密码匹配项是否为硬编码密码短语。注意:您不应该在生产中这样做。这只是示例代码。如果密码匹配,则返回逻辑响应我们的元数据在Auth字段中。InternalData是只有auth插件才能访问的数据。其他身份验证后端和用户都不会看到此数据。它很普通