配置 keystone 作为联合服务提供商

在 OpenStack-Ansible 中,keystone 的默认安装使用 Apache 和 uWSGI。将 keystone 配置为联合服务提供商的额外配置会添加 Apache mod_shibmod_auth_openidc,并将其配置为响应来自客户端的特定身份验证请求位置。

注意

有替代的联合实施方法,但目前仅支持基于 SAML2 的联合,通过 mod_shib 使用 Shibboleth SP,或基于 OIDC 的联合,通过 mod_auth_openidc 在 Openstack-Ansible 中支持。目前仅支持这些 apache 模块中的一个,并且 keystone_sp.trusted_idp_list 中只有一个受信任的 IdP。

当请求发送到这些位置时,Apache 会将请求交给 shibd 守护进程或 mod_auth_openidc 模块。

注意

交接仅发生在与身份验证相关的请求时。

使用 keystone_sp 配置服务提供商

keystone_sp 是一个字典变量,其中包含描述 SP 和其信任的 IdP 的各种设置。keystone_sp 中所需的值在基于 Shibboleth SAML 的部署和基于 OIDC mod_auth_openidc 的部署之间略有不同。

以下设置可用于配置 SAML 或 OIDC 部署的服务提供商 (SP)

  1. apache_mod 可用于在 mod_shib 和 mod_auth_openidc 之间切换。如果未定义或拼写错误,则默认使用 Shibboleth。有效值为 ‘shibboleth’ 或 ‘mod_auth_openidc’。(可选)

  2. cadf_notifications 切换云审计数据联合 (CADF) 通知。默认情况下这些是关闭的。有效值为 true 或 false。更多信息请参见 keystone 开发人员文档

  3. cadf_notifications_opt_out 忽略在启用 CADF 通知时生成某些 CADF 通知。keystone 文档建议选择退出:identity.authenticate.success、identity.authenticate.pending 和 identity.authenticate.failed 通知,因为它们会产生大量噪音。

  4. trusted_dashboard_list 是 keystone 接受 Web 单点登录重定向的受信任 URL 列表。此设置可确保 keystone 仅将令牌数据发送回受信任的服务器。这是作为一种预防措施,特别是为了防止中间人 (MITM) 攻击。此列表包含 horizon 显示的所有 URL,并以 /auth/websso/ 后缀,这是 horizon WebSSO 组件的路径。trusted_dashboard_list 可能包含 IP 地址和/或 DNS 名称。

  5. trusted_idp_list 是一个字典属性,包含对应于 SP 的每个受信任 IdP 的设置列表。

以下是可以设置在 trusted_idp_list 中的条目的属性。请注意,虽然 trusted_idp_list 是一个列表,但当前它只能支持一个条目。

  1. name 是在 Keystone 中使用的 IdP 名称,也是 Horizon 中 IdP 下拉菜单中默认显示的名称。

  2. display_name 如果您的名称属性不便于用户使用,则可以为您的 IdP 在 Horizon 上显示的替代名称。(可选)

  3. domain_id 是将创建 IdP 的域。如果未在创建新 IdP 时设置此项,则将自动生成一个具有随机 ID 的新域。将此域与 IdP 关联。

  4. entity_ids 是一个引用实体 ID 列表。这指定了

    在验证到 IdP 时,将登录请求重定向到 SP 的方式。

  5. federated_identities 是域、项目、组和用户的映射列表。有关更多信息,请参见 配置身份服务 (keystone) 映射

  6. protocols 是 IdP 支持的协议列表,以及每个协议的映射和属性集。这仅支持名称为 saml2openid 的协议。

  7. mapping 是联合用户的本地到远程映射配置。有关更多信息,请参见 配置身份服务 (keystone) 映射

使用 Shibboleth 的 SAML 服务提供商配置

除了上述 keystone_sp 中的属性外,以下属性可以设置为基于 Shibboleth SAML 的部署的 trusted_idp_list 中的条目。

  1. cert_duration_years 指定 SP 签名证书的有效期限(例如,/etc/shibboleth/sp-key.pem)。

  2. metadata_uri 是 IdP 元数据的所在位置。这为 SP 提供签名密钥和 IdP 支持的所有端点。

  3. metadata_file 是本地缓存元数据的文件名,该文件名将存储在 /var/cache/shibboleth/ 中。

  4. metadata_reload 是元数据刷新轮询之间的秒数。

  5. protocols.attributes 添加到 Shibboleth 属性映射目录。有关更多信息,请参见 配置身份服务 (keystone) 映射

以下是设置 keystone 作为使用 Shibboleth 的 SAML 服务提供商到 IdP 的 keystone_sp 示例,并启用 CADF 通知。

keystone_sp:
  apache_mod: 'shibboleth'
  cert_duration_years: 5
  cadf_notifications: true
  cadf_notifications_opt_out:
    - identity.authenticate.failed
    - identity.authenticate.pending
    - identity.authenticate.success
  trusted_dashboard_list:
    - "https://{{ external_lb_vip_address }}/auth/websso/"
    - "https://{{ horizon_server_name }}/auth/websso/"
  trusted_idp_list:
    - name: 'testshib-idp'
      entity_ids:
        - 'https://idp.testshib.org/idp/shibboleth'
      metadata_uri: 'http://www.testshib.org/metadata/testshib-providers.xml'
      metadata_file: 'metadata-testshib-idp.xml'
      metadata_reload: 1800
      federated_identities:
        - domain: default
          project: fedproject
          group: fedgroup
          role: member
      protocols:
        - name: saml2
          mapping:
            name: testshib-idp-mapping
            rules:
              - remote:
                  - type: eppn
                local:
                  - group:
                      name: fedgroup
                      domain:
                        name: Default
                  - user:
                      name: '{0}'

通过以下文件处理 shibd 服务配置,这些文件位于 keystone 容器中的 /etc/shibboleth/

  • sp-cert.pemsp-key.pemos-keystone-install.yml 播放手册

    使用在第一个 keystone 容器上生成的这些文件将它们复制到其他 keystone 容器。SP 和 IdP 在通信中使用这些文件作为签名凭据。

  • shibboleth2.xmlos-keystone-install.yml 播放手册写入文件的内容,基于 /etc/openstack_deploy/user_variables.yml 文件中 keystone_sp 属性的配置结构。它包含受信任的 IdP 列表、SP 已知的 entityID 以及其他促进配置。

  • attribute-map.xmlos-keystone-install.yml 播放手册写入文件的内容,基于 /etc/openstack_deploy/user_variables.yml 文件中 keystone_sp 属性的配置结构。它包含适用于任何基本的 Shibboleth 类型 IdP 设置的默认属性映射,还包含在 keystone_sp 属性结构中设置的任何其他属性映射。

  • shibd.logger:OpenStack-Ansible 不会更改此文件。在排查联合身份验证问题或发现 IdP 发布但您的 SP 属性映射当前未理解的属性时,此文件很有用。要启用调试日志记录,请将 log4j.rootCategory=INFO 更改为 log4j.rootCategory=DEBUG 在文件的顶部。日志文件输出到 /var/log/shibboleth/shibd.log

使用 Shibboleth 的 keystone-to-keystone (k2k) 服务提供商配置

请设置以下属性

  1. keystone_public_endpoint 默认情况下自动设置为公共端点的 URI。这执行重定向并确保令牌引用指向公共端点。

  2. horizon_keystone_endpoint 默认情况下自动设置为 keystone 的公共 v3 API 端点 URL。基于 Web 的单点登录 horizon 需要使用 keystone v3 API。此值必须使用在端点 SSL 证书中注册的相同 DNS 名称或 IP 地址。

  3. 如果 IdP 是 ADFS,则 keystone 端点必须具有 HTTPS 公共端点。keystone 或 SSL 卸载负载均衡器提供该端点。

  4. keystone_service_publicuri_proto 设置为 https。这可确保 keystone 在其引用中发布 https,并确保 Shibboleth 配置为知道它期望断言中的 SSL URL(否则它将使断言无效)。

  5. 大多数专业的 IdP,例如 ADFS 和 Google,要求受信任的 SP 具有受信任的证书,该证书不是自签名证书。

  6. 在使用 keystone 端点的 SSL 时,请确保端点 URI 和证书匹配。例如,如果证书没有端点的 IP 地址,则必须使用在证书上注册的适当名称发布该端点。在使用 DNS 名称作为 keystone 端点时,keystone_public_endpointhorizon_keystone_endpoint 必须都设置为使用 DNS 名称。

  7. horizon_endpoint_type 必须设置为 publicURL,以确保 horizon 在所有引用和查询中使用公共端点。

以下是设置 keystone 作为使用 Shibboleth 的 SAML 服务提供商到 keystone IdP 的 keystone_sp 示例,并启用 CADF 通知。对于 k2k,trusted_dashboard_list 可能包含来自多个云的 Horizon 条目。

keystone_sp:
  apache_mod: 'shibboleth'
  cert_duration_years: 5
  cadf_notifications: true
  cadf_notifications_opt_out:
    - identity.authenticate.failed
    - identity.authenticate.pending
    - identity.authenticate.success
  trusted_dashboard_list:
    - "https://{{ horizon_server_name }}/auth/websso/"
    - "https://{{ external_lb_vip_address }}/auth/websso/"
  trusted_idp_list:
    - name: "keystone-idp"
      entity_ids:
         - 'https://keystone-idp:5000/v3/OS-FEDERATION/saml2/idp'
      metadata_uri: 'https://keystone-idp:5000/v3/OS-FEDERATION/saml2/metadata'
      metadata_file: 'metadata-keystone-idp.xml'
      metadata_reload: 1800
      federated_identities:
        - domain: default
          project: fedproject
          group: fedgroup
          role: member
      protocols:
        - name: saml2
          mapping:
            name: keystone-idp-mapping
            rules:
              - remote:
                  - type: openstack_user
                local:
                  - group:
                      name: fedgroup
                      domain:
                        name: Default
                    user:
                      name: '{0}'
          attributes:
            - name: openstack_user
              id: openstack_user
            - name: openstack_roles
              id: openstack_roles
            - name: openstack_project
              id: openstack_project
            - name: openstack_user_domain
              id: openstack_user_domain
            - name: openstack_project_domain
              id: openstack_project_domain

使用 mod_auth_openidc 的 OIDC 服务提供商配置

除了先前定义的 keystone_sp 中的通用属性外,以下属性可以设置为基于 mod_auth_openidc OIDC 的部署的 trusted_idp_list 中的条目。

  1. oidc_provider_metadata_url 可以在其中找到 OpenID Connect 提供商元数据的 URL。

  2. oidc_client_id 是调用静态配置的 OpenID Connect 提供商时使用的客户端标识符。

  3. oidc_client_secret 是调用静态配置的 OpenID Connect 提供商时使用的客户端密钥。

  4. oidc_crypto_passphrase 加密密码用于加密状态 cookie 和 mod_auth_openidc 中的缓存条目。Mod_auth_openidc 的文档未指定此密码的任何格式或限制。应将其设置为随机生成的合理长度的字符串。

  5. oidc_redirect_path 是 redirect_uri 的路径组件,用于此 OpenID Connect 客户端;这是一个虚荣 URL,必须仅指向受此模块保护的服务器上的路径,但不得指向需要提供任何实际内容。

  6. oidc_claim_prefix 可用于更改在 HTTP 标头/环境变量中设置声明时使用的前缀。默认值为 ‘OIDC-’。

  7. oidc_resp_type 是使用的响应类型(或 OpenID Connect 流)。默认值为 ‘id_token’。

  8. oidc_scope 可用于更改从 IdP 请求的 OpenID Connect 范围。默认值为 ‘openid email profile’。

  9. oidc_auth_verify_jwks_uri 是托管此 OP 签名密钥的 URL,格式为 JWK(可选)

  10. oidc_outgoing_proxy 指定您的网络的传出代理。这通常用于允许从 keystone 到 IdP 的必要传出请求在非路由环境中。

  11. oidc_state_max_number_of_cookies 可用于指定状态 cookie 的最大数量,即并行突发身份验证请求的最大数量。(可选)

  12. oidc_auth_request_params 可用于定义与授权请求一起发送的额外参数。(可选)

  13. oidc_default_url 可用于定义在第三方启动 SSO 时未提供显式 target_link_uri 时使用的默认 URL。如果收到无效的授权响应,用户也会重定向到此 URL。(可选)

  14. oidc_claim_delimiter 可用于更改在 HTTP 标头/环境变量中设置多值声明时使用的分隔符。(可选)

请参阅 zmartzone/mod_auth_openidc 配置文档 以获取更多信息和可能的配置选项的完整列表。

以下是设置 keystone 作为使用 mod_auth_openidc 的 OIDC 服务提供商到 IdP 的 keystone_sp 示例,并启用 CADF 通知。

keystone_sp:
  apache_mod: 'mod_auth_openidc'
  cadf_notifications: true
  cadf_notifications_opt_out:
    - identity.authenticate.failed
    - identity.authenticate.pending
    - identity.authenticate.success
  trusted_dashboard_list:
    - "https://{{ horizon_server_name }}/auth/websso/"
    - "https://{{ external_lb_vip_address }}/auth/websso/"
  trusted_idp_list:
    - name: "oidc-idp"
      oidc_provider_metadata_url: https://identity-provider/.well-known/openid-configuration
      oidc_client_id: keystone
      oidc_client_secret: <SECRET>
      oidc_crypto_passphrase: <RANDOM STRING>
      oidc_redirect_path: /oidc_redirect
      oidc_auth_request_params: param=some+url+encoded+value&param2=and+another+one
      entity_ids:
        - 'https://identity-provider/openid-endpoint/'
      federated_identities:
        - domain: default
          project: fedproject
          group: fedgroup
          role: member
      protocols:
        - name: openid
          mapping:
            name: openid-mapping
            rules:
              - remote:
                  - type: OIDC-email
                local:
                  - group:
                      name: fedgroup
                      domain:
                        name: Default
                    user:
                      name: '{0}'

需要注意的是,mod_auth_openidc 会自动配置为使用现有的 OSA memcached 服务器来临时持久化状态数据。这对于具有多个 keystone 实例的高可用性部署尤其重要。OIDC 身份验证会话状态会持久化到 memcached 中,以便负载均衡器的轮询行为允许不同的 keystone 实例处理身份验证流程的不同阶段。

注意

在启动 playbook 之前,请确保 vhosts 已经从 Horizon 端配置好。如果还没有,请先配置它们,以避免部署期间出现错误。

您可以这样设置

openstack-ansible openstack.osa.horizon --tags horizon-config