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
negotiate でURLを設定する

尝试访问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 で認証されていることが表示されている

bannerAds