使用 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>