Keystone 配置

有关 keystone 管理员的一般 keystone 配置信息和建议。有关完整的 keystone 配置文档和示例配置文件,请参阅主 配置 部分。

排查 Identity 服务的故障

要排查 Identity 服务的故障,请查看 /var/log/keystone/keystone.log 文件中的日志。

使用 /etc/keystone/logging.conf 文件配置日志文件的位置。

注意

insecure_debug 标志是 Identity 服务独有的。如果您启用 insecure_debug,API 中的错误消息将更改为返回安全敏感信息。例如,身份验证失败的错误消息包含有关身份验证失败原因的信息。

日志显示已进入 WSGI 请求的组件,并理想情况下显示一个解释授权请求失败原因的错误。如果您在日志中看不到请求,请使用 --debug 参数运行 keystone。在命令参数之前传递 --debug 参数。

日志

您在 Identity 之外配置日志记录。使用 log_config_append 选项在 /etc/keystone/keystone.conf 文件的 [DEFAULT] 部分中设置指定日志记录配置文件的名称。要通过 syslog 路由日志记录,请在 [DEFAULT] 部分中设置 use_syslog=true

项目中的 etc/logging.conf.sample 文件中提供了一个示例日志记录配置文件。与其他 OpenStack 项目一样,Identity 使用 Python logging 模块,该模块提供了广泛的配置选项,可让您定义输出级别和格式。

特定于域的配置

Identity 服务支持特定于域的 Identity 驱动程序。这些驱动程序允许域拥有自己的 LDAP 或 SQL 后端。默认情况下,特定于域的驱动程序已禁用。

特定于域的 Identity 配置选项可以存储在特定于域的配置文件中,也可以使用 API REST 调用存储在 Identity SQL 数据库中。

注意

在 Kilo 中,将配置选项存储在 SQL 数据库中是实验性的,并在 Liberty 版本中添加到 Identity 服务中。

启用特定于域的配置文件的驱动程序

要启用特定于域的驱动程序,请在 /etc/keystone/keystone.conf 文件中设置以下选项

[identity]
domain_specific_drivers_enabled = True
domain_config_dir = /etc/keystone/domains

当您启用特定于域的驱动程序时,Identity 会在 domain_config_dir 目录中查找名为 keystone.DOMAIN_NAME.conf 的配置文件。没有特定于域的配置文件的域使用主配置文件中的选项。

启用用于将配置选项存储在 SQL 数据库中的驱动程序

要启用特定于域的驱动程序,请在 /etc/keystone/keystone.conf 文件中设置以下选项

[identity]
domain_specific_drivers_enabled = True
domain_configurations_from_database = True

通过 Identity v3 API 指定的任何特定于域的配置选项将覆盖 /etc/keystone/domains 目录中的特定于域的配置文件。

与指定特定于域配置的基于文件的方法不同,通过 Identity API 指定的选项将在无需重新启动 keystone 服务器的情况下生效。为了提高性能,keystone 服务器会缓存域配置选项的当前状态,并且在多进程和多线程 keystone 配置中,新的配置选项可能在缓存超时后才生效。可以在通用的 keystone 配置文件中调整域配置选项的缓存设置(domain_config 组中的 cache_time 选项)。

注意

重要的是要注意,在使用这些方法中的任何一种指定特定于域的配置选项时,仍然会维护主 keystone 配置文件。只有与用户和组的 Identity 驱动程序相关的选项(即,指定此域的驱动程序是 SQL 还是 LDAP,以及,如果是 LDAP,则定义该连接的选项)才以特定于域的方式支持。此外,当通过 Identity API 使用配置选项时,必须将驱动程序选项设置为 LDAP 驱动程序(尝试将其设置为 SQL 驱动程序将在后续使用时生成错误)。

对于已经使用基于文件的域特定配置的现有安装,希望迁移到基于 SQL 的方法,可以使用 keystone-manage 命令将所有配置文件上传到 SQL 数据库

$ keystone-manage domain_config_upload --all

上传后,这些域配置选项将通过 Identity API 可见,并应用于特定于域的驱动程序。也可以通过指定域名上传单个特定于域的配置文件

$ keystone-manage domain_config_upload --domain-name DOMAINA

注意

重要的是要注意,通过启用这些域特定配置方法中的任何一种,不支持列出所有用户和列出所有组的操作,这些调用需要指定域过滤器或使用域范围的令牌。

注意

Keystone 不支持将域的内容(即“其”用户和组)从一个后端移动到另一个后端,也不支持后端边界之间的组 membership。

注意

当使用基于文件的域特定配置方法时,要删除使用特定后端域的域,首先需要禁用它,删除其特定的配置文件(即,其相应的 keystone.<domain_name>.conf),然后重新启动 Identity 服务器。当通过 Identity API 管理配置选项时,可以通过 Identity API 简单地禁用和删除域;因为任何特定于域的配置选项都会自动删除。

注意

虽然 keystone 支持通过上述域特定配置方法使用多个 LDAP 后端,但目前仅支持一个 SQL 后端。这可以是默认驱动程序或单个特定于域的后端,也许是为了在一个主要使用 LDAP 的安装中存储服务用户。

注意

Keystone 已弃用 keystone-manage domain_config_upload 选项。keystone 团队建议通过 API 设置域配置选项。

由于需要用户和组 ID 在 OpenStack 安装中是唯一的,并且 keystone 能够仅从用户或组 ID 推断出要使用哪个域和后端,因此它会从公共 ID 到实际域、后端内本地 ID 和实体类型的持久身份映射表。公共 ID 由 keystone 在第一次遇到实体时自动生成。如果实体的本地 ID 来自不保证生成 UUID 的后端,则哈希算法将为该实体生成公共 ID,这将由 keystone 暴露出来。

使用哈希将确保如果需要重新生成公共 ID,则将生成相同的公共 ID。这对于运行多个 keystone 并希望确保无论您点击哪个服务器,都会生成相同的 ID 很有用。

注意

在 LDAP 后端的情况下,用户的名称和组的名称不会被哈希。因此,这些名称的长度限制为 255 个字符。较长的名称将导致错误。

虽然 keystone 会动态维护身份映射,包括在通过 keystone 删除实体时删除条目,但对于在 keystone 外部管理的实体(例如,只读 LDAP),keystone 不知道实体是否已被删除,因此会继续在其表中携带陈旧的身份映射。虽然无害,但 keystone 允许操作员使用 keystone-manage 命令清除此类陈旧条目的映射表,例如

$ keystone-manage mapping_purge --domain-name DOMAINA --local-id abc@de.com

典型的用法是,操作员获取外部后端中已删除的条目的列表,然后调用 keystone-manage 通过指定域和本地 ID 来清除这些条目。如果需要唯一标识映射,也可以指定实体的类型(即用户或组)。

由于公共 ID 可以使用正确的生成器实现重新生成,因此,如果已删除的条目的详细信息不可用,则可以简单地定期批量清除身份映射,例如

$ keystone-manage mapping_purge --domain-name DOMAINA

将清除 DOMAINA 的所有映射。可以使用以下命令清除整个映射表

$ keystone-manage mapping_purge --all

首次运行生成公共 ID 可能需要一段时间,并且很可能首次通过 API 请求获取用户列表将因超时而失败。为了防止这种情况,应执行 mapping_populate 命令。应在配置 LDAP 后或在 mapping_purge 之后执行此命令。

$ keystone-manage mapping_populate --domain DOMAINA

公共 ID 生成器

Keystone 支持可自定义的公共 ID 生成器,它在配置文件的 [identity_mapping] 部分中指定。Keystone 提供 sha256 生成器作为默认值,它生成可重新生成的公共 ID。公共 ID 的生成器算法是在公共 ID 的密钥大小(即长度)、碰撞概率以及在某些情况下,公共 ID 的安全性之间的平衡。keystone 支持的公共 ID 的最大长度为 64 个字符,默认生成器 (sha256) 使用此完整功能。由于公共 ID 是 keystone 外部暴露的,并且可能存储在外部系统中,因此某些安装可能希望使用具有不同属性权衡的其他生成器算法。可以通过配置以下属性来安装不同的生成器

警告

更改生成器可能会使所有现有的公共 ID 变为无效,因此通常应将生成器选择视为给定安装的不可变。

将特定于域的配置文件迁移到 SQL 数据库

您可以使用 keystone-manage 命令将特定于域的配置文件中的配置选项迁移到 SQL 数据库

# keystone-manage domain_config_upload --all

要从特定的域配置文件上传选项,请指定域名

# keystone-manage domain_config_upload --domain-name DOMAIN_NAME

将 Identity 与 LDAP 集成

OpenStack Identity 服务支持与现有的 LDAP 目录集成,以进行身份验证和授权服务。LDAP 后端需要在配置 OpenStack Identity 服务以与其一起使用之前进行初始化。有关更多信息,请参阅 为 Keystone 设置 LDAP

当配置 OpenStack Identity 服务以使用 LDAP 后端时,您可以拆分身份验证(使用 *identity* 功能)和授权(使用 *assignment* 功能)。OpenStack Identity 仅支持只读 LDAP 集成。

*identity* 功能使管理员能够通过每个域或 OpenStack Identity 服务完全管理用户和组。LDAP 身份后端支持此功能。

*assignment* 功能使管理员能够使用 OpenStack Identity SQL 数据库管理项目角色授权。LDAP 没有 assignment 后端。

Identity LDAP 服务器设置

重要提示

如果您正在使用 SELinux(在 RHEL 派生产品中默认启用),那么为了使 OpenStack Identity 服务能够访问 LDAP 服务器,您必须为 SELinux 启用 authlogin_nsswitch_use_ldap 布尔值,在运行 OpenStack Identity 服务的服务器上。要启用并使选项在重新启动后保持不变,请以 root 用户身份设置以下布尔值

# setsebool -P authlogin_nsswitch_use_ldap on

Identity 配置分为两个单独的后端;身份(用户和组的后端)和分配(域、项目、角色、角色分配的后端)。要配置 Identity,请在 /etc/keystone/keystone.conf 文件中设置选项。有关 Identity 后端配置示例,请参阅 将 Identity 后端与 LDAP 集成。根据需要修改这些示例。

要定义目标 LDAP 服务器

/etc/keystone/keystone.conf 文件中定义目标 LDAP 服务器

[ldap]
url = ldap://
user = dc=Manager,dc=example,dc=org
password = samplepassword
suffix = dc=example,dc=org

虽然不建议这样做(如下注所示),但可以向 url 提供多个 LDAP 服务器,以为单个 LDAP 后端提供高可用性支持。默认情况下,这些将按出现顺序尝试,但可以设置一个额外的选项 randomize_urls 为 true,以便在每个进程(启动时)随机化列表。要指定多个 LDAP 服务器,只需将 url 选项更改为 [ldap] 部分中的逗号分隔的列表

url = "ldap://,ldap://backup.localhost"
randomize_urls = true

注意

LDAP 后端的故障转移机制在切换到下一个工作 LDAP 服务器时可能会导致延迟。随机化服务器尝试的顺序只会使故障行为不依赖于哪个有序服务器发生故障。单个进程仍然可能被延迟或超时,因此这不能解决手头的问题,而只是使故障模式更渐进。由于此原因,建议在 LDAP 服务器前面使用负载均衡器,负载均衡器可以监视集群的状态并立即将连接重定向到工作 LDAP 服务器。

其他 LDAP 集成设置

为单个 LDAP 服务器或多个后端在 /etc/keystone/keystone.conf 文件中设置以下选项,或在 /etc/keystone/domains/keystone.DOMAIN_NAME.conf 文件中设置。每个设置摘要后都出现示例配置

查询选项

  • 使用 query_scope 控制通过 LDAP 呈现的数据的范围级别(仅搜索第一层或搜索整个子树)。

  • 使用 page_size 控制每页的最大结果数。值为零会禁用分页。

  • 使用 alias_dereferencing 来控制查询的 LDAP 解引用选项。

[ldap]
query_scope = sub
page_size = 0
alias_dereferencing = default
chase_referrals =

调试

使用 debug_level 来设置 LDAP 调用中的 LDAP 调试级别。值为零表示未启用调试。

[ldap]
debug_level = 4095

此设置在底层的 python 库中设置 OPT_DEBUG_LEVEL。此字段是一个位掩码(整数),并且可能的标志在 OpenLDAP 手册页中记录。常用的值包括 255 和 4095,其中 4095 更加详细,而 0 则禁用。我们建议在使用此选项时查阅 LDAP 后端的文档。

警告

启用 debug_level 将对性能产生负面影响。

连接池

各种 LDAP 后端使用通用的 LDAP 模块与 LDAP 数据交互。默认情况下,为每个 LDAP 操作建立一个新的连接。当启用 TLS 支持时,这会产生很大的开销,这在企业环境中很可能是一种配置。重复使用来自连接池的连接可以大大减少为每个 LDAP 操作启动新连接的开销。

使用 use_pool 来启用 LDAP 连接池。配置连接池大小、最大重试次数、重连尝试次数、超时时间(-1 表示无限等待)以及秒数内的生存时间。

[ldap]
use_pool = true
pool_size = 10
pool_retry_max = 3
pool_retry_delay = 0.1
pool_connection_timeout = -1
pool_connection_lifetime = 600

用于最终用户身份验证的连接池

LDAP 用户身份验证通过 LDAP bind 操作执行。在大型部署中,用户身份验证可能会消耗连接池中所有可用的连接。OpenStack Identity 提供了专门用于用户身份验证的单独连接池。

使用 use_auth_pool 来启用用于最终用户身份验证的 LDAP 连接池。配置连接池大小和秒数内的生存时间。必须同时启用 use_pooluse_auth_pool 才能为用户身份验证池连接。

[ldap]
use_auth_pool = false
auth_pool_size = 100
auth_pool_connection_lifetime = 60

完成配置后,请重新启动 OpenStack Identity 服务。

警告

在服务重新启动期间,身份验证和授权将不可用。

将 Identity 后端与 LDAP 集成

Identity 后端包含用户、组和组员列表的信息。将 Identity 后端与 LDAP 集成允许管理员使用 LDAP 中的用户和组。

重要提示

为了使 OpenStack Identity 服务访问 LDAP 服务器,您必须在 /etc/keystone/keystone.conf 文件中定义目标 LDAP 服务器。有关更多信息,请参阅 Identity LDAP 服务器设置

要将一个 Identity 后端与 LDAP 集成

  1. /etc/keystone/keystone.conf 文件中启用 LDAP Identity 驱动程序。这允许 LDAP 作为身份后端

    [identity]
    #driver = sql
    driver = ldap
    
  2. 在 LDAP 目录中创建组织单元 (OU),并在 /etc/keystone/keystone.conf 文件中定义相应的路径

    [ldap]
    user_tree_dn = ou=Users,dc=example,dc=org
    user_objectclass = inetOrgPerson
    
    group_tree_dn = ou=Groups,dc=example,dc=org
    group_objectclass = groupOfNames
    

    注意

    这些模式属性是可扩展的,以兼容各种模式。例如,此条目映射到 Active Directory 中的 person 属性

    user_objectclass = person
    

    重新启动 OpenStack Identity 服务。

    警告

    在服务重新启动期间,身份验证和授权将不可用。

要将多个 Identity 后端与 LDAP 集成

  1. /etc/keystone/keystone.conf 文件中设置以下选项

    1. 启用 LDAP 驱动程序

      [identity]
      #driver = sql
      driver = ldap
      
    2. 启用特定于域的驱动程序

      [identity]
      domain_specific_drivers_enabled = True
      domain_config_dir = /etc/keystone/domains
      
  2. 重新启动 OpenStack Identity 服务。

    警告

    在服务重新启动期间,身份验证和授权将不可用。

  3. 使用仪表板或 OpenStackClient CLI 列出域。有关 OpenStackClient 命令列表,请参阅 命令列表

  4. 使用 OpenStack 仪表板或 OpenStackClient CLI 创建域。

  5. 对于每个域,在 /etc/keystone/domains 目录中创建一个特定于域的配置文件。使用文件命名约定 keystone.DOMAIN_NAME.conf,其中 DOMAIN_NAME 是在上一步中分配的域名。

    注意

    /etc/keystone/domains/keystone.DOMAIN_NAME.conf 文件中设置的选项将覆盖 /etc/keystone/keystone.conf 文件中的选项。

  6. /etc/keystone/domains/keystone.DOMAIN_NAME.conf 文件中定义目标 LDAP 服务器。例如

    [ldap]
    url = ldap://
    user = dc=Manager,dc=example,dc=org
    password = samplepassword
    suffix = dc=example,dc=org
    
  7. 在 LDAP 目录中创建组织单元 (OU),并在 /etc/keystone/domains/keystone.DOMAIN_NAME.conf 文件中定义其相应的路径。例如

    [ldap]
    user_tree_dn = ou=Users,dc=example,dc=org
    user_objectclass = inetOrgPerson
    
    group_tree_dn = ou=Groups,dc=example,dc=org
    group_objectclass = groupOfNames
    

    注意

    这些模式属性是可扩展的,以兼容各种模式。例如,此条目映射到 Active Directory 中的 person 属性

    user_objectclass = person
    
  8. 重新启动 OpenStack Identity 服务。

    警告

    在服务重新启动期间,身份验证和授权将不可用。

其他 LDAP 集成设置

为单个 LDAP 服务器或多个后端在 /etc/keystone/keystone.conf 文件中设置以下选项,或在 /etc/keystone/domains/keystone.DOMAIN_NAME.conf 文件中设置。每个设置摘要后都出现示例配置

Filters

使用过滤器来控制通过 LDAP 呈现的数据范围。

[ldap]
user_filter = (memberof=cn=openstack-users,ou=workgroups,dc=example,dc=org)
group_filter =
Identity 属性映射

屏蔽帐户状态值(包括任何其他属性映射),以兼容各种目录服务。多余的帐户使用 user_filter 进行过滤。

设置属性忽略为更新时剥离的属性列表。

例如,您可以在 /etc/keystone/keystone.conf 文件中屏蔽 Active Directory 帐户状态属性

[ldap]
user_id_attribute      = cn
user_name_attribute    = sn
user_mail_attribute    = mail
user_pass_attribute    = userPassword
user_enabled_attribute = userAccountControl
user_enabled_mask      = 2
user_enabled_invert    = false
user_enabled_default   = 512
user_default_project_id_attribute =
user_additional_attribute_mapping =

group_id_attribute     = cn
group_name_attribute   = ou
group_member_attribute = member
group_desc_attribute   = description
group_additional_attribute_mapping =

可以对更复杂的 LDAP 模式进行建模。例如,在用户对象中,来自 RFC2307 的 objectClass posixAccount 非常常见。如果这是底层的 objectClass,那么 uid 字段可能应该是 uidNumber,而 username 字段应该是 uidcn。以下说明了配置

[ldap]
user_id_attribute = uidNumber
user_name_attribute = cn
启用模拟

OpenStack Identity 支持模拟,用于与没有为用户提供 enabled 属性的 LDAP 服务器集成。这允许 OpenStack Identity 宣传 enabled 属性,即使 LDAP 中的用户实体没有提供该属性。必须启用 user_enabled_emulation 选项,并且 user_enabled_emulation_dn 选项必须是有效的 LDAP 组。指定由 user_enabled_emulation_dn 指定的组中的用户将被标记为 enabled。例如,以下内容将标记 enabled_users 组中的任何用户为启用状态

[ldap]
user_enabled_emulation = True
user_enabled_emulation_dn = cn=enabled_users,cn=groups,dc=openstack,dc=org

如果目录服务器有一个 enabled 属性,但它不是布尔类型,可以使用掩码将其转换为布尔类型。当 enabled 属性是一个整数值时,这很有用。以下配置说明了用法

[ldap]
user_enabled_attribute = userAccountControl
user_enabled_mask = 2
user_enabled_default = 512

在这种情况下,该属性是一个整数,并且 enabled 属性列在位 1 中。如果配置的掩码 user_enabled_mask 与 0 不同,它将从 user_enabled_attribute 中检索该属性,并使用 user_enabled_mask 执行加法运算。如果运算之和与掩码匹配,则该帐户将被禁用。

在应用加法运算之前,user_enabled_attribute 的值也会保存在 enabled_nomask 中。这是为了以防需要启用或禁用用户。最后,需要设置 user_enabled_default 以在整数属性上创建一个默认值(512 = Active Directory 中的 NORMAL ACCOUNT)。

完成配置后,请重新启动 OpenStack Identity 服务。

警告

在服务重新启动期间,身份验证和授权将不可用。

保护 OpenStack Identity 服务与 LDAP 后端的连接

我们建议保护 OpenStack Identity 和 LDAP 之间的所有连接。Identity 服务支持使用 TLS 加密 LDAP 流量。在配置此项之前,您必须首先验证您的证书颁发机构文件位于何处。有关更多信息,请参阅 OpenStack 安全指南 SSL 介绍

验证您的证书颁发机构文件位置后

要配置 LDAP 流量上的 TLS 加密

  1. 打开 /etc/keystone/keystone.conf 配置文件。

  2. 找到 [ldap] 部分。

  3. [ldap] 部分中,将 use_tls 配置键设置为 True。这样做将启用 TLS。

  4. 配置 Identity 服务以使用您的证书颁发机构文件。为此,请在 [ldap] 部分中将 tls_cacertfile 配置键设置为证书颁发机构文件的路径。

    注意

    您还可以将 tls_cacertdir(也在 [ldap] 部分中)设置为保存所有证书颁发机构文件的目录。如果同时设置了 tls_cacertfiletls_cacertdir,则后者将被忽略。

  5. 指定对来自 LDAP 服务器的传入 TLS 会话执行的客户端证书检查。为此,请将 tls_req_cert 配置键设置为 demandallownever

    • demand - LDAP 服务器始终接收证书请求。如果未提供证书,或者提供的证书无法针对现有的证书颁发机构文件进行验证,则会终止会话。

    • allow - LDAP 服务器始终接收证书请求。即使未提供证书,会话也会正常进行。如果提供了证书但无法针对现有的证书颁发机构文件进行验证,则该证书将被忽略,会话将正常进行。

    • never - 永远不会请求证书。

完成配置后,请重新启动 OpenStack Identity 服务。

注意

如果无法通过 OpenStack Identity 连接到 LDAP,或者观察到 SERVER DOWN 错误,请将 TLS_CACERT 设置为 /etc/ldap/ldap.conf 中与 [ldap] tls_certificate 部分的 keystone.conf 中的值相同。

在包含 openstack-config 的发行版上,您可以通过运行以下命令来配置 LDAP 流量上的 TLS 加密。

# openstack-config --set /etc/keystone/keystone.conf \
  ldap use_tls True
# openstack-config --set /etc/keystone/keystone.conf \
  ldap tls_cacertfile ``CA_FILE``
# openstack-config --set /etc/keystone/keystone.conf \
  ldap tls_req_cert ``CERT_BEHAVIOR``

其中

  • CA_FILE 是应用于加密 LDAP 流量的证书颁发机构文件的绝对路径。

  • CERT_BEHAVIOR 指定对来自 LDAP 服务器的传入 TLS 会话执行的客户端证书检查(demandallownever)。

缓存层

OpenStack Identity 支持位于可配置子系统(例如,token)之上的缓存层。这使您可以为所有或某些子系统设置缓存。OpenStack Identity 使用 oslo.cache 库,该库允许灵活的缓存后端。大多数缓存配置选项都设置在 /etc/keystone/keystone.conf 文件中的 [cache] 部分中。为了使任何子系统缓存响应,必须将 [cache] 部分的 enabled 选项设置为 True。具有缓存能力的每个部分都将具有一个 caching 布尔值,该值切换该特定子系统的缓存行为。

因此,要仅启用 token 后端缓存,请设置以下值

[cache]
enabled=true

[catalog]
caching=false

[domain_config]
caching=false

[federation]
caching=false

[resource]
caching=false

[revoke]
caching=false

[role]
caching=false

[token]
caching=true

注意

每个子系统默认配置为缓存。但是,全局缓存切换默认设置为 False。只有在启用全局切换的情况下,子系统才能缓存响应。

当前功能后端是

dogpile.cache.null

一个“null”后端,有效地禁用了所有缓存操作。(默认)

dogpile.cache.memcached

使用标准 python-memcached 库的 Memcached 后端。

dogpile.cache.pylibmc

使用 pylibmc 库的 Memcached 后端。

dogpile.cache.bmemcached

使用 python-binary-memcached 库的 Memcached。

dogpile.cache.redis

Redis 后端。

dogpile.cache.dbm

本地 DBM 文件后端。

dogpile.cache.memory

内存缓存,不适合在测试之外使用,因为它不会在其缓存到期时清理其内部缓存,并且不会在进程之间共享缓存。这意味着缓存和缓存失效将不一致或不可靠。

dogpile.cache.memory_pickle

内存缓存,但使用 pickle 库序列化对象。它不适合在测试之外使用。原因是与 dogpile.cache.memory 相同

oslo_cache.mongo

MongoDB 作为缓存后端。

oslo_cache.memcache_pool

使用连接池的 Memcached 后端。

oslo_cache.etcd3gw

使用 etcd 3.x 进行存储。

oslo_cache.dict

基于字典的 DictCacheBackend,不适合在测试环境之外使用,因为它不会在进程之间共享缓存。这意味着缓存和缓存失效不会一致或可靠。

令牌和令牌验证的缓存

令牌子系统是 OpenStack Identity 中使用最广泛的 API。因此,所有类型的令牌都受益于缓存,包括 Fernet 令牌。虽然 Fernet 令牌不需要持久化,但为了获得最佳的令牌验证性能,仍然应该对其进行缓存。

令牌系统有一个单独的 cache_time 配置选项,可以设置为高于或低于全局 expiration_time 默认值,从而允许与 OpenStack Identity 中的其他系统不同的缓存行为。此选项在配置文件中的 [token] 部分设置。

令牌撤销列表的缓存时间由 [token] 部分中的 revocation_cache_time 配置选项处理。每当令牌被撤销时,都会刷新撤销列表。它通常比特定的令牌检索或令牌验证调用接收到更多的请求。

以下是受缓存时间影响的操作列表

  • 获取新的令牌

  • 撤销令牌

  • 验证令牌

  • 检查 v3 令牌

删除令牌 API 调用会使正在操作的令牌的缓存失效,还会使撤销的令牌列表以及验证/检查令牌调用的缓存失效。

令牌缓存可以独立于 revocation_list 缓存进行配置。将过期检查从令牌驱动程序提升到令牌管理器。这确保了缓存的令牌在过期时仍然会引发 TokenNotFound 标志。

为了缓存一致性,所有令牌 ID 在提供程序和令牌驱动程序级别都会被转换为短令牌哈希。某些方法可以访问完整的 ID(PKI 令牌),而某些方法则不能。如果没有令牌 ID 规范化,缓存失效将不一致。

非令牌资源的缓存

各种其他 Keystone 组件都有一个单独的 cache_time 配置选项,可以设置为高于或低于全局 expiration_time 默认值,从而允许与 Identity 服务中的其他系统不同的缓存行为。此选项可以设置为各种部分(例如,[role][resource])的配置文件中。域、项目和角色的创建、更新和删除操作将对上述缓存方法执行适当的失效操作。

有关不同后端(和配置选项)的更多信息,请参阅

缓存失效

使用缓存的一个常见问题是在更新或删除资源后传递不准确的信息。OpenStack Identity 中的大多数子系统在更改后会使特定的缓存条目失效。在无法从缓存中使特定的缓存条目失效的情况下,将使整个缓存区域失效。这将使缓存中的所有条目失效,以防止返回陈旧或误导性的数据。对资源的后续请求将完全处理并缓存。

警告

请注意,如果特定子系统使用只读后端,则缓存不会立即反映后端执行的更改。任何给定的更改可能需要最多 cache_time(如果在配置的子系统部分中设置)或全局 expiration_time(在配置的 [cache] 部分中设置)才能反映出来。如果这种类型的延迟是一个问题,我们建议禁用该特定子系统的缓存。

配置 Memcached 后端示例

以下示例显示了如何配置 memcached 后端

[cache]

enabled = true
backend = dogpile.cache.memcached
backend_argument = url:127.0.0.1:11211

您需要使用 backend_argument 参数指定到达 memcached 实例的 URL。

详细的缓存日志记录

我们不建议在生产系统中默认使用详细的缓存日志记录,因为它非常嘈杂。但是,您可能需要调试缓存问题。查看 Keystone 如何与缓存后端交互的一种方法是增强日志记录。以下配置会将 oslo 和 dogpile 日志聚合到 Keystone 的日志文件中,并增加详细程度

[DEFAULT]
default_log_levels = oslo.cache=DEBUG,dogpile.core.dogpile=DEBUG

[cache]
debug_cache_backend = True

这些日志将包括缓存命中和未命中,从而更容易诊断缓存配置和连接问题。

安全合规性和 PCI-DSS

从 Newton 版本开始,Identity 服务包含额外的安全合规性功能,特别是为了满足支付卡行业 - 数据安全标准 (PCI-DSS) v3.1 要求。有关 PCI-DSS 的更多信息,请参阅 Security Hardening PCI-DSS

安全合规性功能默认情况下被禁用,并且大多数功能仅适用于身份驱动程序的 SQL 后端。其他身份后端,例如 LDAP,应实施自己的安全控制。

通过更改 keystone.conf 中的 [security_compliance] 部分下的配置设置来启用这些功能。

设置帐户锁定阈值

帐户锁定功能限制了不正确的密码尝试次数。如果用户在达到最大尝试次数后未能通过身份验证,该服务将禁用该用户。可以通过使用更新用户 v3 API 调用显式设置启用用户属性来重新启用用户。

您可以通过设置 lockout_failure_attempts 来设置最大数量的失败身份验证尝试

[security_compliance]
lockout_failure_attempts = 6

您可以通过设置 lockout_duration(以秒为单位)来设置用户被锁定的分钟数

[security_compliance]
lockout_duration = 1800

如果您未设置 lockout_duration,则用户将被无限期锁定,直到通过 API 显式启用该用户为止。

您可以确保特定用户永远不会被锁定。这对于服务帐户或管理用户非常有用。您可以通过设置用户选项 ignore_lockout_failure_attempts 来实现此目的。

禁用不活动用户

PCI-DSS 8.1.4 要求在 90 天内删除或禁用不活动的帐户。您可以通过设置 disable_user_account_days_inactive 来实现此目的

[security_compliance]
disable_user_account_days_inactive = 90

上面的示例意味着未通过身份验证(不活动)超过 90 天的用户将自动禁用。可以通过使用 API 显式设置启用用户属性来重新启用用户。

强制用户首次使用时更改密码

PCI-DSS 8.2.6 要求用户在首次使用和管理密码重置时更改其密码。在 Identity 用户 API 中,“创建用户”和“更新用户”被认为是管理密码更改。“更改用户密码”是自助密码更改。启用此功能后,新用户和密码已重置的用户需要在下次身份验证(首次使用)时更改密码,然后才能访问任何服务。

在启用此功能之前,您可能希望豁免一些您不希望强制更改密码的用户。您可以通过设置用户选项 ignore_change_password_upon_first_use 来标记用户为豁免。

警告

未能将服务用户标记为豁免将导致您的服务帐户密码在重置后过期。

准备好后,您可以配置强制用户在首次使用时更改密码,方法是设置 change_password_upon_first_use

[security_compliance]
change_password_upon_first_use = True

配置密码过期

可以通过设置 password_expires_days 来配置密码在一定天数后过期

[security_compliance]
password_expires_days = 90

设置后,任何新的密码更改都将根据密码更改的日期/时间加上此处定义的的天数来确定到期日期。现有密码不受影响。如果您希望现有密码具有到期日期,则需要在数据库中的密码表中运行 SQL 脚本来更新 expires_at 列。

如果存在您不希望其密码过期的用户,Keystone 支持通过用户选项 ignore_password_expiry 来设置。

配置密码强度要求

您可以通过将正则表达式添加到 password_regex 设置来设置密码强度要求

[security_compliance]
password_regex = ^(?=.*\d)(?=.*[a-zA-Z]).{7,}$

上面的示例是一个正则表达式,要求密码具有

  • 一个(1)字母

  • 一个(1)数字

  • 至少七(7)个字符

如果您设置了 password_regex,您应该提供描述您的密码强度要求的文本。您可以通过设置 password_regex_description 来实现此目的

[security_compliance]
password_regex_description = Passwords must contain at least 1 letter, 1
                             digit, and be a minimum length of 7
                             characters.

必须确保 password_regex_description 准确完整地描述 password_regex。如果这两个选项不同步,将导致用户体验受损,因为此描述将返回给用户以解释为什么他们请求的密码不足。

注意

您必须确保 password_regex_description 准确且完整地描述 password_regex。如果这两个选项不同步,帮助文本可能会不准确地描述应用于密码的密码要求。这将导致糟糕的用户体验。

要求唯一的密码历史记录

密码历史记录要求控制了在用户可以重用旧密码之前,用户必须是唯一的密码数量。您可以通过设置 unique_last_password_count 来强制执行此操作

[security_compliance]
unique_last_password_count= 5

上面的示例不允许用户创建一个与他们最后四个密码相同的密码。

同样,您可以设置用户在更改密码之前必须使用密码的天数,方法是设置 minimum_password_age

[security_compliance]
minimum_password_age = 1

在上面的示例中,一旦用户更改了密码,他们将无法在一天之内再次更改密码。这可以防止用户立即更改密码以清除他们的密码历史记录并重用旧密码。

注意

当您设置 password_expires_days 时,minimum_password_age 的值应小于 password_expires_days。否则,用户将无法在密码过期之前更改密码。

禁止自助密码更改

如果存在不应能够通过 Keystone 密码更改 API 更改自己密码的用户,Keystone 支持通过用户选项 lock_password 来设置。

这通常用于密码由 Keystone 外部管理的情况。

性能和可伸缩性

在开始调整 Keystone 的性能和可伸缩性之前,您应该首先知道 Keystone 只是一个两层水平可伸缩的 Web 应用程序,并且扩展它的最有效方法与任何其他类似设计的 Web 应用程序相同:给它更多的进程、更多的内存、水平扩展并负载均衡结果。

话虽如此,有很多机会可以调整 Keystone 的性能,其中许多实际上是性能和安全之间的权衡,您需要自行判断并相应地进行调整。

影响性能的 Keystone 配置选项

这些是 keystone.conf 中所有对性能有直接影响的选项。有关更多详细信息,请参阅这些选项的帮助描述,了解您可能需要自行调整这些选项的方式和原因。

  • [DEFAULT] max_project_tree_depth:减少此数字以提高性能,增加此数字以适应更复杂的层次化多租户用例。

  • [DEFAULT] max_password_length:减少此数字以提高性能,增加此数字以允许更安全的密码。

  • [cache] enable:启用此选项以提高性能,但您还需要配置 [cache] 部分中的其他选项才能实际利用缓存。

  • [token] provider:所有受支持的令牌提供程序主要由性能考虑因素驱动。UUID 和 Fernet 都需要在线验证(可缓存的 HTTP 调用返回到 Keystone 以验证令牌)。Fernet 具有最高的整体可伸缩性特征,但需要更多的工作来验证,因此启用缓存 ([cache] enable) 至关重要。

  • [fernet] max_active_keys:如果您正在使用 Fernet 令牌,请降低此选项以提高性能,增加此选项以支持更高级的密钥轮换策略。

Keystonemiddleware 配置选项,影响性能

此配置实际上位于使用来自 keystone 的令牌验证的服务 Paste 管道中(例如:nova、cinder、swift 等)。

  • cache:当 keystone 的 auth_token 中间件与 swift 缓存一起部署时,使用此选项使 auth_token 中间件与 swift 共享缓存后端。否则,请使用 memcached_servers 选项。

  • memcached_servers:设置此选项以在 keystonemiddleware.auth_token 进程之间共享缓存。

  • token_cache_time:增加此选项以提高性能,减少此选项以更快地响应令牌撤销事件(从而提高安全性)。

  • revocation_cache_time:增加此选项以提高性能,减少此选项以更快地响应令牌撤销事件(从而提高安全性)。

  • memcache_security_strategy:不要设置此选项以提高性能,但如果与其他进程共享 memcached,请设置它以提高安全性。

  • include_service_catalog:禁用此选项以提高性能,如果受保护的服务不需要服务目录。

项目和域的 URL 安全命名

未来,keystone 可能会提供一种通过从层次结构的根目录开始的 URL 样式的命名来识别层次结构中的项目的方法(例如,在身份验证请求中将“projectA/projectB/projectC”指定为项目名称)。为了做好准备,keystone 支持可选地确保项目和域的命名不包含 rfc3986 第 2.2 节中指定的任何保留字符。

可以通过两个配置选项来控制项目和域名称的安全性

[resource]
project_name_url_safe = off
domain_name_url_safe = off

当设置为 off(默认值)时,不会对名称的 URL 安全性进行任何检查。当设置为 new 时,尝试使用不安全的名称创建新项目或域(或更新项目或域的名称为不安全名称)将导致返回状态代码 400(错误请求)。将配置选项设置为 strict 将除了防止创建和更新具有不安全名称的实体之外,还会导致指定不安全的项目或域名称的身份验证尝试返回状态代码 401(未授权)。

建议安装采取必要的步骤,以便尽快将两个选项都设置为 strict

限制列表返回大小

Keystone 提供了一种设置集合中返回的实体数量限制的方法,这对于防止未指定足够窄的筛选器的列表查询产生过长的响应时间非常有用。可以通过在 keystone.conf 的默认部分设置 list_limit 来全局设置此限制,默认情况下不设置任何限制。各个驱动程序部分可以使用特定限制来覆盖此全局值,例如

[resource]
list_limit = 100

如果对 list_{entity} 调用响应已被截断,则响应状态代码仍然是 200(确定),但集合中的 truncated 属性将设置为 true

端点过滤

端点过滤能够为每个项目范围的令牌请求创建临时目录。

[catalog] 部分配置端点过滤器目录驱动程序。例如

[catalog]
driver = catalog_sql

[endpoint_filter] 部分,将 return_all_endpoints_if_no_filter 设置为 False,以便在没有关联时返回一个空目录。例如

[endpoint_filter]
return_all_endpoints_if_no_filter = False

有关 API 定义的详细信息,请参阅 API Specification for Endpoint Filtering

端点策略

端点策略功能提供服务端点与已存储在身份服务器中并通过策略 ID 引用的策略之间的关联。

[endpoint_policy] 部分配置端点策略后端驱动程序。例如

[endpoint_policy]
driver = sql

有关 API 定义的详细信息,请参阅 API Specification for Endpoint Policy