使用 Keystone 的外部认证¶
当 Keystone 在 Apache HTTPD 等 Web 服务器中运行时,Web 服务器也可以处理认证。这支持额外的认证方法,这些方法未由身份存储后端和 Keystone 支持的认证插件提供。
Web 服务器处理认证并非排他性的,Keystone 和 Web 服务器可以同时提供不同的认证方法。例如,Web 服务器可以提供对 X.509 或 Kerberos 认证的支持,而 Keystone 提供对密码认证的支持(使用 SQL 或身份存储作为后端)。
当 Web 服务器认证用户时,它会设置环境变量,通常是 REMOTE_USER,这可以在底层应用程序中使用。可以配置 Keystone 以使用这些环境变量来确定用户的身份。
配置¶
为了激活 Identity API v3 的外部认证机制,external 方法必须包含在已启用的认证方法列表中。默认情况下它是启用的,因此如果您不想使用外部认证,请将其从 auth 部分的 methods 选项中删除。
要配置应使用的插件,请再次在 auth 部分中设置 external 选项。Keystone 提供了两种外部认证方法插件
DefaultDomain:此插件不会考虑外部认证方法可能传递给 Keystone 的域信息,并且始终使用配置的默认域。REMOTE_USER变量是用户名。如果没有指定插件,则这是默认设置。Domain:此插件期望REMOTE_DOMAIN变量包含用户的域。如果未提供此变量,将使用配置的默认域。REMOTE_USER变量是用户名。
警告
如果您当前正在使用联合身份验证,则应禁用外部认证方法。外部认证和联合身份验证都使用 REMOTE_USER 变量。由于映射和外部插件都被调用来验证请求环境中的属性,因此可能导致冲突。
例如,假设有两个不同的用户具有相同的用户名 foo,一个在 Default 域中,而另一个在 BAR 域中。外部联合身份验证模块(例如 mod_shib)将 REMOTE_USER 属性设置为 foo。外部认证模块还尝试将 REMOTE_USER 属性设置为 foo,用于 Default 域。联合身份验证映射引擎将传入的身份映射到 BAR 域中的 foo。由于两者都使用不同的 user_id 来设置 Default 域和 BAR 域中的 foo,因此会导致 user_id 冲突。
要禁用此功能,只需从 keystone.conf 中的 methods 选项中删除 external
methods = external,password,token,oauth1
使用 HTTPD 认证¶
Apache HTTP 等 Web 服务器支持许多认证方法。Keystone 可以利用此功能,让认证在 Web 服务器中完成,然后使用 REMOTE_USER 环境变量将认证的用户传递给 Keystone。该用户必须提前存在于身份后端才能从控制器获取令牌。
要使用此方法,Keystone 应该在 HTTPD 上运行。
X.509 示例¶
以下 Apache 配置片段将基于来自已知 CA 的有效 X.509 证书对用户进行认证
<VirtualHost _default_:5000>
SSLEngine on
SSLCertificateFile /etc/ssl/certs/ssl.cert
SSLCertificateKeyFile /etc/ssl/private/ssl.key
SSLCACertificatePath /etc/ssl/allowed_cas
SSLCARevocationPath /etc/ssl/allowed_cas
SSLUserName SSL_CLIENT_S_DN_CN
SSLVerifyClient require
SSLVerifyDepth 10
(...)
</VirtualHost>