ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

MinIO 与 WSO2 Identity Server 集成:通过 STS Client Grants 获取临时凭证

MinIO 与 WSO2 Identity Server 集成:通过 STS Client Grants 获取临时凭证 MinIO 与 WSO2 Identity Server 集成通过 STS Client Grants 获取临时凭证【免费下载链接】minioMinIO is a high-performance, S3 compatible object store, open sourced under GNU AGPLv3 license.项目地址: https://gitcode.com/GitHub_Trending/mi/minio本篇指南基于 MinIO 仓库中的 docs/sts/wso2.md 文档完整讲解如何将开源的WSO2 Identity Server配置为 MinIO 的 OpenID 身份提供商并借助 MinIO STS API 的AssumeRoleWithClientGrants接口获取临时凭证。读者按本文操作后将掌握让 WSO2 签发自包含 JWT id_token、用 Client Credentials 授权类型换取令牌、在 MinIO 侧启用 OpenID 并最终拿到可用于 S3 操作的临时 AccessKey/SecretKey/SessionToken的完整链路。为什么需要把 WSO2 与 MinIO 的 STS 联合起来MinIO 的安全令牌服务STSSecurity Token Service允许客户端不携带 MinIO 的长期管理员凭证而是向身份提供商完成认证后换取一组短期临时凭证再使用这组凭证调用 MinIO API详见 docs/sts/README.md。临时凭证相比长期凭证有三个核心优势它们不必与应用一起落盘存储而是在需要时动态签发它们的生命周期有限默认 1 小时可通过参数伸缩到 15 分钟至 365 天到期后 MinIO 不再识别天然免去轮换与显式吊销应用在分发时无需内嵌 MinIO 默认密钥安全性大幅提升。WSO2 Identity Server 是一个以 Apache Software License Version 2.0 发布的开源身份服务器。当企业内部已有 WSO2 承载 OAuth 2.0 / OpenID Connect 认证时可以将 MinIO 作为受保护资源接入同一套身份体系让应用通过标准 OAuth2 流程先向 WSO2 要 token再向 MinIO 换 STS 临时凭证——这就是本文要打通的身份联合场景。1. 前置条件在开始之前请确保环境满足已安装JAVA 1.8 及以上版本且JAVA_HOME正确指向该 JDK 安装目录WSO2 Identity Server 以 Java 运行已下载并按照 WSO2 官方安装指南完成WSO2 Identity Server的部署与启动。2. 核心概念WSO2 的两种 id_token 风格OAuth 2.0 / OIDC 规范中id_token 主要有两种提供方式不透明标识符型id_token 是一串难以猜解的标识例如足够长的随机字符串。受保护资源服务器收到后需要拿着它去反向查询对应的授权信息。自包含可验证型id_token 把授权信息编码进令牌本身并通过签名保证其完整性——典型代表就是JWT。WSO2 Identity Server默认采用第一种风格签发 UUID 作为 id_token而 MinIO 侧解析并校验的是JWT第二种风格因此接入 MinIO 前必须先把 WSO2 配置为签发自包含的 JWT id_token。从源码角度看MinIO 侧完整的校验链路位于 cmd/sts-handlers.go 与 cmd/sts-datatypes.goAssumeRoleWithClientGrants请求处理与数据结构定义OpenID 发现与密钥校验的实现在 internal/config/identity/openid/ 目录。3. 配置 WSO2 签发自包含的 JWT Access Token打开 WSO2 的配置文件IS_HOME/repository/conf/identity/identity.xml在OAuth元素下找到以下条目并取消注释IdentityOAuthTokenGeneratororg.wso2.carbon.identity.oauth2.token.JWTTokenIssuer/IdentityOAuthTokenGenerator修改完成后重启 WSO2 Identity Server使配置生效。此后 WSO2 下发的 id_token 即变为自包含的 JWT。3.1 配置 OAuth Service Provider服务提供商接下来需要在 WSO2 中配置一个OAuth service provider服务提供商代表将接入的客户端应用步骤概要如下在服务提供商Service Provider配置区中展开Inbound Authentication Configurations→OAuth/OpenID Connect Configuration复制其中的OAuth Client Key作为下文中令牌请求里的CLIENT_ID复制其中的OAuth Client Secret作为下文中令牌请求里的CLIENT_SECRET。3.2 通过 Client Credentials Grant 请求 id_tokenWSO2 支持多种 OAuth 2.0 授权类型grant type。对一个机器对机器的应用来说最典型的做法是使用Client Credentials Grant应用直接用CLIENT_ID:CLIENT_SECRET向 WSO2 换取令牌无需用户参与交互。请求命令模板如下curl -u CLIENT_ID:CLIENT_SECRET -k -d grant_typeclient_credentials -H Content-Type:application/x-www-form-urlencoded https://IS_HOST:IS_HTTPS_PORT/oauth2/token其中占位符的含义与默认值如下占位符说明默认值CLIENT_IDOAuth Client Key见上文 3.1 节—CLIENT_SECRETOAuth Client Secret见上文 3.1 节—IS_HOSTWSO2 所在主机localhost若使用公网 IP需填对应 IP 或域名IS_HTTPS_PORTWSO2 HTTPS 端口9443若配置过端口偏移量 n则需相应增大 n真实请求示例curl -u PoEgXP6uVO45IsENRngDXj5Au5Ya:eKsw6z8CtOJVBtrOWvhRWL4TUCga -k -d grant_typeclient_credentials -H Content-Type:application/x-www-form-urlencoded https://localhost:9443/oauth2/token其中-k表示跳过 TLS 证书校验本地自签名证书场景下使用。成功后WSO2 返回的响应中即包含自包含 JWT形如下文所示{ id_token: eyJ4NXQiOiJOVEF4Wm1NeE5ETXlaRGczTVRVMVpHTTBNekV6T0RKaFpXSTRORE5sWkRVMU9HRmtOakZpTVEiLCJraWQiOiJOVEF4Wm1NeE5ETXlaRGczTVRVMVpHTTBNekV6T0RKaFpXSTRORE5sWkRVMU9HRmtOakZpTVEiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiJQb0VnWFA2dVZPNDVJc0VOUm5nRFhqNUF1NVlhIiwiYXpwIjoiUG9FZ1hQNnVWTzQ1SXNFTlJuZ0RYajVBdTVZYSIsImlzcyI6Imh0dHBzOlwvXC9sb2NhbGhvc3Q6OTQ0M1wvb2F1dGgyXC90b2tlbiIsImV4cCI6MTUzNDg5MTc3OCwiaWF0IjoxNTM0ODg4MTc4LCJqdGkiOiIxODQ0MzI5Yy1kNjVhLTQ4YTMtODIyOC05ZGY3M2ZlODNkNTYifQ.ELZ8ujk2Xp9xTGgMqnCa5ehuimaAPXWlSCW5QeBbTJIT4M5OB_2XEVIV6p89kftjUdKu50oiYe4SbfrxmLm6NGSGd2qxkjzJK3SRKqsrmVWEn19juj8fz1neKtUdXVHuSZu6ws_bMDy4f_9hN2Jv9dFnkoyeNT54r4jSTJ4A2FzN2rkiURheVVsc8qlm8O7g64Az-5h4UGryyXU4zsnjDCBKYk9jdbEpcUskrFMYhuUlj1RWSASiGhHHHDU5dTRqHkVLIItfG48k_fb-ehU60T7EFWH1JBdNjOxM9oN_yb0hGwOjLUyCUJO_Y7xcd5F4dZzrBg8LffFmvJ09wzHNtQ, token_type: Bearer, expires_in: 3600 }4. 理解 JWT ClaimsMinIO 如何读取令牌中的信息上述响应里的id_token是一个已签名的 JWT。将其放入任意 JWT 解码器解析 payload 后可以看到如下 claims它们共同决定了这次身份联合会话的属性Claim 名称类型Claim 值含义issstringJWT 的签发者。返回的是 Resident Identity Provider 中 OAuth2/OpenID Connect Inbound Authentication 配置的 Identity Provider Entity Id 值。audstring array令牌的目标受众列表携带该 JWT 所面向的 OAuth 客户端的 client identifier。azpstring令牌发放给哪个被授权方携带该令牌所签发给的 OAuth 客户端的 client identifier。iatinteger令牌签发时间。expinteger令牌过期时间。jtistring该 JWT 的唯一标识符。policystring要应用到 STS 临时凭证上的canned policy预置策略名称。推荐在 WSO2 侧为 service provider 配置该自定义 claim。拿到上述id_token后即可向 MinIO 发起 STS 请求换取临时凭证。MinIO 的 STS API 通过 JWT 中的iss定位对应的 OpenID 提供方并借助其公开的 JSON Web Key SetJWKS端点来校验 JWT 是否有效、签名是否正确。关于policyclaim原始文档强调强烈建议将policy作为 service provider 的自定义 claim 进行配置。在 WSO2 中可通过服务提供商的 Claims 配置以及 JWT Bearer Grant Type 的自定义 claims 处理能力来完成映射。而 MinIO 侧默认就是从policy这个 claim 名取值若要改用其他名称例如把角色、组名作为 claim当前仓库源码中对应的是 OpenID 配置的claim_name键见 internal/config/identity/openid/help.go 中对该键的描述JWT canned policy claim name。需要注意的是如果最终通过 claim 或服务端配置都无法确定任何策略签发出来的临时凭证将不具备任何权限应用调用时会收到 Access Denied。5. 配置 MinIO指向 WSO2 的 OpenID Discovery 端点MinIO 服务器通过环境变量MINIO_IDENTITY_OPENID_CONFIG_URL感知身份提供方该变量接受单个 OpenID 配置地址。WSO2 暴露的标准 OIDC discovery 文档路径为https://IS_HOST:IS_HTTPS_PORT/oauth2/oidcdiscovery/.well-known/openid-configuration同时还需要通过MINIO_IDENTITY_OPENID_CLIENT_ID指定该应用对应的客户端 ID。完整启动示例export MINIO_IDENTITY_OPENID_CONFIG_URLhttps://localhost:9443/oauth2/oidcdiscovery/.well-known/openid-configuration export MINIO_IDENTITY_OPENID_CLIENT_ID843351d4-1080-11ea-aa20-271ecba3924a minio server /mnt/data实现层面的补充说明MinIO 在启动及收到 STS 请求时会先去拉取 discovery 文档config_url 指向的地址。当前源码 internal/config/identity/openid/openid.go 会从 discovery 文档中解析出JWKS URI并用其完成对 JWT 签名的本地校验——若发现 discovery 文档里没有 JWKS URI会直接报错提示例如 no JWKS URI found in your providers discovery doc。这正是本文把 discovery 地址配为 WSO2/oauth2/oidcdiscovery/.well-known/openid-configuration的原因WSO2 在该端点下会正常公布 jwks_uri。6. 使用 client-grants 示例程序请求临时凭证在保证 MinIO 已按 STS 方式启动的前提下仓库 docs/sts/client-grants.go 提供了一个可运行的示例客户端它会先从身份提供商换取 JWT再调用 MinIO 的AssumeRoleWithClientGrantsSTS 接口换取临时凭证。运行方式如下-cid对应CLIENT_ID-csec对应CLIENT_SECRETgo run docs/sts/client-grants.go -cid PoEgXP6uVO45IsENRngDXj5Au5Ya -csec eKsw6z8CtOJVBtrOWvhRWL4TUCga成功后会得到一组由 AccessKey、SecretKey、SessionToken 与过期时间组成的临时凭证例如##### Credentials { accessKey: IRBLVDGN5QGMDCMO1X8V, secretKey: KzS3UZKE7xqNdtRbKyfcWgxBS6P1G4kwZn4DXKuY, expiration: 2018-08-21T15:49:38-07:00, sessionToken: eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJhY2Nlc3NLZXkiOiJJUkJMVkRHTjVRR01EQ01PMVg4ViIsImF1ZCI6IlBvRWdYUDZ1Vk80NUlzRU5SbmdEWGo1QXU1WWEiLCJhenAiOiJQb0VnWFA2dVZPNDVJc0VOUm5nRFhqNUF1NVlhIiwiZXhwIjoxNTM0ODkxNzc4LCJpYXQiOjE1MzQ4ODgxNzgsImlzcyI6Imh0dHBzOi8vbG9jYWxob3N0Ojk0NDMvb2F1dGgyL3Rva2VuIiwianRpIjoiMTg0NDMyOWMtZDY1YS00OGEzLTgyMjgtOWRmNzNmZTgzZDU2In0.4rKsZ8VkZnIS_ALzfTJ9UbEKPFlQVvIyuHw6AWTJcDFDVgQA2ooQHmH9wUDnhXBi1M7o8yWJ47DXP-TLPhwCgQ }这些凭证可以直接用于签名并执行 MinIO 的 S3 API 操作建桶、上传、下载等且默认在 1 小时后自动过期。客户端应用因此无需接触 MinIO 的 Root 凭证——认证身份完全由 WSO2 签发的 JWT 承担MinIO 侧只负责校验与授权。6.1AssumeRoleWithClientGrants的请求参数语义WSO2 场景中调用的是 STS 的AssumeRoleWithClientGrants动作其核心参数在 docs/sts/client-grants.md 中有完整定义理解这些参数有助于排查生产问题Token必填字符串长度 4~2048身份提供商签发的 OAuth 2.0 访问令牌即上文从 WSO2/oauth2/token换到的id_tokenVersion必填字符串固定为2011-06-15为兼容 AWS STS API 文档而沿用DurationSeconds可选整数有效区间 900 ~ 31536000临时凭证有效期秒。默认 3600 秒不指定时则依据 Token 自身的过期时间推算Policy可选字符串长度 1~2048内联会话策略JSON 格式 IAM 策略。会话最终权限 canned policy 与该内联策略的交集无法越权。便捷起见也可以直接构造原生 STS 请求例如形如http://minio.cluster:9000?ActionAssumeRoleWithClientGrantsDurationSeconds3600TokenJWTVersion2011-06-15的 POST响应为 AWS STS 风格的 XML包含CredentialsAccessKeyId、SecretAccessKey、Expiration、SessionToken等元素示例见 docs/sts/client-grants.md 的 Sample Response 小节。7. 权限设计建议与安全要点canned policy 与 claim 联动为 STS 凭证绑定的policy必须是 MinIO 侧已存在的预设策略若希望不同 OAuth 客户端映射不同权限可像第 4 节所述在 WSO2 service provider 上配置自定义policyclaim让 JWT 携带策略名随令牌一起到达 MinIO。最新版本还支持服务端直接通过 OpenID 配置的role_policy键见 internal/config/identity/openid/help.go 中 Set the IAM access policies applicable to this client application and IDP 的描述为某个客户端统一指定策略两者取交集后生效。最小权限原则临时凭证的权限是预置策略 × 会话内联策略的交集请按应用真实需求裁剪切忌为 STS 客户端配置过宽的策略。凭证分发安全STS 的价值在于无需在客户端内置长期密钥。应用只需持有 WSO2 侧派发的client_id/client_secret即可随时按需换发新的临时凭证。过期即失效临时凭证到期后 MinIO 不再认可无需手动吊销应用应在到期前或发现 403/过期错误时重新走一遍WSO2 换 JWT → MinIO 换 STS 凭证的流程。进一步阅读docs/sts/client-grants.mdAssumeRoleWithClientGrants的完整参数表、样例 POST 与 XML 响应docs/sts/README.mdMinIO STS 快速入门与 WebIdentity / AD-LDAP / AssumeRole 等不同身份联合方式总览docs/sts/web-identity.md面向浏览器的 WebIdentityOIDC 授权码流联合指南internal/config/identity/openid/help.goOpenID 身份提供方全部配置键config_url、client_id、role_policy、claim_name、scopes 等的官方说明。【免费下载链接】minioMinIO is a high-performance, S3 compatible object store, open sourced under GNU AGPLv3 license.项目地址: https://gitcode.com/GitHub_Trending/mi/minio创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表