Ocata 系列发布说明

11.0.4

错误修复

  • [bug 1704205] 所有用户和组都需要一个名称。 在此修复之前,Keystone 没有正确地强制执行此规则,对于 LDAP 用户和组而言如此。 现在,Keystone 将忽略没有为其配置使用的 LDAP 属性值的用户和组名称。

  • [bug 1718747] 修复了一个回归,该回归导致删除包含用户的域时出现服务器错误。此错误修复恢复了先前删除域中命名空间的用户的行为。这仅在使用 SQL Identity 后端时适用。

其他说明

  • [bug 1718747] 作为解决身份 SQL 后端中一个回归的一部分,该回归阻止包含用户的域被删除,通知回调已更改,以便仅当身份后端为 SQL 时才删除用户。如果您的自定义身份后端不是只读的,则在 keystone 中删除域将不会删除后端中的用户,除非您的驱动程序具有评估为 true 的 is_sql 属性。

11.0.3

安全问题

  • [bug 1703369] 在之前的版本中,默认 policy.json 文件中 identity:get_identity_provider 规则存在拼写错误。 该规则的默认值与默认规则的默认值(仅限管理员)相同,因此此拼写错误并不明显。 任何自定义此规则的人员都应检查其设置,并确认他们没有复制该拼写错误。 关于此回溯的更多上下文,请参阅 bug 报告。

错误修复

  • [bug 1689616] 在对大型数据集执行令牌刷新时,进行了重大改进。

  • [bug 1687593] 确保用于创建 OAUTH1 请求令牌时使用的 URL 也是验证请求令牌的 URL。

11.0.1

错误修复

  • [bug 1674415] 修复了 keystone 错误消息翻译的问题,当设置了区域设置时,来自 identity API 的任何错误消息都不会发生翻译。

11.0.0

序言

  • 默认的令牌提供程序现在是 Fernet。

  • 已删除 PKI 和 PKIz 令牌格式。 请参阅 其他 说明 以获取更多详细信息。

  • 已删除写入 LDAP 的支持。 请参阅 其他 说明 以获取更多详细信息。

新特性

  • [blueprint allow-expired] 在令牌验证调用 (GET/HEAD  /v3/auth/tokens) 中添加了一个 allow_expired 标志,允许获取已过期的令牌。 这允许在长时间运行的操作中验证令牌。

  • [blueprint password-expires-validation] 令牌响应现在将在 user 对象中包含一个 password_expires_at 字段,可以简要表示为

    {"token": {"user": {"password_expires_at": null}}}
    

    如果启用了 PCI 支持,通过 [security_compliance] 配置选项,则 password_expires_at 字段将填充一个时间戳。 否则,它将默认为 null,表示密码不会过期。

  • [blueprint pci-dss-notifications] CADF 通知现在扩展到 PCI-DSS 事件。 添加了一个 reason 对象到通知中。 reason 对象同时包含一个 reasonType(原因的简短描述)和一个 reasonCode(HTTP 返回代码)。 以下事件将受到影响

    • 如果用户在 X 天内没有更改其密码。 请参阅 [security_compliance] password_expires_days

    • 如果用户在多次身份验证失败后被锁定。 请参阅 [security_compliance] lockout_failure_attempts

    • 如果用户提交的新密码最近被使用过。 请参阅 [security_compliance] unique_last_password_count

    • 如果密码不符合指定的标准。 请参阅 [security_compliance] password_regex

    • 如果用户尝试更改密码过于频繁。 请参阅 [security_compliance] minimum_password_age

    有关更多详细信息,请参阅:事件通知

  • [blueprint pci-dss-password-requirements-api] 添加了一个新的 API (/v3/domains/{domain_id}/config/security_compliance) 以检索密码的正则表达式要求。 具体来说,将返回 [security_compliance] password_regex[security_compliance] password_regex_description。 请注意,只有在启用 PCI 支持时,通过各种 [security_compliance] 配置选项,这些选项才有意义。

  • [blueprint pci-dss-query-password-expired-users] 在 /v3/users/v3/groups/{group_id}/users 中添加了一个 password_expires_at 查询。 password_expires_at 查询由两部分组成,一个 operator(有效选项如下)和一个 timestamp(格式为 YYYY-MM-DDTHH:mm:ssZ)。 API 将根据给定的 operatortimestamp 过滤用户列表。
    • lt - 密码在时间戳之前过期

    • lte - 密码在或于时间戳之前过期

    • gt - 密码在时间戳之后过期

    • gte - 密码在或于时间戳之后过期

    • eq - 密码在时间戳时过期

    • neq - 密码不在时间戳时过期

  • [blueprint per-user-auth-plugin-reqs] 已实现每个用户的多因素身份验证规则 (MFA 规则)。 这些规则定义了可以使用哪些身份验证方法(例如,密码、TOTP),并提供了要求使用多种身份验证形式才能成功获取令牌的能力。

    MFA 规则通过用户创建和更新 API (POST/PATCH /v3/users) 调用设置;这些选项允许管理员强制用户使用特定的身份验证形式或身份验证形式的组合来获取令牌。 规则的指定方式如下

    user["options"]["multi_factor_auth_rules"] = [["password", "totp"], ["password", "custom-auth-method"]]
    

    规则指定为列表的列表。 子列表的元素必须是字符串,旨在镜像所需的身份验证方法名称(例如,passwordtotp 等),如在 keystone.conf 文件中的 [auth] methods 选项中定义。

    每个方法列表指定一个规则。 如果用户提供的身份验证方法匹配(或超过)列表中的身份验证方法,则使用该规则。 找到的第一个匹配规则(规则不会按特定顺序处理)将被使用。 如果用户具有定义为 [["password", "totp"]] 的规则集,则用户必须提供密码和 totp 身份验证方法(并且两种方法都必须成功)才能接收令牌。 但是,如果用户具有定义为 [["password"], ["password", "totp"]] 的规则集,则用户可以单独使用 password 方法,但如果指定了 totp,则需要同时使用 passwordtotp

    未在 keystone.conf[auth] methods 选项中定义的任何身份验证方法在处理规则时将被忽略。 不允许空规则。 如果由于其中不存在有效的身份验证方法而导致规则为空,则该规则将在身份验证时被丢弃。 如果没有规则或没有有效的规则,则身份验证以默认方式发生:任何单个配置的身份验证方法都足以接收令牌。

    在用户应免除 MFA 规则的情况下,无论是否设置,都可以通过用户创建和更新 API (POST/PATCH /v3/users) 调用将用户选项 multi_factor_auth_enabled 设置为 False。 如果此选项设置为 False,则 MFA 规则将对该用户被忽略。 任何其他值,除了 False,都将导致处理 MFA 规则;该选项只能是布尔值 (TrueFalse) 或“None”(这将导致默认行为(与 True 相同),但该选项将不再显示在 user["options"] 字典中。

    要标记用户免除 MFA 规则

    user["options"]["multi_factor_auth_enabled"] = False
    

    通常不应在任何 MFA 规则中指定 token 身份验证方法。 token 身份验证方法将包含原始身份验证请求的所有先前身份验证方法,并将匹配适当的规则集。 这是有意的,因为 token 方法用于重新定义/更改活动项目。

    安全信息:MFA 规则仅在通过 V3 身份验证 API 进行身份验证时处理。 如果启用了 V2 Auth,如果用户可以通过 V2 Auth API 进行身份验证,则有可能绕过 MFA 规则。 建议禁用 V2 身份验证以完全执行 MFA 规则。

  • [blueprint shadow-mapping] 联合身份映射引擎现在支持为 federated users 自动配置 projects。 将为用户在指定项目上自动创建一个角色分配。 如果映射中指定的项目不存在,它将在与 identity provider 关联的 domain 中自动创建。 这种行为可以使用映射的 local 部分中的特定语法触发。 有关更多信息,请参阅:映射组合

  • [blueprint support-federated-attr] 添加了新的过滤器到 列出用户 API (GET /v3/users) 以支持查询联合身份属性:idp_idprotocol_idunique_id

  • [bug 1638603] 添加了对 Active Directory 中嵌套组的支持。 添加了一个新的布尔选项 [ldap] group_ad_nesting,默认值为 False。 在使用具有嵌套组的 Active Directory 时启用该选项。 此选项将影响 list_users_in_grouplist_groups_for_usercheck_user_in_group 操作。

  • [bug 1641645] 从 自助更改用户密码 API (/v3/user/$user_id/password) 中删除了 RBAC 保护,这意味着用户现在可以在不指定 X-Auth-Token 标头中的令牌的情况下更改其密码。 此更改将允许密码过期的用户在不需要管理员的情况下更新其密码。

  • [bug 1641654] 从 oslo.middlewarehealthcheck 中间件已添加到 keystone 应用程序管道中,默认情况下。 此中间件提供了一种检查 keystone 健康状况的常用方法。 请参阅 keystone-paste.ini 中提供的示例粘贴,以查看如何包含 healthcheck 中间件。

  • [bug 1641816] 现在默认启用 [token] cache_on_issue 选项。 除非启用全局缓存和令牌缓存,否则此选项无效。

  • [bug 1642348] 添加了新的选项 [security_compliance] lockout_ignored_user_ids 以允许部署者指定免除 PCI 锁定规则的用户。

  • [Bug 1645487] 添加了一个新的 PCI-DSS 功能,该功能将要求新用户在使用后立即更改其密码,以及在管理员密码重置后更改其密码。 可以通过将 [security_compliance] change_password_upon_first_use 设置为 True 来启用新功能。

升级说明

  • [blueprint allow-expired] 为了允许长时间运行的操作完成,服务必须能够通过 allow_expired 标志获取过期的令牌。 令牌可检索的时间长度超过其传统到期时间由 [token] allow_expired_window 选项管理,因此数据必须可检索此时间量。 使用 fernet 令牌时,这意味着旧令牌仍然可以解密,因此密钥轮换周期必须超过此时间,以便旧令牌仍然可以解密。 确保不要比 [token] expiration + [token] allow_expired_window 秒更快地轮换 fernet 密钥。

  • [bug 1547684] 对 policy.v3cloudsample.json 示例文件进行了一些小的更改,以便示例文件可以正确加载。 cloud_admin 规则已更改为

    "role:admin and (token.is_admin_project:True or domain_id:admin_domain_id)"
    

    为正确编写的

    "role:admin and (is_admin_project:True or domain_id:admin_domain_id)"
    

    根据需要调整配置工具,详情请参阅 fixes 部分,了解此更改的更多信息。

  • [bug 1561054] 默认令牌提供程序已从 UUID 切换到 Fernet。请注意,Fernet 需要在运行 Ocata 之前建立密钥存储库,可以通过运行 keystone-manage fernet_setup 来完成。此外,对于多节点部署,在升级之前必须使用密钥分发机制。密钥存储库创建后,应将其分发到部署中的所有 keystone 节点。这可确保每个 keystone 节点能够验证部署中颁发的令牌。如果您不想切换令牌格式,则需要在 keystone.conf 中通过设置 [token] provideruuid 来显式设置每个节点中的令牌提供程序。文档可以在 fernet-tokens 找到。

  • [bug 1641654] 来自 oslo.middlewarehealthcheck 中间件默认已添加到 keystone 应用程序管道中。以下部分已添加到 keystone-paste.ini

    [filter:healthcheck]
    use = egg:oslo.middleware#healthcheck
    

    建议将 healthcheck 中间件放在管道中第一个位置

    pipeline = healthcheck cors sizelimit http_proxy_to_wsgi osprofiler ...
    
  • [bug 1641660] [DEFAULT] notification_format 的默认值已从 basic 更改为 cadf。CADF 通知包含有关发起请求的用户的更多信息。

  • [bug 1641660] [DEFAULT] notification_opt_out 的默认值已更改为包含:identity.authenticate.successidentity.authenticate.pendingidentity.authenticate.failed。如果部署依赖于这些通知,则覆盖默认设置。

  • [bug 1642687] 成功升级后,所有现有的 identity providers 现在都将与自动创建的域关联。在 Ocata 发布之前存在的每个 identity provider 现在都将具有 domain_id 字段。新域将具有一个 id(随机 UUID)、一个 name(将与 identity provider ID 匹配),并且默认情况下将 enabled

  • [与 Bug 1649446 相关] identity:list_revoke_events 规则已在两个示例策略文件中(policy.jsonpolicy.v3cloudsample.json)中进行了更改。从

    "identity:list_revoke_events": ""
    

    "identity:list_revoke_events": "rule:service_or_admin"
    

弃用说明

  • [bug 1659995] 新的配置选项 [security_compliance] password_expires_ignore_user_ids 已被弃用,以支持使用通过用户创建和更新 API 调用提供的选项值。

  • [blueprint deprecated-as-of-ocata] 在 Ocata 发布中,目录后端 endpoint_filter.sql 已被弃用,并与 sql 后端合并。建议将 endpoint_filter.sql 目录后端替换为 sql 后端。endpoint_filter.sql 后端将在 Pike 发布中删除。

  • [blueprint deprecated-as-of-ocata] 各种 KVS 后端和配置选项已被弃用,将在 Pike 发布中删除。这包括

    • keystone.common.kvs.backends.inmemdb.MemoryBackend

    • keystone.common.kvs.backends.memcached.MemcachedBackend

    • keystone.token.persistence.backends.kvs.Token

    • keystone.conf 中所有 [kvs] 下的配置选项

    • keystone.conf[memcached] servers 配置选项

关键问题

  • [bug 1561054] 如果升级到 Fernet 令牌,则必须拥有密钥存储库和密钥分发机制,否则令牌验证可能无法正常工作。有关更多详细信息,请参阅升级部分。

安全问题

  • [bug 1650676] 身份验证插件现在需要使用 AuthContext 对象。这增加了安全功能,以确保诸如 user_id 之类的信息不会在服务器处理的身份验证方法之间发生更改。keystone.controllers.Auth.authenticate 方法现在需要将参数 auth_context 设为实际的 AuthContext 对象。

错误修复

  • [bug 1524030] 在令牌验证期间,我们减少了返回的撤销事件数量,仅返回与令牌相关的事件子集。从而提高了整体令牌验证性能。

  • [bug 1651989] 由于 bug 1547684,在使用 policy.v3cloudsample.json 示例文件时,域管理员令牌被视为云管理员。由于 is_admin_project 功能仅支持项目范围的令牌,因此我们自动将任何域范围的令牌的属性 is_admin_project 设置为 False

    [bug 1547684] policy.v3cloudsample.json 示例文件中的一个拼写错误导致 oslo.policy 无法加载该文件。有关更多详细信息,请参阅 upgrades 部分。

  • [bug 1571878] 创建或更新联合身份验证协议时,现在需要有效的 mapping_id。如果 mapping_id 不存在,将返回 400 - Bad Request

  • [bug 1616424] 通过 /v3/OS-OAUTH1/request_token/v3/OS-OAUTH1/access_token API 分别创建 OAuth 请求令牌和 OAuth 访问令牌时,提供更好的异常消息。

  • [bug 1622310] 如果项目或用户(信任人或受托人)已被删除,则信任将被失效。

  • [bug 1636950] 新选项 [ldap] connection_timeout 允许部署者设置用于与 LDAP 服务器的 OPT_NETWORK_TIMEOUT 值。如果 LDAP URL 不正确或连接失败,这将允许 LDAP 服务器返回 SERVER_DOWN 异常。默认情况下,[ldap] connection_timeout 的值为 -1,表示禁用。设置正值(以秒为单位)以启用该选项。

  • [bug 1642457] 处理 Fernet 令牌密钥轮换期间的磁盘写入和 IO 失败。与其创建空密钥,不如正确捕获和记录无法写入磁盘时的错误。

  • [bug 1642687] 通过 OS-FEDERATION API 注册 identity provider 时,现在建议包含一个 domain_id 以与请求中的 identity provider 关联。使用 identity provider 进行身份验证的联合用户现在将与指定的 domain_id 关联。如果未指定 domain_id,则将自动创建一个域。

  • [bug 1642687] 使用 identity provider 进行身份验证的用户现在将具有一个 domain_id 属性,该属性与 identity provider 关联。

  • [bug 1642692] 删除 federation protocol 时,使用 federation protocol 进行身份验证的所有用户也将被删除。

  • [bug 1649138] 当使用 LDAP 作为身份后端时,初始绑定现在将在创建连接对象时发生,即在执行 LDAP 查询时尽早发生,无论绑定是经过身份验证的还是匿名的,以便可以正确且尽早地处理任何连接错误。

  • [Bug 1649446] 列出撤销事件的默认策略已更改。以前,任何经过身份验证的用户都可以列出撤销事件;现在,默认情况下,它仅是管理员或服务用户功能。可以通过修改 keystone 使用的策略文件来更改此设置。

  • [bug 1656076] keystone.controllers.Auth.authenticate 下的各种插件现在需要返回 AuthContext 对象。

  • [bug 1659995] 通过用户创建和更新 API(POST/PATCH /v3/users)调用提供了新的选项,这些选项将允许管理员通过 API 标记用户免于某些 PCI 要求。

    将以下用户属性设置为 TrueFalse 在 API 请求中。要标记用户免于 PCI 密码锁定策略

    user['options']['ignore_lockout_failure_attempts']
    

    要标记用户免于 PCI 密码过期策略

    user['options']['ignore_password_expiry']
    

    要标记用户免于 PCI 重置策略

    user['options']['ignore_change_password_upon_first_use']
    

其他说明

  • [bug 1017606] get_catalogget_v3_catalog 方法的签名 keystone.catalog.backends.base.CatalogDriverBase 已更新。扩展抽象类(CatalogDriverBase)的第三方扩展应根据新的参数名称进行更新。方法签名已更改为

    get_catalog(self, user_id, tenant_id)
    get_v3_catalog(self, user_id, tenant_id)
    

    get_catalog(self, user_id, project_id)
    get_v3_catalog(self, user_id, project_id)
    
  • [bug 1524030] list_events 方法的签名 keystone.revoke.backends.base.RevokeDriverBase 已更新。扩展抽象类(RevokeDriverBase)的第三方扩展应根据新的参数名称更新其代码。方法签名已更改为

    list_events(self, last_fetch=None)
    

    list_events(self, last_fetch=None, token=None)
    
  • [bug 1563101] 令牌提供程序驱动程序接口已从 keystone.token.provider.Provider 移动到 keystone.token.providers.base.Provider。如果实施自定义令牌提供程序,请从新位置进行子类化。

  • [bug 1582585] 添加了一个新的方法 get_domain_mapping_listkeystone.identity.mapping_backends.base.MappingDriverBase。 扩展抽象类 (MappingDriverBase) 的第三方扩展应该实现这个新方法。 该方法具有以下签名

    get_domain_mapping_list(self, domain_id)
    

    并且将返回给定域 ID 的映射列表。

  • [bug 1611102] 从 keystone.endpoint_policy.backends.base.EndpointPolicyDriverBase 抽象类中删除了 list_endpoints_for_policy()get_policy_for_endpoint() 方法,因为它们未使用。

  • [bug 1622310] 在 keystone.trust.backends.base.TrustDriverBase 中添加了一个新的方法 delete_trusts_for_project。 扩展抽象类 (TrustDriverBase) 的第三方扩展应该根据新的参数名称进行更新。 该新方法的签名是

    delete_trusts_for_project(self, project_id)
    
  • [bug 1642687] 更新了 keystone.identity.shadow_backends.base.ShadowUsersDriverBasecreate_federated_user 方法的签名。

    扩展抽象类 (ShadowUsersDriverBase) 的第三方扩展应该根据新的参数名称进行更新。

    该方法签名已更改为

    create_federated_user(self, federated_dict)
    

    create_federated_user(self, domain_id, federated_dict)
    
  • [bug 1659730] 更新了 keystone.auth.plugins.base.AuthMethodHandlerauthenticate 方法的签名。 扩展抽象类 (AuthMethodHandler) 的第三方扩展应该根据新的参数名称更新其代码。 该方法签名已更改为

    authenticate(self, context, auth_payload, auth_context)
    

    authenticate(self, request, auth_payload, auth_context)
    
  • 为了支持 Fernet token,已移除 PKI 和 PKIz token 格式。

  • 为了支持只读,已移除 LDAP 的写入支持。 以下操作不再支持 LDAP

    • 创建 用户

    • 创建

    • 删除 用户

    • 删除

    • 更新 用户

    • 更新

    • 用户 添加到

    • 用户 中移除

  • contrib 扩展的路由和 SQL 后端已被移除,它们已被合并到 keystone 中,不再是可选的。 这会影响

    • keystone/contrib/admin_crud

    • keystone/contrib/endpoint_filter

    • keystone/contrib/federation

    • keystone/contrib/oauth1

    • keystone/contrib/revoke

    • keystone/contrib/simple_cert

    • keystone/contrib/user_crud

  • Keystone 缓存后端已被移除,转而使用其 oslo.cache 对等物。 这会影响

    • keystone/common/cache/backends/mongo

    • keystone/common/cache/backends/memcache_pool

    • keystone/common/cache/backends/noop

  • 为了使用单个方法验证 token (validate_token),其签名是 validate_token(self, token_ref),从抽象类 keystone.token.providers.base.Provider 中删除了几个 token 验证方法(见下文)。 如果使用自定义 token 提供程序,请相应地更新自定义提供程序。

    • validate_v2_token

    • validate_v3_token

    • validate_non_persistent_token

  • 为了使用单个方法颁发 token (issue_token),从抽象类 keystone.token.providers.base.Provider 中删除了几个 token 颁发方法(见下文)。 如果使用自定义 token 提供程序,请相应地更新自定义提供程序。

    • issue_v2_token

    • issue_v3_token

  • 为了支持严格不可变的域 ID,已移除 [DEFAULT] domain_id_immutable 配置选项。

  • 为了始终启用 endpoint policy 扩展,已移除 [endpoint_policy] enabled 配置选项。

  • 为了支持 keystone.auth.plugins.mapped.Mapped 插件,已移除 auth 插件 keystone.auth.plugins.saml2.Saml2

  • 为了使用 Fernet token(不需要持久化),已移除 memcachememcache_pool token 持久化后端。

  • 为了支持 keystone-wsgi-adminkeystone-wsgi-public 脚本,已移除 httpd/keystone.py 文件。

  • 已移除 keystone/service.py 文件,逻辑已移动到 keystone/version/service.py

  • 已移除来自 build_auth_context 中间件的 admin token 检查。 如果您的部署需要使用 admin token,请更新 keystone-paste.ini,以便 admin_token_auth 在 paste 管道中位于 build_auth_context 之前,否则完全从 keystone-paste.ini 中移除 admin_token_auth 中间件。

  • 现在 [assignment] driver 默认值为 sql。 移除确定默认分配驱动程序的逻辑,如果未通过配置提供。 Keystone 仅支持一个分配驱动程序,除非您部署自定义分配驱动程序,否则不应更改它。

  • 现在 [resource] driver 默认值为 sql。 移除确定默认资源驱动程序的逻辑,如果未通过配置提供。 Keystone 仅支持一个资源驱动程序,除非您部署自定义资源驱动程序,否则不应更改它。

  • 已移除 [os_inherit] enabled 配置选项,OS-INHERIT 扩展现在始终启用。

  • 已移除 [DEFAULT] domain_id_immutable 选项。 这消除了更改用户、组和项目的 domain_id 属性的能力。 该行为是在 Mitaka 版本中引入的,现在已被移除。