Active DirectoryとLinuxの認証を統合しよう

最終回 SambaのWinbind機構による認証統合[2]

前回はSambaのWinbind 機構による認証統合の前段として、まずはSamba自身の認証をADに統合する方法を説明しました。今回は、PAM機構経由でSamba以外の各種プロダクトも含めた、本来の意味での認証統合を実施する方法について説明します。

pam_winbindモジュールのインストールと最低限の設定

pam_winbindモジュールを用いることで、ssh/telnet/ftpといったPAMに対応した一般的なプロダクトの認証や認可をWinbind機構が提供するWindowsドメインの認証情報を使って行うことが可能となり、Sambaサーバに対する認証が完全にWindowsドメインに統合されます。

CentOS 5.3の場合、pam_winbindモジュールは、samba-commonパッケージの中に含まれています。sambaパッケージをインストールしていればその過程でsamba-commonパッケージもインストールされているはずです。

引き続き、以下のコマンドを実行してPAMの設定ファイル(/etc/pam.d/system-auth)を更新します。

# authconfig --enablewinbindauth --update

これにより、Winbind機構により、Samba以外のプロダクトでユーザ認証を行うことが可能となります。また、前回説明したようにWinbind機構では各ユーザのホームディレクトリの自動作成は行われませんので、ホームディレクトリの自動作成の設定を行っておくことを強くお薦めします。以下、ホームディレクトリの自動作成の設定を行っている前提で説明します。

ここまでの設定を行った段階で、sshなどでログインしようとしても、以下のように認証に成功した直後に切断されてしまいます。

$ ssh centos53 -l 'W2K8AD1\samba01'
W2K8AD1\samba01@centos53's password:
Last login: Wed May 20 21:45:51 2009 from centos53
Connection to centos53 closed.

これは前回の動作確認の際に示したように、セキュリティ上デフォルトではWinbind機構で生成したユーザのシェルとして/bin/falseという無効なシェルが指定されているためです。またデフォルトのホームディレクトリは「/home/ドメイン名/ユーザ名」というLinuxでは一般的ではない構成となっていますので、こちらも変更したいケースが多いと思います。

# getent passwd 'W2K8AD1\samba01'
W2K8AD1\samba01:*:10000:10002:samba 01:/home/W2K8AD1/samba01:/bin/false

Sambaではtemplate shellおよびtemplate homedirパラメータにより、各ユーザのシェルとホームディレクトリを設定することが可能です。たとえばホームディレクトリを「/home/ユーザ名」形式とし、シェルを/bin/bashとする場合の設定例を以下に示します。

リスト1 シェルとホームディレクトリをデフォルトから変更する
[global]
  ...
  template shell = /bin/bash
  template homedir = /home/%U

%Uはユーザ名を意味する変数になります。template homedirパラメータのデフォルト値は「/home/%D/%U」となっています。%Dはユーザの所属ドメインに展開される変数です。上記の設定を行うことで、以下のようにSambaサーバへのログインが可能となります。

$ ssh centos53 -l 'W2K8AD1\samba01'
W2K8AD1\samba01@centos53's password:  ←パスワードを入力
Creating directory '/home/samba01'.   ←ホームディレクトリの自動作成が行われている
Last login: Thu Jun 25 23:21:11 2009 from 192.168.135.31
[W2K8AD1\samba01@centos53 $

このように、すでにWinbind機構が動作している環境であれば、サーバへのログイン時の認証をWinbind機構に統合するのはそれほど難しくありません。以下、ここまでの設定をベースに応用設定を幾つか紹介します。

ユーザ名のカスタマイズ

デフォルトでは、上記のようにUNIXユーザ名を「ドメイン名\Sambaユーザ名」形式で指定する必要があります。このためユーザ名を指定する際にクォーテーションを行う等配慮が必要です。

この点が問題となる場合は、winbind separatorパラメータを用いてWindowsドメイン名とユーザ名との間の区切り文字をデフォルトの「\」から、⁠_」などの無難な文字に変更することをお薦めします。例えば以下のように設定した場合、生成されるUNIXユーザ名は「W2K8AD1_samba01」といった形式になります。

リスト2
[global]
  ...
  winbind separator = _

また、ドメイン名情報自体が不要であるという場合は、以下のようにwinbind use default domainパラメータを設定することでWinbind機構が生成するユーザ名からWindowsドメイン名の情報を削除することが可能です。

リスト2
[global]
  ...
  winbind use default domain = yes

この指定を行った状態で、idコマンドを実行した際の表示を以下に示します。

$ id 'W2K8AD1\samba01'
uid=10001(samba01) gid=10000(domain users) groups=10000(domain users)
$ id samba01
uid=10001(samba01) gid=10000(domain users) groups=10000(domain users)

この設定を行う場合は、Winbind 機構によって生成されたUNIXユーザと既存のUNIXユーザの名前が重複しないように注意してください。

この他、空白の入ったユーザ名などを扱いやすくするために、winbind normalize namesパラメータが用意されています。このパラメータをyesに設定することで、以下のように、たとえば「domain users」というWindowsのグループ名に対応するUNIX側のグループ名が「domain_users」というUNIX側で扱いやすいユーザ名になります。

これにより、Winbind機構利用時にUNIX側の利便性が若干ですが向上します。

$ id 'W2K8AD1\samba01'
uid=10001(W2K8AD1\samba01) gid=10000(W2K8AD1\domain_users) groups=10000(W2K8AD1\domain_users)

シェルとホームディレクトリをユーザごとに設定する

前述した通り、template shellおよびtemplate homedirパラメータによりWinbind機構が生成するユーザのシェルおよびホームディレクトリの設定が可能ですが、この設定方法は簡便な反面、全ユーザ一律の設定しかできないという制限があります。以下のようにwinbind nss infoパラメータを用いることで、これらの情報をADのUNIX属性から取得することが可能になります。

winbind nss infoパラメータの設定例を以下に示します。

リスト3
[global]
  ...

  winbind nss info = rfc2307(sfu)

デフォルト値(template)の場合は、従来と同様template shell/homedirパラメータの値により、ユーザ属性が設定されます。sfuやrfc2307の場合は、SFU/SUAのNISサーバー機能がインストールされ、Active DirectoryのスキーマにUNIX属性が拡張された環境において、UNIX属性に格納された各ユーザのシェルやホームディレクトリの値が用いられます。

sfu/rfc2307の値は、UNIX属性を有効にしたプロダクトがSFU 3.5/3.0か、SUAかによって使い分けます。

図1 Samba 01ユーザのUNIX属性
図1 Samba 01ユーザのUNIX属性

UNIX属性を図1のように設定したSamba 01ユーザの属性を、UNIX側で参照した例を以下に示します。

$ getent passwd 'W2K8AD1\samba01'
W2K8AD1\samba01:*:10001:100::/home/samba01:/bin/tcsh

UNIX属性が有効になっていないユーザのシェル、ホームディレクトリについては、従来通り、template shell/template homedirパラメータの値が参照されます。これにより、Winbind機構で生成される大半のユーザについては「/bin/false」といった無効なシェルを設定したいが、一部のユーザはUNIXマシンにログインできる有効なシェルを与えたいといった要望を実現することが可能となります。

ただし、この設定を行っただけでは、UNIX属性のUID/GIDの値は参照されませんので注意してください。

UIDやGIDをADから取得する

前回説明したように、デフォルトではWinbind機構がADのユーザ情報から生成したユーザに割り当てられるuidやgidの値としては、idmap uidやidmap gidパラメータで設定した範囲の値が先頭から順に払い出されます。

この払い出しはIdmapという機構により制御されています。

Idmap機構としてadを用いる

Idmap機構としてadを用いることで、UNIX属性のUIDやGIDをADのUNIX属性から払い出すことが可能になります。

あらかじめUNIX属性を有効にして、必要なユーザについてUNIX属性を有効にした上で、Samba側ではsmb.confに以下のような設定を行います。

リスト4
[global]
  ...
  idmap domains = W2K8AD1       ←Idmap機構を設定するドメイン名(複数指定可)
  idmap config W2K8AD1:backend = ad           ←使用するIdmap機構
  idmap config W2K8AD1:schema_mode = rfc2307  ←スキーマの形式
  idmap config W2K8AD1:range = 10000-200000   ←割り当てるuid/gidの値の範囲

上記ではW2K8AD1というドメインしか設定していませんが、idmap domainsパラメータにドメイン名を列挙した上で、⁠idmap config ドメイン名:...」というパラメータを設定することでドメイン毎に異なるIdmap機構を用いることが可能となっています。

idmap config W2K8AD1:schema_modeパラメータの値には、ADでUNIX属性を導入している方式に応じてsfu30もしくはrfc2307を選択します。

上記の設定を行った環境で、図1のユーザの情報を参照した際の実行例を以下に示します。

# id 'W2K8AD1\samba01'
uid=13006(W2K8AD1\samba01) gid=11000(W2K8AD1\domain users) groups=11000(W2K8AD1\domain users),10007(BUILTIN\users)
 ↑
UIDについてUNIX属性の値が反映される。

「W2K8AD1\domian users」グループのUNIX属性でGIDを11000にしています。

なお、UNIX属性が存在しないユーザやグループは、Linux上では無効になりますので注意してください。

Idmap機構としてridを用いる

Idmap機構としてridを用いることで、UIDやGIDの値としてSIDに含まれるRIDという値から機械的に計算した値が用いられるようになります。SIDとはWindows側で各種オブジェクトを一意に識別する値で、たとえば

S-1-5-21-1234995458-293493368-1744720997-513

のような長い値となっています。この最後の「513」の部分がRIDと呼ばれます。ridを用いる場合、AD側でUNIX属性などのアドオンをインストールする必要はありません。

Samba側では、smb.confに以下のような設定を行います。

リスト5
[global]
  ...
  idmap domains = W2K8AD1     ←Idmap機構を設定するドメイン名(複数指定可)
  idmap config W2K8AD1:backend = rid     ←使用するIdmap機構
  idmap config W2K8AD1:base_rid = 0      ← 割り当て対象とする最小のridの値
  idmap config W2K8AD1:range = 10000-200000  ←割り当てるuid/gidの値の範囲

これにより、0以上(すべて)のridがWinbind機構によるuid/gid割り当ての対象となります。rangeで指定された最小値が10000のため、ridが0の場合、割り当てられる値は10000となり、以降1なら10001、2なら10002といった具合に機械的に割り当てが行われます。そのため、割り当てのデータベースを保持する必要がありません。ridによる割り当ての例を以下に示します。

# id 'W2K8AD1\samba01'
uid=11111(W2K8AD1\samba01) gid=10513(W2K8AD1\domain users) groups=10513(W2K8AD1\domain users),10007 context=root:system_r:unconfined_t:SystemLow-SystemHigh

上記の値から逆算すると、たとえばW2K8AD1\samba01のRIDは1111であることがわかります。

まとめ

ここまで説明した通り、Winbind機構を用いることでSamba以外のサービスも含めた認証統合が実現できます。また各種パラメータを設定することで、ユーザ名カスタマイズやUID/GID取得/生成ルールの変更など、さまざまなカスタマイズが可能です。

特にさまざまなカスタマイズ機能を用いる場合、設定自体は若干繁雑な点はありますが、至難というほどではないと思います。柔軟性なども勘案すると、本格的な認証統合の方式としては、筆者はWinbind機構の使用をお薦めします。


ここまで全6回にわたり、WindowsとLinuxの認証統合の方法について説明しました。本連載が読者の方の助けになれば幸いです。


Active Directoryに関する技術情報:
Microsoft TechNet Active Directory TechCenter
URL:http://technet.microsoft.com/ja-jp/activedirectory/default.aspx
Microsoft Active Directory 機能概要ページ
URL:http://www.microsoft.com/japan/ad/

おすすめ記事

記事・ニュース一覧