ラベル ActiveDirectory の投稿を表示しています。 すべての投稿を表示
ラベル ActiveDirectory の投稿を表示しています。 すべての投稿を表示

2008年9月17日水曜日

Apacheのアクセス許可にKerberos認証を使う

メモエントリ
Apache2.0系でしかうまくいかない、サブドメインの使いかた不明。
 

少々昔に設定したけど、書いておかないとしたことすら忘れそう。
Apacheで作ったWEBサーバの認証をKerberos認証にするというやり方。まあWindowsの ActiveDirectory に投げるというだけなんですが、既存の認証基盤をつかえておトク。

確か当時はここを参考にした。
個人サイト:ActiveDirectory+Linuxによる部署内サーバ構築
http://rina.jpn.ph/~rance/server/index.html
Microsoft:Providing Active Directory authentication via Kerberos protocol in Apache
http://support.microsoft.com/?scid=kb%3Ben-us%3B555092&x=15&y=13


Apacheの追加モジュール


設定したのはApache2.0.54です、 mod_auth_kerb をyumで入れました。
 

httpd の conf.d の下に "auth_kerb.conf" ファイルができる、有効な中身はこれだけ。
LoadModule auth_kerb_module modules/mod_auth_kerb.so
 

ActiveDirectory側の準備


不要
 
 

Kerberosクライアントの設定


"/etc/krb5.conf" を編集する。なかったら「krb5-workstation」が入ってないので入れておく。
例は ActiveDirectory 側のドメイン名が "example.local" の環境を対象とした場合、該当のディレクティブの太字箇所を書き換える。
途中のサーバ名は環境に合わせて、1台でもOKだけど名前解決はできるようにリゾルバを設定しておく必要がある。


[libdefaults]
default_realm = EXAMPLE.LOCAL
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 24h
forwardable = yes
 
[realms]
ICRAFT.LOCAL = {
kdc = server01.example.local:88
kdc = server02.example.local:88
admin_server = server01.example.local:749
}
 
[domain_realm]
.example.local = EXAMPLE.LOCAL
example.local = EXAMPLE.LOCAL



レルムのところだけで十分かもしれない。
 
 

Kerberos認証用、keytabファイルの作成


場所はApacheが読めるところに "auth_kerb.keytab" ファイルを作る。 例えば"/usr/lib/httpd/modules/auth_kerb.keytab" のような感じ、中身は一行。

HTTP/web01.example.local@EXAMPLE.LOCAL
前半はApacheを入れたサーバのFQDN. 使っている環境はグローバル環境にあるのでドメインがne.jp. なんだけどそれでもいい、実は何でもいいのかもしれない。ファイルいらないという噂も。。
 
 

Kerberos認証できるか試してみる


ActiveDirectory上のユーザとパスワードで認証できるか試してみる、kinit ユーティリティを使う。
# kinit testuser
Password for testuser@EXAMPLE.LOCAL:[パスワードを入力]

何も起こらなければ成功、チケットが発行されているはず。
一応klistで確かめられる。
# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: testuser@EXAMPLE.LOCAL



有効期限とかが出てくるので、それを見ると認証チケットができているようなことが確認できる。
 
 

Apacheのコンフィグ


Basic認証などを書く所でこうする。
AuthType Kerberos
AuthName "Kerberos authentication"
Krb5Keytab modules/auth_kerb.keytab
KrbVerifyKDC off
KrbMethodNegotiate off
KrbSaveCredentials off
require valid-user

これでWEBサーバにアクセスしたら、設定したディレクトリで "Kerberos authentication" の入力ダイアログが出て、ActiveDirectoryに存在する アカウント/パスワード で認証してくれる。
 
もちろんSSLは使っておこう。
 
 
 


設定自体はすぐなんだけど、ActiveDirectory上のユーザは全部認証できるのがいまいち。
応急処置としては、USER環境変数をとっ捕まえて REWRITE すればいいのかな。

2008年9月6日土曜日

Active Directory Application Mode についてどうでもいい疑問

Active Directory Application Modeって言うのがあるんですが。
 

Windows Server 2003 Active Directory Application Mode 日本語版
http://www.microsoft.com/japan/windowsserver2003/adam/default.mspx


 

Active Directory Application Mode (ADAM) はシステム サービスとしてではなく、ユーザー サービスとして走る Lightweight Directory Access Protocol (LDAP) のディレクトリ サービスです。
引用:Windows Server 2003 Active Directory Application Mode 日本語版

 

分かる。Windowsで動くLDAP、ADの実績から言ってレプリケーションとか安定しそうですよね。
とりあえずはBecky!用にでもアドレス帳あたり作ってみようかと思うんですが、ちょっと疑問。
 
普段のアレは何モードなんだろう。。Active Directory 本気モード?

2008年8月14日木曜日

MicrosoftDNSサーバのイベントID4515を解消する

WindowsServer2003で構成されたActiveDirectoryのドメインコントローラで、DNSが起動する際にイベントID4515を記録するときがあります。
関連して色々と調査したので情報エントリ、関連リンク先を一通り理解すればイベントID4515が発生する原因は全部潰せるとおもいます。
 
ActiveDirectoryのスキーマに精通してLDAPの理解があれば苦労しなかったのでしょうがなかなかそうもいかない…
イベント ID : 4515
ソース : DNS
種類 : 警告
説明 : ゾーン example.local はディレクトリ パーティション MicrosoftDNS から既に読み込まれましたが、ディレクトリ パーティション DomainDnsZones.example.local でこのゾーンの別のコピーが見つかりました。DNS サーバーはこのゾーンの新しいコピーを無視します。この競合をできるだけ早く解決してください。
※サーバイベントログより引用

 

あるお客さんの環境で発生したので、これを下記マイクロソフトのKBをを参考に解消しようとするとどうも細部が違う。

Windows Server 2003 の DNS サーバー ログにイベント ID 4515 が記録される
http://support.microsoft.com/kb/867464/ja


 

ADSIEDITを使用して ForestDnsZones と DomainDnsZones を参照したが、重複する情報は特にない。イベントログの文言も今回のケースとは少し違った。
 














表:この環境で確認できた状況
確認先状況
ForestDnsZonesサブドメイン「_msdcs.example.local」のゾーン情報が入っている
DomainDnsZonesexample.localのゾーン情報が入っているが情報が古い

 
結局、MicrosoftKBの解説はあくまで2003仕様のActiveDirectoryの話で、今回のケースでは過去にWindows2000Serverで構築されていたドメインとWindowsServer2003の”新ドメイン”があり、それらを統合する為に色々と相互接続設定をを試した名残があったのだろうということに落ち着いた。
 
 

以下調べたことをつらつらと記述。
 

DNSのActiveDirectory統合ゾーンがカギ


ActiveDirectory(以下AD…)で使うDNSはゾーン情報をAD内に持っています。
DNS(Domain)用のアプリケーションディレクトリパーティションがあって、それが「ForestDnsZones」と「DomainDnsZones」、Domain~ のほうは2003用ADにドメイン構築した際の「名前そのままゾーン」の保管先として、 "example.local" のリソースレコードが並んでいる。
Forest~ のほうは"example.local"ドメイン作成時に自動的に作られる委任サブドメイン"_msdcs.”ゾーンが、これにはSRVレコードが含まれる。
"_msdcs.”はアイランド問題の解消のため設置、フォレスト内のドメインコントローラに一意な識別子を設定する。
 

しかしこれらはWindows2000のADスキーマにはいない、もともと2000のADが抱えていた問題解消+いろいろ拡張性を考慮して改良したから。
 

関連用語のMS公式解説 (※解釈おかしい箇所があるかも知れないので要確認)
アプリケーションディレクトリパーティション(リンク:TechNet)
Windows2000ADのアイランド問題(リンク先の中段くらい)
ゾーン レプリケーション スコープ(リンク:TechNet)

では2000のADでゾーンはどこにいたのか探す。
WindowsでDNSの管理コンソールを立ち上げて、ActiveDirectory統合ゾーンのプロパティを見たらゾーンレプリケーションスコープの選択がある、選択肢は下記のリンク。
 


 

これがADの保管先と対応しているので表にしてみた。

















表:ADスキーマとAD統合ゾーンDNSとの関係
ADエントリゾーン情報のあるDN
/対応するゾーン レプリケーション スコープ
ForestDnsZonesCN=MicrosoftDNS, DC=ForestDNSZones, DC=example, DC=local
/ Active Directory フォレスト内のすべての DNS サーバー
DomainDnsZonesCN=MicrosoftDNS, DC=DomainDNSZones, DC=example, DC=local
/ Active Directory ドメイン内のすべての DNS サーバー
SystemCN=MicrosoftDNS, CN=System, DC=example, DC=local
/ Active Directory ドメイン内のすべてのドメイン コントローラ

 

統合ゾーンDNSの3つ目の保管先、"CN=MicrosoftDNS, CN=System"


SystemのMicrosoftDNSを調べると、ちゃんと "example.local"ゾーンが最新の状態で保管されている。
ちなみに "CN=System" の中身は DNを"DC=example, DC=local" として開く=ADSIEDITのデフォルトで開いているDNから簡単にたどれる。
さらにちょっと寄り道すると、実際のADのレプリケーションでレプリカされるのはこの情報で、ADのDNSはゾーン転送とかするわけでなく、ADのアプリケーションディレクトリパーティションを読み込む・更新を適用する、という動作をしている。
 

ということで上記ディレクトリパーティションはWindowsのDNSサーバが起動する際にゾーン情報を「System」→(「ForestDNSZones」→「DomainDNSZones」※カッコ内は未確認)という順番で読み込んでいるんだろうなと。
 

ほか今回確認した時点ではSystemには「逆引きDNSゾーン」、と「RootDNSサーバ達」のゾーンが格納されていた。
 

DNS管理コンソールで確認すると、正引き、逆引きともに ゾーン レプリケーション スコープ は「Active Directory ドメイン内のすべてのドメイン コントローラ」となっていた、上記対応表どおりだ。
 

なおRootDNSサーバゾーンは各DNSサーバサービス固有のものなのでSystemでいい。
 
 


実際どれを消したらいいのか


ここまでわかれば後は簡単だった。
「DomainDNSZones」の"CN=MicrosoftDNS"から"example.local"ディレクトリを削除してDNSを再起動、DNSイベントログにID:4515の警告はもう出ない。
 

結局はイベントログの "説明:" セクションを読み返してみると、ログ様の仰せのとおりだったと事後になって理解。警告・エラーを調査すると結局はいつもこうなりますね。
 
 

すでに2000Serverを使ったドメインコントローラなくなっていたので、そのあと正引き、逆引きゾーンの ゾーン レプリケーション スコープ を「Active Directory ドメイン内のすべてのドメイン コントローラ」から「Active Directory ドメイン内のすべての DNS サーバー」 に変更した。
※2000Serverが残っている場合もADスキーマ更新で行けるようです。
 

作業後のディレクトリパーティションとゾーン情報は下記になった。

















表:作業後のゾーン格納パーティション
ADエントリ保持しているゾーン情報
ForestDnsZones"_msdcs.example.local"
DomainDnsZones"example.local"
その他逆引きゾーン
System. (ルートDNSサーバの一覧)

 
 

まるまる当てはまる事例は少ないかも知れませんが、ID:4515で「ForestDNSZones」、「DomainDNSZones」、「MicrosftDNS(※このイベントログで出てくる際にはSystemを指す)」のキーワードに迷った人にこのエントリを参考にしてもらえると。