JSON Web 令牌 (JWT)

JSON Web 令牌 (JWT) 用于安全地传输格式化为 JSON 对象的认证信息。

由于 JWT 由签发者进行数字签名,因此可以通过验证签名来将其用于认证目的,而不必向 Db2®公开密码。 JWT 中的声明标识用户的身份 Db2

通常情况下,当用户通过应用程序登录时,由身份提供商(IDP)产品生成 JWT,不过个别应用程序也有可能自己创建 JWT。 Db2 可以验证 JWT ,但不提供生成 JWT 的方法。

JWT 工作流程的图

必须在令牌中的“iss”声明下识别 JWT 的签发者。 在令牌配置文件 (db2token.cfg) 中,JWT_IDP_ISSUER 参数必须包含签发者的完全匹配项,才能找到用于验证 JWT 签名的密钥。 使用类型为 PKCS#12 (*.p12) 的本地密钥库文件来保存密钥,您必须在令牌配置文件中配置该文件的位置。

签名算法是在 JWT 标头中声明。 Db2 支持以下签名算法:
  • 使用 SHA2 的 HMAC(HS256、HS384 和 HS512)
  • 使用 SHA2 的 RSASSA-PKCS1-v1(RS256、RS384 和 RS512)
  • 使用 SHA256 的 ECDSA P-256 (ES256)
  • 使用 SHA384 的 ECDSA P-384 (ES384)
  • 使用 SHA512 的 ECDSA P-512 (ES512)
  • Db2 V 11.5.5开始可用:
    • 使用 SHA-256 和含有 SHA-256 的 MGF1 的 RSASSA-PSS (PS256)
    • 使用 SHA-384 和含有 SHA-384 的 MGF1 的 RSASSA-PSS (PS384)
    • 使用 SHA-512 和含有 SHA-512 的 MGF1 的 RSASSA-PSS (PS512)

Db2 不支持加密的 JWT。 通过网络发送时,强烈建议使用 TLS/SSL 来保护 JWT。

要使 Db2 验证使用所指示算法签名的令牌,必须配置相应的密钥。 如果使用 HS256、HS384 或 HS512,那么必须配置先前用来对 JWT 进行签名的私钥。 必须为每种 RSA 签名算法配置含相应公用密钥的证书。 这些密钥的标签在 db2token.cfg 文件中指定。

为了确定令牌持有者的身份, Db2 会检查令牌本身的内容。 在令牌配置文件中,JWT_IDP_AUTHID_CLAIM 参数确定该令牌中的哪个声明包含用户身份。 该请求将作为用户在 Db2. 该声明通常名为“sub”(代表主体集)或“username”,虽然并非必须如此命名。 个别 IDP 通常具备定制它们所生成的 JWT 的能力,甚至可以生成“db2authid”之类的声明。

不会对 authid 声明所识别的值执行任何处理。 例如,如果一个声明识别电子邮件地址,那么该电子邮件地址不会分解为用户名和域组件,而是保持作为一个整体。

JWT 必须在 "exp" 声明中包含到期时间,因为 Db2 不支持撤销方法。 您必须仔细考虑适当的到期时间值。 如果 JWT 已暴露给恶意用户,那么过大的值可能会增加其可被利用的时间范围。 过小的值可能会干扰 Db2 操作。 建立连接之后,该令牌就可以到期,不会有不良后果。 但是,在某些情况下可能会复用该令牌,令牌到期会导致操作无法继续执行。 明确而言:
  • 客户机自动重新路由:重新建立新连接会复用现有令牌,如果该令牌已到期,那么重新建立新连接会失败。
  • 与远程数据源的联邦连接:当配置为单点登录 (SSO) 时,与远程数据源的出站连接会使用用于连接联邦服务器的 JWT。 如果令牌已过期,则连接失败。

通常,生成 JWT 时,还会生成刷新令牌。 Db2 不支持使用刷新令牌来获取新的未到期的 JWT。

Db2 不会从 JWT 获取组信息或其他授权详细信息。 标准组插件用于获取用户的组。

要由 Db2 验证,它必须具备以下属性:

  • 如果令牌标头中有类型声明,其值必须是 JWT。 该声明是可选的,不必存在。
  • db2token.cfg 文件中支持算法的算法声明和适当配置的密钥。
  • db2token.cfg 文件中的签发人相匹配的 iss 索赔。
  • 用于识别用户授权标识的 JWT_IDP_AUTHID_CLAIM 声明。
  • “exp”声明,其中包含一个未到期的值。
  • 与 JWT_IDP_AUDIENCE 中可选择配置的受众值之一相匹配的 "aud "请求。 db2token.cfg

JWT 可以包含其他声明,但会被 Db2.

以下是样本 JWT 标头和声明。

示例标头:
{
   "alg": "RS256",
   "typ": "JWT"
}
示例有效内容:
{
   "username": "admin",
   "sub": "admin",
   "iss": "KNOXSSO",
   "aud": "DSX",
   "role": "Admin",
   "permissions": [
     "administrator",
     "can_provision"
   ],
   "uid": "1000330999",
   "authenticator": "default",
   "display_name": "admin",
   "iat": 1579286619,
   "exp": 1579329819
 }
在本例中,
  • 签发者是 KNOXSSO。
  • JWT 签名算法使用 RS256 -(使用 SHA256 的 RSA 签名)。
  • JWT 的到期时间设置为 12 小时。
  • "username" 声明标识 Db2 授权标识。