SPNEGO:通过Apache使用Active Directory登录
在AD中创建用户。
域名 = openid.local
C:\Windows\System32>dsquery user -samid %username%
"CN=Administrator,CN=Users,DC=openid,DC=local"
创建apache@openid.local。
@echo off
SET USER=apache
SET DOMAIN=DC=openid,DC=local
SET PN="CN=%USER%,CN=Users,%DOMAIN%"
SET PWD=twitter!@2014
SET GROUP="CN=Domain Admins,CN=Users,%DOMAIN%"
dsadd user %PN% -pwd %PWD% -mustchpwd no -pwdneverexpires yes -memberof %GROUP%
确认
C:\Windows\System32>dsquery user -samid apache
"CN=apache,CN=Users,DC=openid,DC=local"
创建SPN(Service Principal Name)和密钥标签
キータブ = SPN + 按键
制作脚本
@echo off
REM --- AD Domain
SET REALM=OPENID.LOCAL
SET NTDOM=OPENID
REM --- Server
SET CNAME=ubuntu.openid.local
SET SPN=HTTP/%CNAME%@%REALM%
REM --- User
SET SERVICE_USER=apache
SET USER=%SERVICE_USER%@%NTDOM%
REM --- Crypto
SET CRYPTO=RC4-HMAC-NT
REM --- Principal Type
SET PTYPE=KRB5_NT_PRINCIPAL
REM --- Keytab File
SET OUT=%SERVICE_USER%.krb5.http.keytab
ktpass -princ %SPN% -mapuser %USER% -crypto %CRYPTO% -ptype %PTYPE% -out %OUT% +rndPass
确认:
C:> setspn -Q HTTP/*
ドメイン DC=openid,DC=local を確認しています
CN=apache,CN=Users,DC=openid,DC=local
HTTP/ubuntu.openid.local
既存の SPN が見つかりました
当更改参数并重新创建时,请删除它。
C:>setspn -d HTTP/ubuntu.openid.local apache
CN=apache,CN=Users,DC=openid,DC=local の ServicePrincipalNames
の登録を解除しています
HTTP/ubuntu.openid.local
更新されたオブジェクト
mod_auth_kerb 可进行重定向,以便与Kerberos身份验证进行交互。
乌班图:
$ sudo apt-get install libapache2-mod-auth-kerb krb5-user -y
/etc/krb5.conf:
卡内基梅隆大学凭证库(Kerberos)的配置文件。
[libdefaults]
default_realm = OPENID.LOCAL
[realms]
OPENID.LOCAL = {
kdc = windomain.openid.local
admin_server = windomain.openid.local
}
[domain_realm]
.openid.local = OPENID.LOCAL
openid.local = OPENID.LOCAL
将keytab配置到Ubuntu上。
复制并粘贴400。
$ sudo cp apache.krb5.http.keytab /etc
$ sudo chown www-data:www-data /etc/apache.krb5.http.keytab
$ sudo chmod 400 /etc/apache.krb5.http.keytab
请去买一瓶牛奶。
$ sudo ktutil list
ktutil:
ktutil: rkt /etc/apache.krb5.http.keytab
ktutil: l
slot KVNO Principal
---- ---- ---------------------------------------------------------------------
1 4 HTTP/ubuntu.openid.local@OPENID.LOCAL
- あるいは
$ sudo -u www-data klist -k /etc/apache2/krb/abop.deb.keytab
Keytab name: FILE:/etc/apache2/krb/abop.deb.keytab
KVNO Principal
---- --------------------------------------------------------------------------
3 HTTP/ubuntu.tact.local@TACT.LOCAL
将其重设
重启
初始化
$ sudo -u www-data kinit -k -t /etc/apache.krb5.http.keytab HTTP/ubuntu.openid.local@OPENID.LOCAL
$ sudo -u www-data klist -e
Ticket cache: FILE:/tmp/krb5cc_33
Default principal: HTTP/ubuntu.openid.local@OPENID.LOCAL
Valid starting Expires Service principal
2014-07-18T16:13:44 2014-07-19T02:13:44 krbtgt/OPENID.LOCAL@OPENID.LOCAL
renew until 2014-07-19T16:13:44, Etype (skey, tkt): arcfour-hmac, aes256-cts-hmac-sha1-96
$ ls -al /tmp/k*
-rw------- 1 www-data www-data 1518 11月 13 19:14 /tmp/krb5cc_33
获取初始凭据时,kinit: 权限被拒绝
如果出现该错误,可能是键值表文件的权限设置有问题。请正确使用 chown(www-data) 和 chmod(400) 进行修改。
kdestroy: 清除票据缓存
- 特定のチケットを指定してクリアできません
$ sudo -u www-data kdestroy
$ sudo -u www-data klist -e
klist: No credentials cache found (ticket cache FILE:/tmp/krb5cc_33)
Apache虚拟网站
在路由上设置SPNEGO(Negotiate)身份验证。
<VirtualHost ubuntu.openid.local:80>
ServerAdmin admin@i-c-i.jp
ServerName ubuntu.openid.local
DocumentRoot /home/hdknr/apache/www
LogLevel debug
ErrorLog /home/hdknr/apache/logs/error.log
CustomLog /home/hdknr/apache/logs/access.log combined
<Location / >
#Require all granted
AuthType Kerberos
AuthName "AD Auth for OPENID.LOCAL"
KrbAuthRealms OPENID.LOCAL
Krb5KeyTab /etc/apache.krb5.http.keytab
KrbMethodNegotiate on
KrbMethodK5Passwd off
KrbServiceName Any
require valid-user
</Location>
</VirtualHost>
核实
用户代理
互联网浏览器的设置

火狐浏览器
-
- about:config
-
- network.negotiate-auth.delegation-uris
- network.negotiate-auth.trusted-uris

尝试访问phpinfo()页面
-
- Active DirectoryにログインしたWindowsのデスクトップでアクセス
- パスワード入力なしでアクセスできる
错误日志的调试消息
AH01626: authorization result of <RequireAny>: denied (no authenticated user yet)
kerb_authenticate_user entered with user (NULL) and auth_type Kerberos
AH01626: authorization result of Require valid-user : denied (no authenticated user yet)
AH01626: authorization result of <RequireAny>: denied (no authenticated user yet)
kerb_authenticate_user entered with user (NULL) and auth_type Kerberos
Verifying client data using KRB5 GSS-API with our SPNEGO lib
Client didn't delegate us their credential
GSS-API token of length 180 bytes will be sent back
AH01626: authorization result of Require valid-user : granted
AH01626: authorization result of <RequireAny>: granted
REMOTE_USER に hide@OPENID.LOCAL で認証していることが表示されてる
AUTH_TYPE に Negotiate で認証されていることが表示されている