2014年5月17日土曜日

Samba4 で ActiveDirectory / Apache で Windows 統合認証

はじめに

ユーザアカウントをそれぞれのシステムで別々に管理するのでなく
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 に登録された情報もほしいところだ。
参考URL
https://wiki.samba.org/index.php/Samba4/beyond
https://community.zarafa.com/pg/blog/read/18332/zarafa-outlook-amp-webaccess-sso-with-samba4
http://int128.hatenablog.com/entry/20130829/1377768762
http://passing.breeze.cc/mt/archives/2008/12/active-directory-apache-window.html