Keystone - Identity service¶
Fernet Tokens¶
Fernet tokens 需要使用在 Keystone 服务器之间同步的密钥。 Kolla Ansible 部署两个容器来处理此问题 - keystone_fernet 运行 cron 作业,在必要时通过 rsync 轮换密钥。 keystone_ssh 是一个 SSH 服务器,它为 rsync 提供传输。 在多主机控制平面中,这些轮换由主机以轮询方式执行。
以下变量可用于配置令牌过期和密钥轮换。
fernet_token_expiryKeystone fernet 令牌的过期时间,单位为秒。 默认值为 86400,即 1 天。
fernet_token_allow_expired_windowKeystone 允许过期 fernet 令牌的窗口。 默认值为 172800,即 2 天。
fernet_key_rotation_intervalKeystone fernet 密钥轮换间隔,单位为秒。 默认值是令牌过期时间和允许过期窗口的总和,即 3 天。
默认轮换间隔设置为确保任何时候都只有最少数量的密钥处于活动状态。 这包括一个主密钥、一个辅助密钥和一个缓冲密钥 - 总共三个。 如果轮换间隔设置低于令牌过期时间和令牌允许过期窗口的总和,则 Keystone 中会根据需要配置更多活动密钥。
有关 Fernet tokens 的更多信息,请参阅 Keystone 文档。
联合身份¶
Keystone 允许通过身份联合对用户进行身份验证。 这意味着将 OpenStack Keystone 与身份提供商集成。 使用身份联合允许用户无需在 OpenStack 环境中拥有帐户即可访问 OpenStack 服务。 然后将身份验证卸载到联合身份的身份提供商。
要启用身份联合,您需要在多个 OpenStack 系统中执行一组配置。 因此,对于操作员来说,使用 Kolla Ansible 来执行此过程更容易。
有关上游文档,请参阅 配置 Keystone 以进行联合
支持的协议¶
OpenStack 支持 OpenID Connect 和 SAML 协议进行联合身份验证,但目前 kolla Ansible 仅支持 OpenID Connect。 因此,如果您希望在您的环境中使用的 SAML,则需要手动设置它或扩展 Kolla Ansible 以也支持它。
通过 Kolla Ansible 设置 OpenID Connect¶
首先,您需要在您的身份提供商中将 OpenStack (Keystone) 注册为服务提供商。
注册 Keystone 后,您需要在 kolla-ansible 全局配置中添加身份提供商配置,如下例所示
keystone_identity_providers:
- name: "myidp1"
openstack_domain: "my-domain"
protocol: "openid"
identifier: "https://#"
public_name: "Authenticate via myidp1"
attribute_mapping: "mappingId1"
metadata_folder: "path/to/metadata/folder"
certificate_file: "path/to/certificate/file.pem"
keystone_identity_mappings:
- name: "mappingId1"
file: "/full/qualified/path/to/mapping/json/file/to/mappingId1"
在某些情况下,有必要添加 JWKS (JSON Web Key Set) uri。 它需要用于 auth-openidc 端点 - 由 OpenStack 命令行客户端使用。 示例配置如下所示
keystone_federation_oidc_jwks_uri: "https://<AUTH PROVIDER>/<ID>/discovery/v2.0/keys"
一些身份提供商需要额外的 mod_auth_openidc 配置。 Keycloak 的示例如下所示
keystone_federation_oidc_additional_options:
OIDCTokenBindingPolicy: disabled
在使用 OIDC 时,操作员还可以使用以下变量来自定义在 IdP 中身份验证超时时的重试延迟
keystone_federation_oidc_error_page_retry_login_delay_milliseconds默认值为 5000 毫秒 (5 秒)。
也可以通过以下方式覆盖 OIDCHTMLErrorTemplate,自定义错误模板页面
{{ node_custom_config }}/keystone/federation/modoidc-error-page.html
身份提供商配置¶
name¶
OpenStack 中身份提供商的内部名称。
openstack_domain¶
身份提供商所属的 OpenStack 域。
protocol¶
IdP 使用的联合协议;例如 openid 或 saml。 我们目前仅支持 OpenID connect。
identifier¶
身份提供商 URL;例如 https://#。
public_name¶
将在 Horizon 登录页面上向用户显示的身份提供商公共名称。
attribute_mapping¶
要用于身份提供商的属性映射。 预计此映射已存在于 OpenStack 中,或在 keystone_identity_mappings 属性中配置。
metadata_folder¶
包含所有身份提供商元数据的 JSON 文件的文件夹路径。
元数据文件夹必须包含所有身份提供商的配置,文件的名称将是 Issuer 配置的名称(包含路径)。 例如
- <IDP metadata directory>
- keycloak.example.org%2Fauth%2Frealms%2Fidp.client
|
- keycloak.example.org%2Fauth%2Frealms%2Fidp.conf
|
- keycloak.example.org%2Fauth%2Frealms%2Fidp.provider
注意
如果 URL 中有 /,则需要将其转义为 %2F,方法是在文件名中应用 URL 转义。
这些文件的内容必须是 JSON
client:
.client 文件处理 Issuer 中的服务提供商凭据。
在第一步中,当您在身份提供商中将 OpenStack 注册为服务提供商时,您提交了一个 cliend_id 并生成了一个 client_secret,因此这些是您必须在此 JSON 文件中使用的值。
{
"client_id":"<openid_client_id>",
"client_secret":"<openid_client_secret>"
}
conf:
此文件将是一个 JSON,用于覆盖一些 OpenID Connect 选项。 可以覆盖的选项在 OpenID Connect Apache2 插件文档 中列出。 .. OpenID Connect Apache2 插件文档: https://github.com/zmartzone/mod_auth_openidc/wiki/Multiple-Providers#opclient-configuration
如果您不想覆盖配置值,可以将此文件保留为空 JSON 文件,例如 {}。
provider:
此文件将包含有关 IdentityProvider 的所有规范。 为了简化,您可以使用 Identity provider 的 .well-known 端点中返回的 JSON
{
"issuer": "https://#",
"authorization_endpoint": "https://#/o/oauth2/v2/auth",
"token_endpoint": "https://oauth2.googleapis.com/token",
"userinfo_endpoint": "https://openidconnect.googleapis.com/v1/userinfo",
"revocation_endpoint": "https://oauth2.googleapis.com/revoke",
"jwks_uri": "https://www.googleapis.com/oauth2/v3/certs",
"response_types_supported": [
"code",
"token",
"id_token",
"code token",
"code id_token",
"token id_token",
"code token id_token",
"none"
],
"subject_types_supported": [
"public"
],
"id_token_signing_alg_values_supported": [
"RS256"
],
"scopes_supported": [
"openid",
"email",
"profile"
],
"token_endpoint_auth_methods_supported": [
"client_secret_post",
"client_secret_basic"
],
"claims_supported": [
"aud",
"email",
"email_verified",
"exp",
"family_name",
"given_name",
"iat",
"iss",
"locale",
"name",
"picture",
"sub"
],
"code_challenge_methods_supported": [
"plain",
"S256"
]
}
certificate_file¶
可选的身份提供商证书文件路径。 如果包含,则该文件必须命名为 ‘certificate-key-id.pem’。 例如
- fb8ca5b7d8d9a5c6c6788071e866c6c40f3fc1f9.pem
您可以在 Identity provider 的 .well-known/openid-configuration jwks_uri 中找到 key-id,例如在 https://www.googleapis.com/oauth2/v3/certs
{
"keys": [
{
"e": "AQAB",
"use": "sig",
"n": "zK8PHf_6V3G5rU-viUOL1HvAYn7q--dxMoU...",
"kty": "RSA",
"kid": "fb8ca5b7d8d9a5c6c6788071e866c6c40f3fc1f9",
"alg": "RS256"
}
]
}
注意
公钥与证书不同,此配置中的文件必须是身份提供商的证书,而不是身份提供商的公钥。