web-dev-qa-db-ja.com

Active DirectoryへのApache Kerberos認証が行われていません。 (KRB5KDC_ERR_C_PRINCIPAL_UNKNOWNは関連していますか?)

私の目標は、Kerberosを使用して、ユーザー名とパスワードを要求せずに、ApacheがADに対して認証を受けるようにすることです。現在は常に「401 Unauthorized」と表示され、Kerberosを試行していないようです。エラーログを見つけることができず、明らかに機能せずエラーを発生させるkinitコマンドを1つだけ見つけることができます。そのエラーはWireSharkに次のように表示されます。

Linux sends AS-REQ
Windows replies KRB5KDC_ERR_C_PRINCIPAL_UNKNOWN

手がかりまたは赤いニシン?

セットアップ/背景の詳細​​

Windows Server 2008 R2 SP1, with Active Directory ("winserver").
CentOS 6.5 ("centos").
  1. ホスト名とDNSを構成し、Windows DNSサーバーにAおよびPTRエントリを追加します。名前解決はOKと表示されます。

  2. /etc/krb5.confを使用して/etc/samba/smb.confauthconfig-tuiを作成し、それらを微調整します。

krb5.conf

`/etc/krb5.conf`

[libdefaults]
 default_realm = SITE.EXAMPLE.COM
 dns_lookup_realm = false
 dns_lookup_kdc = false
 ticket_lifetime = 24h
 renew_lifetime = 7d
 forwardable = true

[realms]
 SITE.EXAMPLE.COM = {
  kdc = winserver.site.example.com
  admin_server = winserver.site.example.com
 }

[domain_realm]
 site.example.com = SITE.EXAMPLE.COM

とサンバ

`/etc/samba/smb.conf` includes

workgroup = SITE
password server = winserver
realm = SITE.EXAMPLE.COM
security = ads
kerberos method = system keytab
winbind use default domain = true

ここから、Kerberosのセットアップ手順:

  1. net ads join createupn=Host/[email protected] -k -U administratorはWindowsパスワードを尋ね、それを受け入れます。ドメインに参加します(ADにコンピューターオブジェクトを作成します)。

  2. net ads testjoinは、「参加は問題ありません」と報告します。

  3. net ads keytab create -k -U administrator/etc/krb5.keytabを作成し、Host/centos....順列で埋めます。

  4. net ads keytab add HTTP -k -t /etc/krb5.keytab -U administratorは、HTTP/centos.site.example.comエントリをキータブに追加します。 klist -keは、HTTP/[email protected]を含む多数のSPNの組み合わせを示し、KVNOをサーバーオブジェクトのWindowsのmsDS-KeyVersionNumber属性と一致させるように見えます。

この時点で、PuTTYを使用してSSHで接続し、パスワードなしでSSOを使用して自動的にログインできます。SSHで接続してパスワードを強制できますプロンプトを表示し、Windowsのユーザー名とパスワードを使用してログインします。Windowsアカウントを使用してログインした後、kinitしてからklist Kerberosチケットを表示できます。 wbinfo -uおよびwbinfo -gおよびnet ads searchを使用して、ADにクエリを実行し、結果を取得できます。

すべてがよさそうだ。 Apacheに移りましょう:

  1. chgrp Apache /etc/krb5.keytab

  2. chmod ugo+r /etc/krb5.keytab

  3. yum install mod_auth_kerb

  4. /etc/httpd/conf/httpd.confを編集して追加:

httpd.conf

LoadModule auth_kerb_module /usr/lib64/httpd/modules/mod_auth_kerb.so

AuthName "Kerberos Authentication"
AuthType Kerberos

Krb5Keytab /etc/krb5.keytab
KrbAuthRealms SITE.EXAMPLE.COM
KrbMethodNegotiate on
KrbMethodK5Passwd off
KrbServiceName Any

Internet Explorerでは、「ローカルイントラネットサイト」にhttp://*.site.example.comが含まれ、「イントラネットゾーンでのみ自動ログオン」に設定されています。自動ログインは、これらの設定を使用して、オフィス内の他の(IISベースの)Webサイトで機能します。 FireFoxでは、about:configにnetwork.negotiate-auth.trusted-uris; .site.example.comがあります。

IE、FireFox、またはChromeでは、FQDNを使用してサイトにアクセスし、401 Unauthorizedを取得します。 Kerberosが試されているようにも見えません。

Linuxのログファイル、/ var/log/httpd/error_log、access_log/var/log/secure、または/var/log/audit/audit.logで何も問題がないことを確認できません。

テストするものを見つけようとしても、明確で関連性のあるエラーを作成するために見つけることができるのは次のコマンドだけです。

$ kinit -k -t /etc/krb5.keytab HTTP/centos.site.example.com
kinit: Client not found in Kerberos database while getting initial credentials

私はそれが何をしているのか正確にはわかりませんが、WireSharkを実行すると、

Linux sends AS-REQ to Windows with content
    cname name-string 2 items
    KerberosString: HTTP
    KerberosString: centosserver.site.example.com
    realm: SITE.EXAMPLE.COM
Windows replies KRB5KDC_ERR_C_PRINCIPAL_UNKNOWN 
    error-code eRR-C-PRINCIPAL-UNKNOWN (6)

Windowsでsetspn -L centosを使用すると、登録済みプリンシパル名にHTTP/centos.site.example.comが含まれていることが示されます。

私のWindowsデスクトップクライアントでは、klist get HTTP/centos.site.example.comの場合、クライアント:[email protected]、サーバー:HTTP/centos.site.example.comと表示されるチケットを取得します。

http://support.Microsoft.com/kb/951191 -のように感じますが、これはWindows Server 2008のオリジナルのService Pack 2以前にのみ適用されます。これはWindows Server 2008 R2 Service Pack 1です。 。別のドメインコントローラーをポイントしてみましたが、同じバージョンのWindows Serverを実行しており、同じように応答します。

Linux側:私はCentOS 6.5(Samba 3.x、Kerberos 5.0)で作業してきましたが、CentOS 7(Samba 4.xおよびKerberos 5.1)を新たにインストールし、同じ設定を試し、同じものを取得しましたkinitの結果。 CentOS 7でApacheを試したことはありません。

SSHのパスワードなしのログインが機能します。 ADに対するログイン認証はkinitで機能します。 Kerberos認証はApacheでは機能せず、Apacheで試行したり、エラーをログに記録したりすることもできません。何が欠けているのですか、なぜKerberos認証を試みないのですか?ログを増やすために何をテストまたは実行できますか?

そして、私が明らかに失敗できる唯一のことは、インターネットで見つけたそのコマンド^ですが、それが何をテストしているのか正確にはわかりません。それが何をしているのですか、なぜそれが機能しないのですか?デスクトップが同じサービスプリンシパルについてADにクエリを実行し、回答を得ることができるのですか?

[更新を編集]

私はnatxo asenjoの「別の方法で実行する」という答えに従いましたが、これで機能する設定ができました。また、ADでサービスごとに異なるユーザー名を使用し、個別のキータブを作成することも妥当です(たとえば、Apacheが侵害され、読み取り可能なHTTP /キータブが侵害された場合でも、ホスト/キータブは少し安全です)。

しかし、WindowsへのKerberosプリンシパルルックアップが私の元のアプローチで失敗した理由について、私には答えがありません。 http://requesttracker.wikia.com/wiki/Kerberos_SSO_with_Active_Directory_Integrationhttp://wiki.gentoo.org/wiki/Kerberos_Windows_Interoperability のようなガイドがある場合、これはイライラします。 Samba net adsコマンドを使用して、コンピューターアカウントに関連付けられた1つのキータブ内のいくつかのプリンシパル、および(おそらく)そこから実際の設定を取得します。

4

http://www.grolmsnet.de/kerbtut/ の説明は何度も使用しています。記録として、LinuxホストをADドメインに参加させる必要はありません。参加しても問題ありませんが、必須ではありません。

まず、centosホストからADレルムにkinitできることを確認します。次のような通常のユーザー資格情報を使用できます。

$ kinit [email protected]

(ちなみにkinitはcentosのkrb5-workstationパッケージの一部です)

パスワードを入力してください。ニュースはありません。 klistを実行すると、ADユーザー名としてkerberosチケットが表示されます。この手順が成功しない場合は、戻ってkrb5.confを修正してください。

Kdestroyでそのチケットを取り除きます。

それが機能したら、ADでユーザーアカウントを作成できます。パスワードを変更する必要がなく、パスワードの有効期限が切れていないことを確認してください。

次に、サービスプリンシパル名(spn)HTTP/Host.adrealm.tldを、管理ツールを備えたWindowsホストで、または十分な権限を持つ管理者またはアカウントとしてドメインコントローラーでsetspn.exeを使用して、そのユーザーアカウントにバインドします。

setspn -A HTTP/Host.adrealm.tld username [enter]
Registering ServicePrincipalNames for CN=username,OU=service_accounts,dc=adrealm,DC=tld
        HTTP/Host.adrealm.tld
Updated object

これで、ktpass.exeを使用して、このオブジェクトのキータブを生成できます(まだWindows管理ホストまたはドメインコントローラーにあります)。

ktpass -princ HTTP/[email protected] -pass xxxxx -mapuser username -Ptype KRB5_NT_PRINCIPAL -out Host_adrealm_tld.keytab [enter]
Targeting domain controller: DCname.Adrealm.tld
Successfully mapped HTTP/Host.adrealm.tld to username.
Password succesfully set!
Key created.
Output keytab to Host_adrealm_tld.keytab:
Keytab version: 0x502
keysize 75 HTTP/[email protected] ptype 1 (KRB5_NT_PRINCIPAL)
vno 3 etype 0x17 (RC4-HMAC) keylength 16 (0x037da0f7493b97966e4a19636304064d)

そのファイルをcentosホストに転送し、640の権限(root:Apache)で/etc/httpd/conf.d/に配置します。 selinuxが有効になっている場合は、restorecon -rv/etcを実行して、最終的にそこにselinuxコンテキストを修正します。

Keytabファイルは次の方法で確認できます。

$ klist -k -t Host_adrealm_tld.keytab 
Keytab name: FILE:Host_adrealm_tld.keytab
KVNO Timestamp         Principal
---- ----------------- --------------------------------------------------------
   3 01/01/70 01:00:00 HTTP/[email protected]

そして、それを使用してログオンすることで、さらに一歩先に進むことができます。

# kinit -k -t Host_adrealm_tld.keytab -p HTTP/[email protected]
# klist 
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: HTTP/[email protected]

Valid starting     Expires            Service principal
11/04/14 21:45:41  11/05/14 07:45:41  krbtgt/[email protected]
    renew until 11/05/14 21:45:41

DNSインフラストラクチャ(おそらくAD DNSでも)で、centosホストを指すA Host.realm.tldを作成します(sambaを使用してホストに参加している場合は、作成したはずのホストが正しいことを確認してください)。

Centosホストにmod_auth_kerbがインストールされていることを確認します。

それが適切な場所にある場合は、Apache用の(仮想)ホストのApache confファイルの1つを編集します。

この場合、フォルダを保護しましょう http://Host.adrealm.tld/topsecret

Alias /topsecret/ "/path/to/topsecret/"

<Directory "/path/to/topsecret/">

    AuthType  Kerberos
    KrbAuthRealms YOURAD.TLD
    KrbServiceName HTTP
    Krb5Keytab /etc/httpd/conf.d/Host_adrealm_tld.keytab
    KrbMethodNegotiate on
    KrbMethodK5Passwd off
    require valid-user

</Directory>

Centosホストのファイルシステムにtopsecretフォルダを作成します。そこにいくつかのダミーファイルを設定します。 selinuxを有効にして実行する場合は、フォルダーにApacheの適切なセキュリティコンテキストがあることを確認してください(フォルダーが/ var/www/htmlにある場合、実行中のrestorecon -rv/var/www/htmlと同等である必要があります) )。

Apache2構文パスを確認します。

apachectl -t

Host fqdnを確実に決定できないという警告が表示された「Syntax OK」が表示された場合は、問題ありません(後で修正できますが、重要ではありません)。 Apacheをリロードします。

apachectl graceful 

ローカルファイアウォールがhttpd接続を許可していることを確認します。

これはそれでなければなりません。次に、クライアントを構成する必要があります。ネットワークに「Windows認証」を備えたウェブサーバーがすでにある場合は、設定され、topsecret urlに移動します。有効なkerberosチケットがある場合は、ファイルが表示されます。それ以外の場合は、アクセスが拒否されます。

3
natxo asenjo