配置 keystone 作为联合服务提供商¶
在 OpenStack-Ansible 中,keystone 的默认安装使用 Apache 和 uWSGI。将 keystone 配置为联合服务提供商的额外配置会添加 Apache mod_shib 或 mod_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)
apache_mod可用于在 mod_shib 和 mod_auth_openidc 之间切换。如果未定义或拼写错误,则默认使用 Shibboleth。有效值为 ‘shibboleth’ 或 ‘mod_auth_openidc’。(可选)cadf_notifications切换云审计数据联合 (CADF) 通知。默认情况下这些是关闭的。有效值为 true 或 false。更多信息请参见 keystone 开发人员文档。cadf_notifications_opt_out忽略在启用 CADF 通知时生成某些 CADF 通知。keystone 文档建议选择退出:identity.authenticate.success、identity.authenticate.pending 和 identity.authenticate.failed 通知,因为它们会产生大量噪音。trusted_dashboard_list是 keystone 接受 Web 单点登录重定向的受信任 URL 列表。此设置可确保 keystone 仅将令牌数据发送回受信任的服务器。这是作为一种预防措施,特别是为了防止中间人 (MITM) 攻击。此列表包含 horizon 显示的所有 URL,并以/auth/websso/后缀,这是 horizon WebSSO 组件的路径。trusted_dashboard_list 可能包含 IP 地址和/或 DNS 名称。trusted_idp_list是一个字典属性,包含对应于 SP 的每个受信任 IdP 的设置列表。
以下是可以设置在 trusted_idp_list 中的条目的属性。请注意,虽然 trusted_idp_list 是一个列表,但当前它只能支持一个条目。
name是在 Keystone 中使用的 IdP 名称,也是 Horizon 中 IdP 下拉菜单中默认显示的名称。display_name如果您的名称属性不便于用户使用,则可以为您的 IdP 在 Horizon 上显示的替代名称。(可选)domain_id是将创建 IdP 的域。如果未在创建新 IdP 时设置此项,则将自动生成一个具有随机 ID 的新域。将此域与 IdP 关联。entity_ids是一个引用实体 ID 列表。这指定了在验证到 IdP 时,将登录请求重定向到 SP 的方式。
federated_identities是域、项目、组和用户的映射列表。有关更多信息,请参见 配置身份服务 (keystone) 映射。protocols是 IdP 支持的协议列表,以及每个协议的映射和属性集。这仅支持名称为saml2或openid的协议。mapping是联合用户的本地到远程映射配置。有关更多信息,请参见 配置身份服务 (keystone) 映射。
使用 Shibboleth 的 SAML 服务提供商配置
除了上述 keystone_sp 中的属性外,以下属性可以设置为基于 Shibboleth SAML 的部署的 trusted_idp_list 中的条目。
cert_duration_years指定 SP 签名证书的有效期限(例如,/etc/shibboleth/sp-key.pem)。metadata_uri是 IdP 元数据的所在位置。这为 SP 提供签名密钥和 IdP 支持的所有端点。metadata_file是本地缓存元数据的文件名,该文件名将存储在/var/cache/shibboleth/中。metadata_reload是元数据刷新轮询之间的秒数。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.pem、sp-key.pem:os-keystone-install.yml播放手册使用在第一个 keystone 容器上生成的这些文件将它们复制到其他 keystone 容器。SP 和 IdP 在通信中使用这些文件作为签名凭据。
shibboleth2.xml:os-keystone-install.yml播放手册写入文件的内容,基于/etc/openstack_deploy/user_variables.yml文件中keystone_sp属性的配置结构。它包含受信任的 IdP 列表、SP 已知的 entityID 以及其他促进配置。attribute-map.xml:os-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) 服务提供商配置
请设置以下属性
keystone_public_endpoint默认情况下自动设置为公共端点的 URI。这执行重定向并确保令牌引用指向公共端点。horizon_keystone_endpoint默认情况下自动设置为 keystone 的公共 v3 API 端点 URL。基于 Web 的单点登录 horizon 需要使用 keystone v3 API。此值必须使用在端点 SSL 证书中注册的相同 DNS 名称或 IP 地址。如果 IdP 是 ADFS,则 keystone 端点必须具有 HTTPS 公共端点。keystone 或 SSL 卸载负载均衡器提供该端点。
将
keystone_service_publicuri_proto设置为 https。这可确保 keystone 在其引用中发布 https,并确保 Shibboleth 配置为知道它期望断言中的 SSL URL(否则它将使断言无效)。大多数专业的 IdP,例如 ADFS 和 Google,要求受信任的 SP 具有受信任的证书,该证书不是自签名证书。
在使用 keystone 端点的 SSL 时,请确保端点 URI 和证书匹配。例如,如果证书没有端点的 IP 地址,则必须使用在证书上注册的适当名称发布该端点。在使用 DNS 名称作为 keystone 端点时,
keystone_public_endpoint和horizon_keystone_endpoint必须都设置为使用 DNS 名称。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 中的条目。
oidc_provider_metadata_url可以在其中找到 OpenID Connect 提供商元数据的 URL。oidc_client_id是调用静态配置的 OpenID Connect 提供商时使用的客户端标识符。oidc_client_secret是调用静态配置的 OpenID Connect 提供商时使用的客户端密钥。oidc_crypto_passphrase加密密码用于加密状态 cookie 和 mod_auth_openidc 中的缓存条目。Mod_auth_openidc 的文档未指定此密码的任何格式或限制。应将其设置为随机生成的合理长度的字符串。oidc_redirect_path是 redirect_uri 的路径组件,用于此 OpenID Connect 客户端;这是一个虚荣 URL,必须仅指向受此模块保护的服务器上的路径,但不得指向需要提供任何实际内容。oidc_claim_prefix可用于更改在 HTTP 标头/环境变量中设置声明时使用的前缀。默认值为 ‘OIDC-’。oidc_resp_type是使用的响应类型(或 OpenID Connect 流)。默认值为 ‘id_token’。oidc_scope可用于更改从 IdP 请求的 OpenID Connect 范围。默认值为 ‘openid email profile’。oidc_auth_verify_jwks_uri是托管此 OP 签名密钥的 URL,格式为 JWK(可选)oidc_outgoing_proxy指定您的网络的传出代理。这通常用于允许从 keystone 到 IdP 的必要传出请求在非路由环境中。oidc_state_max_number_of_cookies可用于指定状态 cookie 的最大数量,即并行突发身份验证请求的最大数量。(可选)oidc_auth_request_params可用于定义与授权请求一起发送的额外参数。(可选)oidc_default_url可用于定义在第三方启动 SSO 时未提供显式 target_link_uri 时使用的默认 URL。如果收到无效的授权响应,用户也会重定向到此 URL。(可选)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¶m2=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