LADP - Apache 上的 Kerberos 设置与 Wordpress 单点登录不起作用
LADP - Kerberos Setup on Apache with Wordpress Single Sign-On not working
我们使用 Active Directory 设置了本地网络。我们开发了一个网站,该网站只能通过本地网络托管和访问。如果用户已经在 OS 上登录到 Active Directory,我们希望用户在访问我们的 Wordpress 网站后立即自动登录。
仅在跟进文档时,我们仍然面临着我们发现很难解决的问题,我们花了很多时间才能成功启动这样的设置。一些错误是:
- gss_acquire_cred() 失败:未指定的 GSS 失败。未找到密钥 table 条目
- 无法验证 krb5 凭据:密钥版本不可用
答案将列出我们遇到的所有问题以及我们如何设法解决这些问题,以防某些人在设置时遇到同样的问题。
在 Active Directory 域控制器上创建 Keytab 文件
- 这不是我们自己做的,而是将命令提供给 Active Directory 专家以执行以下命令。此命令区分大小写,因此非常重要的是,如果域是大写的(如下例所示),它也会在活动目录中以大写域执行。
- 命令
ktpass -princ HTTP/intranet.domain.com@DOMAIN.COM -pass "{PASSWORD}" -mapuser username@DOMAIN.COM -Ptype KRB5_NT_PRINCIPAL -out website-auth.keytab
- 来自 ktpass 命令:
- intranet.domain.com - 是我们的 wordpress 网站 url
- DOMAIN.COM - 是活动目录域
- {PASSWORD} - 任意随机密码,例如UjhmPz5UPwx2VhQir7
- 请注意这非常重要:因为我们遇到了密码问题。创建 ktpass 后,不要更改活动目录中相关服务用户帐户的密码。每次通过活动目录更改服务帐户密码时,活动目录上的 keytab 版本也会更新,除非你也更新 apache 上的 keytab 文件,否则你将无法进行身份验证。因此,如果您将密码更改为新密码然后恢复为旧密码,您仍然会遇到身份验证问题(即使密码现在已恢复为原始值)。更多信息在这里:https://support.oneidentity.com/fr-fr/kb/33866/when-does-the-vno-in-host-keytab-change-
- username@DOMAIN.COM - Active Directory 的服务帐户
- 帐户密码应设置为未过期。
- 该帐户应该受委托。
- website-auth.keytab - 生成的密钥表的文件名。我们将其存储在
/etc/httpd/kerberos-credentials/website-auth.keytab
- 将 Keytab 文件从 AD 域控制器复制到 Apache 上托管的 Web 服务器。
在 Web 服务器上安装 Kerberos 客户端库:
- sudo apt-get 安装 krb5-user (Ubuntu)
- yum 安装 krb5-workstation krb5-libs krb5-auth-dialog (Centos)
在 Kerberos 配置文件中配置 Active Directory 域
- 更新/etc/krb5.conf
- 我在下面粘贴我们的配置文件模板。更新 enctypes 参数对我们来说非常重要,因为默认配置文件不包含从活动目录生成的密钥表的 enctype,这会导致身份验证问题。在这个示例中,我包括了我从研究中设法找到的所有 enctypes。
# Configuration snippets may be placed in this directory as well
includedir /etc/krb5.conf.d/
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
[libdefaults]
dns_lookup_realm = true
dns_lookup_kdc = true
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true
rdns = false
pkinit_anchors = /etc/pki/tls/certs/ca-bundle.crt
default_realm = DOMAIN.COM
default_tkt_enctypes = aes256-cts des3-cbc-sha1 arcfour-hmac des-cbc-crc aes256-cts-hmac-sha1-96 des-cbc-md5 arcfour-hmac-md5
default_tgs_enctypes = aes256-cts des3-cbc-sha1 arcfour-hmac des-cbc-crc aes256-cts-hmac-sha1-96 des-cbc-md5 arcfour-hmac-md5
permitted_enctypes = aes256-cts des3-cbc-sha1 arcfour-hmac des-cbc-crc aes256-cts-hmac-sha1-96 des-cbc-md5 arcfour-hmac-md5
[realms]
DOMAIN.COM = {
admin_server = DOMAIN.COM
kdc = DOMAIN.COM
}
[domain_realm]
domain.com = DOMAIN.COM
.domain.com = DOMAIN.COM
[login]
krb4_convert = true
krb4_get_tickets = true
为 Apache 安装 auth_kerb 模块
- Ubuntu:
- sudo apt-get 安装 libapache2-mod-auth-kerb
- a2enmod auth_kerb
- 重启apache
- 森托斯:
- yum 安装 mod_auth_kerb
- 重启apache:systemctl restart apache2
为站点目录配置 Kerberos SSO
- Ubuntu:编辑/etc/apache2/sites-enabled/000-default.conf文件
- Centos:编辑/etc/httpd/conf.d/文件夹auth_kerb.conf配置文件
- 我们在 Centos 上工作,所以我没有 Ubuntu 的确切配置,但它应该与 Centos 配置非常相似。我们的配置文件模板是:
- 设置好配置文件后,需要重新启动apache
LoadModule auth_kerb_module /usr/lib64/httpd/modules/mod_auth_kerb.so
<Directory "/var/www/html">
Order allow,deny
Allow from all
AuthType Kerberos
AuthName "username used in keytab"
KrbAuthRealms DOMAIN.COM
KrbServiceName HTTP/intranet.domain.com@DOMAIN.COM
Krb5Keytab /etc/httpd/kerberos-credentials/website-auth.keytab
KrbMethodNegotiate On
KrbMethodK5Passwd On
KrbVerifyKDC On
require valid-user
</Directory>
在 apache
上检查 httpd_can_network_connect
- 完成上述设置后,我们认为我们已经准备就绪,但仍然无法从网站进行身份验证。
- 经过一些研究,我们注意到我们需要在他的 apache 服务器上启用
httpd_can_network_connect
设置。为此 运行:
getsebool -a | grep httpd
:正在返回 httpd_can_network_connect --> 关闭
setsebool -P httpd_can_network_connect on
: 启用设置
- 重启apache服务
- 从 LDAP works with PHP CLI but not through apache
中提取的信息
在 OS
上将 wordpress 网站添加到本地 Intranet
- 为了将 Wordpress 与 kerberos 集成,我们使用了现成的高级插件,但不幸的是,并非一切都像我们想象的那样顺利。通过上述设置,当我们尝试访问我们的 wordpress 网站时,浏览器会弹出一个默认的身份验证对话框。这不是预期的结果,因为我们希望用户在登录 Active Directory 时自动登录。这是因为我们正在测试的 windows 机器没有在本地 Intranets 配置中列出我们的 wordpress 网站。要将网站添加到本地 Intranet:
- 转到控制面板
- 转到 Internet 选项
- 单击“安全”选项卡
- 单击本地 Intranet 图标
- 点击站点
- 点击高级按钮
- 添加 Wordpres 站点 url
我们使用 Active Directory 设置了本地网络。我们开发了一个网站,该网站只能通过本地网络托管和访问。如果用户已经在 OS 上登录到 Active Directory,我们希望用户在访问我们的 Wordpress 网站后立即自动登录。
仅在跟进文档时,我们仍然面临着我们发现很难解决的问题,我们花了很多时间才能成功启动这样的设置。一些错误是:
- gss_acquire_cred() 失败:未指定的 GSS 失败。未找到密钥 table 条目
- 无法验证 krb5 凭据:密钥版本不可用
答案将列出我们遇到的所有问题以及我们如何设法解决这些问题,以防某些人在设置时遇到同样的问题。
在 Active Directory 域控制器上创建 Keytab 文件
- 这不是我们自己做的,而是将命令提供给 Active Directory 专家以执行以下命令。此命令区分大小写,因此非常重要的是,如果域是大写的(如下例所示),它也会在活动目录中以大写域执行。
- 命令
ktpass -princ HTTP/intranet.domain.com@DOMAIN.COM -pass "{PASSWORD}" -mapuser username@DOMAIN.COM -Ptype KRB5_NT_PRINCIPAL -out website-auth.keytab
- 来自 ktpass 命令:
- intranet.domain.com - 是我们的 wordpress 网站 url
- DOMAIN.COM - 是活动目录域
- {PASSWORD} - 任意随机密码,例如UjhmPz5UPwx2VhQir7
- 请注意这非常重要:因为我们遇到了密码问题。创建 ktpass 后,不要更改活动目录中相关服务用户帐户的密码。每次通过活动目录更改服务帐户密码时,活动目录上的 keytab 版本也会更新,除非你也更新 apache 上的 keytab 文件,否则你将无法进行身份验证。因此,如果您将密码更改为新密码然后恢复为旧密码,您仍然会遇到身份验证问题(即使密码现在已恢复为原始值)。更多信息在这里:https://support.oneidentity.com/fr-fr/kb/33866/when-does-the-vno-in-host-keytab-change-
- username@DOMAIN.COM - Active Directory 的服务帐户
- 帐户密码应设置为未过期。
- 该帐户应该受委托。
- website-auth.keytab - 生成的密钥表的文件名。我们将其存储在
/etc/httpd/kerberos-credentials/website-auth.keytab
- 将 Keytab 文件从 AD 域控制器复制到 Apache 上托管的 Web 服务器。
在 Web 服务器上安装 Kerberos 客户端库:
- sudo apt-get 安装 krb5-user (Ubuntu)
- yum 安装 krb5-workstation krb5-libs krb5-auth-dialog (Centos)
在 Kerberos 配置文件中配置 Active Directory 域
- 更新/etc/krb5.conf
- 我在下面粘贴我们的配置文件模板。更新 enctypes 参数对我们来说非常重要,因为默认配置文件不包含从活动目录生成的密钥表的 enctype,这会导致身份验证问题。在这个示例中,我包括了我从研究中设法找到的所有 enctypes。
# Configuration snippets may be placed in this directory as well
includedir /etc/krb5.conf.d/
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
[libdefaults]
dns_lookup_realm = true
dns_lookup_kdc = true
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true
rdns = false
pkinit_anchors = /etc/pki/tls/certs/ca-bundle.crt
default_realm = DOMAIN.COM
default_tkt_enctypes = aes256-cts des3-cbc-sha1 arcfour-hmac des-cbc-crc aes256-cts-hmac-sha1-96 des-cbc-md5 arcfour-hmac-md5
default_tgs_enctypes = aes256-cts des3-cbc-sha1 arcfour-hmac des-cbc-crc aes256-cts-hmac-sha1-96 des-cbc-md5 arcfour-hmac-md5
permitted_enctypes = aes256-cts des3-cbc-sha1 arcfour-hmac des-cbc-crc aes256-cts-hmac-sha1-96 des-cbc-md5 arcfour-hmac-md5
[realms]
DOMAIN.COM = {
admin_server = DOMAIN.COM
kdc = DOMAIN.COM
}
[domain_realm]
domain.com = DOMAIN.COM
.domain.com = DOMAIN.COM
[login]
krb4_convert = true
krb4_get_tickets = true
为 Apache 安装 auth_kerb 模块
- Ubuntu:
- sudo apt-get 安装 libapache2-mod-auth-kerb
- a2enmod auth_kerb
- 重启apache
- 森托斯:
- yum 安装 mod_auth_kerb
- 重启apache:systemctl restart apache2
为站点目录配置 Kerberos SSO
- Ubuntu:编辑/etc/apache2/sites-enabled/000-default.conf文件
- Centos:编辑/etc/httpd/conf.d/文件夹auth_kerb.conf配置文件
- 我们在 Centos 上工作,所以我没有 Ubuntu 的确切配置,但它应该与 Centos 配置非常相似。我们的配置文件模板是:
- 设置好配置文件后,需要重新启动apache
LoadModule auth_kerb_module /usr/lib64/httpd/modules/mod_auth_kerb.so
<Directory "/var/www/html">
Order allow,deny
Allow from all
AuthType Kerberos
AuthName "username used in keytab"
KrbAuthRealms DOMAIN.COM
KrbServiceName HTTP/intranet.domain.com@DOMAIN.COM
Krb5Keytab /etc/httpd/kerberos-credentials/website-auth.keytab
KrbMethodNegotiate On
KrbMethodK5Passwd On
KrbVerifyKDC On
require valid-user
</Directory>
在 apache
上检查 httpd_can_network_connect- 完成上述设置后,我们认为我们已经准备就绪,但仍然无法从网站进行身份验证。
- 经过一些研究,我们注意到我们需要在他的 apache 服务器上启用
httpd_can_network_connect
设置。为此 运行:getsebool -a | grep httpd
:正在返回 httpd_can_network_connect --> 关闭setsebool -P httpd_can_network_connect on
: 启用设置- 重启apache服务
- 从 LDAP works with PHP CLI but not through apache 中提取的信息
在 OS
上将 wordpress 网站添加到本地 Intranet- 为了将 Wordpress 与 kerberos 集成,我们使用了现成的高级插件,但不幸的是,并非一切都像我们想象的那样顺利。通过上述设置,当我们尝试访问我们的 wordpress 网站时,浏览器会弹出一个默认的身份验证对话框。这不是预期的结果,因为我们希望用户在登录 Active Directory 时自动登录。这是因为我们正在测试的 windows 机器没有在本地 Intranets 配置中列出我们的 wordpress 网站。要将网站添加到本地 Intranet:
- 转到控制面板
- 转到 Internet 选项
- 单击“安全”选项卡
- 单击本地 Intranet 图标
- 点击站点
- 点击高级按钮
- 添加 Wordpres 站点 url