FreeRADIUSとActiveDirectory(成功編)

FreeRADIUSの認証をActiveDirectoryに任せる。OpenLDAPへ認証を流す方法はすでにやったことがあって、ここにも書いたことがある。ActiveDirectoryってLDAPがお喋りできるよなぁとすこし調べたんですが、どうも期待するスキーマをもっていないようなのでLDAPでの連携は断念。Sambaを中間にいれてActiveDirectoryの認証をFreeRADIUSから利用することができました。

Sambaの設定

まずはSambaの設定。SambaとActiveDirectoryの連携はウェブ上にも情報があるし、文献も豊富なのでさらっと。

smb.confを設定

ドメイン名:MYDOMAIN、ActiveDirectoryが動作している機器のアドレスを10.1.100.1とすると、smb.confはこんな。

[global]
        dos charset = CP932
        unix charset = UTF-8
        display charset = UTF-8
        passdb backend = tdbsam

        socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
        lm announce = False
        local master = No
        domain master = No
        dns proxy = No
        realm = MYDOMAIN
        security = ads
        password server = 10.1.100.1
        idmap uid = 30000-40000
        idmap gid = 30000-40000
        winbind enum users = Yes
        winbind enum groups = Yes
        template shell = /bin/bash
        template homedir = /tmp

設定すべきところはrealmと,password server,securityくらいかな。あとはお好みで。

krb5.conf

/etc/krb5.confを設定。こんな内容。

[libdefaults]
 ticket_lifetime = 24000
 default_realm = MYDOMAIN
 dns_lookup_realm = false
 dns_lookup_kdc = false

[realms]
 MYDOMAIN = {
  kdc = 10.1.100.1
 }

[domain_realm]
 .mydomain = MYDOMAIN

default_realmのところに、smb.confで設定したrealmと同じ値を設定。それと[realms]のところでkdc=以下にActiveDirectoryが動作しているサーバのIPアドレスを設定。

/etc/hosts

/etc/hostsでActiveDirectoryが動作しているサーバの名前解決を書いてあげる。これ書いとかないとあとでドメインに参加するコマンドが失敗します。

10.1.100.1         AD.MYDOMAIN
kinitを実行

kinitを実行。Kerberos認証にチケットを取得するとかなんとからしいんだけど、正直よくわからん(笑)。まおまじないだね。

# kinit administrator
Password for administrator@MYDOMAIN:

入れるパスワードは当然ドメインのadministratorのもの。

ドメインに参加する。

netコマンドでActiveDirectoryのドメインに参加。

# net ads join
Password:
Joined DOMAIN MYDOMAIN

なぜかパスワードを聞いてきたが、なにも入れなくて成功したみたい。いいかげんだなぁ。

ここで試験

まずはsambaの認証がActiveDirectoryに渡っているか試験。wbinfoコマンドを使います。
winbinddを起動*1してから。

# /usr/local/sbin/winbindd
# wbinfo -a hogehoge%hogepass
plaintext password authentication failed
error code was NT_STATUS_NO_SUCH_USER(0xc0000064)
error message was:No such user
Could not authenticate user hogehoge%hogepass with plaintext password.
challenge/respons password authentication succeeded.

chapの認証がうまくいったようなので、OK。
次にFreeRADIUSの認証で仕様するntlm_authを使って試験します。

# /usr/local/samba/bin/ntlm_auth --request-nt-key --doamin=MYDOMAIN --username=hogehoge --password=hogepass
NT_STATUS_OK: Success(0x0)

ここまででSambaの設定は終了。

FreeRADIUSの設定

インストールはされているものとして。インストールディレクトリは/usr/local/bin,設定ファイルなどは/usr/local/etc/raddbなんかにあったりします。*2

radiusd.confを編集

modulesのセクションに以下の行を加えます。

        exec ntlm_auth {
                wait = yes
                program = "/usr/local/samba/bin/ntlm_auth --request-nt-key --doamin=MYDOMAIN --username=%{User-Name} --password=%{User-Password}"
        }

もう一ヶ所。authenticateのところにntlm_authって行を追加。

authenticate{
    ntlm_auth
    unix
}
usersファイル

デフォルトの認証手段がここに書いてあるので、ntlm_authを使いますよーと書いてあげます。

DEFAULT Auth-Type = ntlm_auth
        Fall-Through = 1
FreeRADIUSを起動

まずはデバッグモードで起動。

# /usr/local/sbin/radiusd -X
(中略)
Module: Instantiated files (files) 
Listening on authentication *:1812
Listening on accounting *:1813
Ready to process requests.

Ready to process request.と出てきたら準備完了。

FreeRADIUSで認証を確認

radtestコマンドを使います。これも以前に紹介しましたね。

# radtest hogehoge hogepass localhost 0 testing123
Sending Access-Request of id 185 to 127.0.0.1 port 1812
	User-Name = "hogehoge"
	User-Password = "hogepass"
	NAS-IP-Address = 255.255.255.255
	NAS-Port = 0
rad_recv: Access-Accept packet from host 127.0.0.1:1812, id=185, length=20

Access-Acceptってことで認証が通ったようです。めでたしめでたし。
今回実験した環境ではすでにSambaがActiveDirectoryと連携している実績があるサーバ上でやったため、sambaの設定まわりには抜けがあるかも。
FreeRADIUSの設定あたりはスクラッチからやったので多分間違いないと思います。

*1:もう動作していたら再起動

*2:2010年1月26日追記。FreeRADIUS2.0.5以降だとデフォルトの設定ファイルの位置がすこし違います。詳細は2010年1月25日のエントリを参照。