はじめに
ユーザアカウントをそれぞれのシステムで別々に管理するのでなく ActiveDirectory で一元的に管理したいというのはある。 例えば HTTP 認証で保護されたページにアクセスする時の ユーザID / パスワードなど。 もうちょっと欲張るとドメインにログインしている状態であれば その ユーザID / パスワード でもって自動的に認証処理がパスできればなお素晴らしい! まぁそういう訳で Windows 統合認証 / Windows Desktop SSO 認証になります。 Apache であればモジュールを追加すると試せそうだ。 ActiveDirectory については Samba4 を使います。 ではでは Getting Started!!
環境
Primary Domain Controller
OS | ContOS 6.5(CentOS-6.5-x86_64-minimal.iso) |
---|---|
Samba | 4.1.7 |
Bind | 9.8.2 |
NTP | 4.2.6p5 |
レルム | MYDOMAIN.LOCAL |
ドメイン | MYDOMAIN |
Host | pdc |
IP | 192.168.0.10 |
Gateway | 192.168.0.1 |
DNS | 127.0.0.1 |
Web Server
OS | ContOS 6.5(CentOS-6.5-x86_64-minimal.iso) VMware Player 6.0.2 |
---|---|
Apache | 2.2.15 |
Host | web01 |
IP | 192.168.0.110 |
Gateway | 192.168.0.1 |
DNS | 192.168.0.10 |
FQDN | web01.mydomain.local |
Windows クライアント
OS | Windows 8.1 |
---|---|
レルム | MYDOMAIN.LOCAL |
ドメイン | MYDOMAIN |
Host | win01 |
IP | 192.168.0.150 |
Gateway | 192.168.0.1 |
DNS | 192.168.0.10 |
Primary Domain Controller の構築
わたしも blog にまとめているのでそちらを参考に構築してみてください。 『Samba4 で Active Directory / SerNet Repo でセットアップ』 『Samba4 で ActiveDirectory / インストール編 - わたしもやってみた - 』 『Samba4 で ActiveDirectory / PDC編 - わたしもやってみた - 』
Web Server の構築
とりあえず SELinux と iptables は止めておこう。/etc/selinux/config
... SELINUX=disabled ...
service iptables stop service ip6tables stop chkconfig iptables off chkconfig ip6tables off
ネットワークの設定は次のような感じ。/etc/sysconfig/network-scripts/ifcfg-eth0
... ONBOOT=yes BOOTPROTO=static IPADDR=192.168.0.110 NETMASK=255.255.255.0 GATEWAY=192.168.0.1 NETWORK=192.168.0.0 BROADCAST=192.168.0.255 .../etc/sysconfig/network
NETWORKING=yes NETWORKING_IPV6=no HOSTNAME=web01
DNS は PDC のものを利用する。/etc/resolv.conf
domain mydomain.local nameserver 192.168.0.10
必要なモジュールをインストールしていく。 Apache は当然として Samba AD とアクセスするために Kerberos 関連のものと テストページ用に php もインストールする。
yum -y install httpd krb5-workstation mod_auth_kerb php
サービスの起動設定をしておく。
chkconfig httpd on
ここで再起動します。
reboot
PDC にログインして Web Server の 正引き DNS の設定をします。 一応確認もしておく。
ssh root@pdc samba-tool dns add pdc mydomain.local web01 A 192.168.0.110 dig web01.mydomain.local exit
Windows クライアントの設定
とりあえず MYDOMAIN.LOCAL ドメインへの参加くらいでしょうか? ドメイン参加しているのであれば DNS は PDC に設定されていると思うので DNS の設定は 大丈夫だと思う。 もし hosts ファイルに Web Server の IP を追加するなら以下のような感じ。C:\Windows\System32\drivers\etc\hosts
... 192.168.0.110 web01.mydomain.local web01
ここまでできたら Web ブラウザで「http://web01.mydomain.local」を開いて Apache が動いているか確認する。
Samba AD のユーザで Basic 認証
手始めに Apache から Samba AD にアクセスできているかの確認も兼ねて Basic 認証の設定をしてみようと思います。 雰囲気としては、.htpasswd ファイルの代わりに Samba AD のユーザデータを使う感じだと思います。 では Web Server の設定をしていきます。 httpd.conf に追加してもよいのだけれども mod_auth_kerb をインストールすると auth_kerb.conf が生成されていると思うのでこちらを編集します。/etc/httpd/conf.d/auth_kerb.conf
<location "/"> AuthName "AD authentication" AuthBasicProvider ldap AuthType Basic AuthLDAPGroupAttribute member AuthLDAPGroupAttributeIsDN On AuthLDAPURL ldap://pdc:389/cn=Users,dc=mydomain,dc=local?sAMAccountName?sub?(objectClass=*) AuthLDAPBindDN cn=administrator,cn=Users,dc=mydomain,dc=local AuthLDAPBindPassword passwd-123 require valid-user </Location>
Apache から Samba AD にアクセスするユーザを administrator にしています。 パスワードは passwd-123 にしています。
確認用のテストページを以下の内容で作成します。/var/www/html/index.php
<html> <head> <title>Samba AD User</title> </head> <body> <h2>Samba AD User</h2> <pre> USER : <?php echo $_SERVER['PHP_AUTH_USER']; ?> PASS : <?php echo $_SERVER['PHP_AUTH_PW']; ?> </pre> </body> </html>
ここで再起動します。
reboot
再起動が終わったら Windows で Web ブラウザから「http://web01.mydomain.local」を開いてみます。 Basic 認証 のダイアログが表示されると思います。 適当な Samba AD ユーザを入力して「OK」ボタンを押します。 すると画面に入力したユーザIDとパスワードが表示されていると思います。 パスワードまでが表示されてしまっているのは Basic 認証 なんで仕方ないのでしょう。
今は Basic 認証 の確認なので Windows はドメインログインでなくローカルログインでも 検証できると思います。 また、Web Server もドメイン参加していなくても大丈夫そうです。
Windows Desktop SSO 認証の設定
さて、いよいよ本題の Windows 統合認証の設定に入りたいと思います。 まず、PDC 側での作業から始めます。 Web Server の DNS の正引きの設定に加えて逆引きの設定も必要だとのことなので PDC の DNS に逆引きゾーンを追加して Web Server の 逆引き設定をする。
ssh root@pdc samba-tool dns zonecreate pdc 0.168.192.in-addr.arpa samba-tool dns add pdc 0.168.192.in-addr.arpa 110 PTR web01.mydomain.local
わたしのPDCの場合 administrator@MYDOMAIN.LOCAL のパスワードは passwd-123 になります。
DNS の正引き、逆引き設定ができているか確認します。
dig web01.mydomain.local dig -x 192.168.0.110
次に Web Server のための Service Principal を追加します。 どのユーザでも構わないと思うのですが Service Principal 追加時に関連付けするユーザが必要なので ここでは sso ユーザを作成しています。 そして作成した Service Principal を keytab ファイルに出力します。
cd /root samba-tool user create --random-password sso samba-tool user setexpiry --noexpiry sso samba-tool spn add HTTP/web01.mydomain.local sso samba-tool domain exportkeytab httpd.keytab --principal=HTTP/web01.mydomain.local
出力した keytab ファイルを Web Server に転送して Web Server に戻ります。
scp httpd.keytab root@192.168.0.110:/etc/httpd/conf/httpd.keytab rm httpd.keytab exit
Web Server に戻ってきたら 転送した keytab ファイルの権限を変更します。 一応、keytab ファイルの中身も確認しておきます。
chown root:apache /etc/httpd/conf/httpd.keytab chmod 640 /etc/httpd/conf/httpd.keytab klist -ke /etc/httpd/conf/httpd.keytab
次は Kerberos の設定をします。
mv /etc/krb5.conf /etc/krb5.conf.original
以下のような内容で krb5.conf を作成します。/etc/krb5.conf
[logging] default = FILE:/var/log/krb5libs.log kdc = FILE:/var/log/krb5kdc.log admin_server = FILE:/var/log/kadmind.log [libdefaults] default_realm = MYDOMAIN.LOCAL dns_lookup_realm = false dns_lookup_kdc = false ticket_lifetime = 24h renew_lifetime = 7d forwardable = true [realms] MYDOMAIN.LOCAL = { kdc = pdc.mydomain.local admin_server = pdc.mydomain.local } [domain_realm] .mydomain.local = MYDOMAIN.LOCAL mydomain.local = MYDOMAIN.LOCAL
Kerberos チケットのクリアと初期化、そして確認をします。
kdestroy kinit administrator@MYDOMAIN.LOCAL klist
その次に Apache の設定をします。 auth_kerb.conf を以下のような内容に編集します。/etc/httpd/conf.d/auth_kerb.conf
<location "/"> AuthType Kerberos AuthName "Network Login" KrbMethodNegotiate On KrbMethodK5Passwd On KrbAuthRealms MYDOMAIN.LOCAL require valid-user Krb5KeyTab /etc/httpd/conf/httpd.keytab KrbLocalUserMapping On </Location>
Apache を再起動します。
service httpd restart
確認用のテストページは、先ほどの Basic 認証で作成したものをそのまま使います。 これで Web Server の設定は終わりです。
Windows にドメインログインします。 確認用のテストページを開く前に Windows のブラウザの設定をします。
IE の場合 「ツール」/「インターネット オプション」を開く。 「セキュリティ」タブを選択する。 「ローカル イントラネット」を選択する。 「サイト」ボタンを押す。 「ローカル イントラネット」ダイアログの「詳細設定」ボタンを押す。 「http://web01.mydomain.local」を追加する。 「レベルのカスタマイズ」ボタンを押す。 「イントラネット ゾーンでのみ自動的にログインする」にチェックを入れる。 「詳細設定」タブを選択する。 「統合 Windows 認証を使用する」にチェックを入れる。
Firefox の場合 アドレスバーに「about:config」と入力して以下のプロパティを設定する。 network.negotiate-auth.delegation-uris web01.mydomain.local network.negotiate-auth.trusted-uris web01.mydomain.local
Web ブラウザから「http://web01.mydomain.local」を開いてみます。 HTTP 認証 のダイアログなしに画面にドメインログインしているユーザIDが 表示されていれば OK です。 Basic 認証の時と違ってパスワードは表示されていないと思います。
Windows はドメインログインしていないとうまくいかないと思うけど Web Server はドメイン参加していなくても問題なさそうです。
おわりに
内々で使うちょっとしたサイトでユーザ認証がほしいという時には使えそうだ。 ユーザが所属するドメインのグループを条件にアクセス制限もかけられそうだ。 ガッツリ作りこむような Web アプリには厳しそうだ。 HTTP 認証のダイアログでなく独自のログイン画面がほしいだろうし ユーザID 以外の ActiveDirectory に登録された情報もほしいところだ。