連載 Samba Tips!

Sambaユーザーのパスワード管理
PAMを利用して認証を行う

ユーザー認証を実行するPAMシステムを利用すると、アプリケーションからユーザー認証を独立させることができる。このPAMをSambaと組み合わせることで、UNIXとSambaのパスワードの同期を行うことが可能だ。
今回はこのPAMを利用する方法について解説しよう

佐藤文優 <fumiya@samba.gr.jp>
株式会社デジタルデザイン

日本Sambaユーザ会

2000/6/21

PAMとは?

 前回に引き続き、SambaパスワードとUNIXパスワードの同期を実現する方法について解説します。今回は、PAMを利用する方法を紹介しましょう。

 PAM(Pluggable Authentication Module)とは、 各種の認証処理を実行するモジュール群と、 それを利用するための標準的なAPI(Application Programming Interface)を備えたライブラリからなるユーザー認証システムのことです。 ユーザーに各種サービスを提供するアプリケーションプログラムは、PAMのAPIを通してPAMモジュールに認証処理を依頼することができます。

PAMの仕組み


PAM には以下のようなメリットがあります。

  • アプリケーションから認証処理を独立させることができる。アプリケーションはPAMのAPIを利用するだけで認証を行える。
  • PAMはアプリケーションから見たインタフェースが標準化されているため、システムが異なってもソースの互換性が保たれる。
  • PAMモジュールを入れ替えることで、アプリケーションに手を加えずに認証方式を動的に変更できる。

 PAMに対応しているシステムは、Solaris、HP-UX、FreeBSD、Red Hat Linuxとそこから派生したLinuxディストリビューション (TurboLinux など多数)などがあります。私が常用しているDebian GNU/Linux 2.2も標準で対応しています。Linuxでは「Linux-PAM」と呼ばれるPAMシステムが採用されています。Linux-PAMに関する詳細はhttp://www.kernel.org/の「A Linux-PAM page」を参照してください。

 PAMを搭載したシステムでは、認証を必要とするほとんどのアプリケーションがPAM対応に作られており、標準の状態では/etc/passwdファイル(あるいは /etc/shadow など)の情報を元に認証を行うPAMモジュールを使うように設定されています。このPAMモジュールは、アプリケーションに代わって従来のUNIXパスワード認証を行っているに過ぎません。

SMB認証を行うPAMモジュール

 PAMのユーザー認証モジュールは、/etc/passwdファイルでユーザー名とパスワードを確認する代わりに、各種データベースサーバ(Oracleなどの、いわゆる普通のデータベースサーバやLDAPサーバなど)にパスワード情報を問い合わせて照合する機能を備えたモジュールと、ユーザーから受け取った認証情報を別のユーザー認証システム(RADIUSサーバなど)に渡して認証結果を得るモジュールの2種類に大別されます。

 今回紹介するpam_smbモジュールは後者の方式です。このモジュールは、アプリケーションから受け取ったユーザー名とパスワードを用い、指定されたSMBサーバにログインを試みることで、ユーザー認証の結果を判定します。

 PAMはユーザー認証のほかにもアカウントやセッションの管理、パスワードを変更するための枠組みも用意されているのですが、現在のpam_smb 1.1.5ではユーザー認証にしか対応していません。将来のバージョンではパスワード変更の対応、UNIXとSMBサーバ間のユーザー名のマッピング、デーモンプロセスによる認証の高速化などが実装されるようです。pam_smbに関する最新情報は、「PAM_SMB:NT Authentication for Linux」のページをご覧ください。最新版の pam_smb のほか、FAQ や開発中のバージョンなどが公開されています。

pam_smbの利用

 前回と同じく、以下、Debian GNU/Linux 2.2 (potato) における例を示しましょう。

 注意:PAMの設定に誤りがあると、rootを含め全ユーザーがログインできなく なり、復旧が難しくなる恐れがあります。実験中はrootユーザーを最低1つはログインさせたままにしておき、PAM の設定を戻せる状態に しておくことをお勧めします。

pam_smbの設定

 pam_smbのDebianパッケージの名前は「libpam-smb」です。apt(advanced package tool)が利用できるようになっているなら、 rootになって以下のコマンドを実行するだけでインストールできます。

# apt-get install libpam-smb

 バイナリパッケージでなく、pam_smbのソースを入手してコンパイルした場合は、コンパイルしたPAMモジュール pam_smb_auth.soを適切なディレクトリにインストールしてください (/lib/securityが一般的です)。

 PAMモジュールの設定ファイルは、Debianでは/etc/securityディレクトリ以下に置くのが標準となっているようですが、libpam-smbパッケージのpam_smbは/etc/pam_smb.confを参照するようにコンパイルされています。これはpam_smbをソースからコンパイルした場合のデフォルトです。

 pam_smb.confファイルには、1行目にはログイン先のWindows NTドメイン名、2行目と3行目にはログイン先のSMBサーバのホスト名を記述します。2行目に記述したサーバへの接続に失敗すると、バックアップとして3行目のサーバへ接続してログインを試みます。ログインはどちらか一方にしか行いません。

/etc/pam_smb.conf の記述例

DOMAIN
SUGAR
SALT

 サーバがドメイン構成でないなら、/etc/pam_smb.confのドメイン名の指定は重要ではありません。ワークグループ名でも指定しておきましょう。

■pam_smb.confの注意点

 pam_smb.confファイルの記述には、いくつか注意点があります。pam_smbのソースを眺めてみたところ、以下のような問題点がありました。

  1. バックアップ用のホストの指定は省略できない。
  2. ホスト名の名前解決は gethostbyname(3) でしか行わない。

 (1)の問題は、pam_smbの設定ファイルの読み込み処理に例外処理が欠けているためです。このため、pam_smb.confファイルには必ず3行以上含めなければなりません(4行目以降は無視されます)。また、1〜3行目にはコメントや余計な空白文字、空白行など含めることはできません。

 (2)の問題は、NetBIOS名の名前解決方法であるWINSサーバへの問い合わせ、 ローカルサブネットワークへのブロードキャスト、lmhostsファイルの参照などを利用できないということです。pam_smbの動作するホストの設定にもよりますが、gethostbyname関数は/etc/hostsファイルの検索とDNSサーバへの問い合わせを行います。

 ではホスト名をDNS名で指定すればよいかというと、そうもいきません。pam_smbはこのホスト名をそのままNetBIOS名としても用いているため、サーバのDNS名とNetBIOS名を同一にしておかなければならないという制限が発生します。SMBプロトコルの認証コマンドにはサーバのNetBIOS名が含められており、Windows は自分以外の NetBIOS 名が含まれたコマンドには応答を拒否します。ただし、Sambaにはそのような制限がないため、今回の目的ではSambaサーバのDNS名あるいはIPアドレスを指定しておけばよいでしょう。

 私は同一ホスト上のSambaサーバを利用するように、以下のような設定にしました。

/etc/pam_smb.conf の記述例 (同一ホスト上の Samba を利用)

MYGROUP
localhost
localhost

■アプリケーション用のPAMの設定

 アプリケーションが利用する PAM モジュールの指定と設定は、アプリケーションが提供するサービス名をファイル名にして/etc/pam.dディレクトリ以下に保持されます。

 私の環境では以下のようなサービス別PAM設定ファイルがおかれています。ただし、「other」ファイルはデフォルトの設定を記述するためのファイルです。

$ls /etc/pam.d
chfn chsh ftp login other passwd samba ssh su sudo

 「login」は、login(1)が参照するPAM設定ファイルです。login コマンドは、コンソールやTelnetからのログイン時に起動され、 ユーザーからユーザー名とパスワードを受け取り認証し、セッションを開始します。

 このファイルを書き換えて、ユーザー認証にpam_smbモジュールを使うように設定してみましょう。以下は、Debianインストール直後のloginファイルの中身です。ただし、コメントや空白行は省いてあります。このファイルのコメントには多量の有用な情報が含まれているので、一読してみることをお奨めします。

/etc/pam.d/login ファイルの中身 (コメントと空白行は除外)

auth requisite pam_securetty.so
auth required pam_nologin.so
auth required pam_env.so
auth required pam_unix.so nullok

account required pam_unix.so
session required pam_unix.so
session optional pam_lastlog.so
session optional pam_motd.so
session optional pam_mail.so standard noenv
password required pam_unix.so nullok obscure min=4 max=8

 このように設定ファイルの各行は3つのフィールドで構成され、それぞれPAMモジュールの管理グループの種類、認証処理に失敗したときの制御、PAM モジュールのファイル名と起動オプションを記述します。

 安全な端末からのみrootのログインを許可するpam_securettyモジュール、起動時、シャットダウン時やメンテナンス時などに/etc/nologinファイルを作成することでユーザーのログインを拒否できるpam_nologinモジュール、ログイン/ログアウトの時間などをlast(1)コマンドで表示されるログに記録するpam_lastlogモジュールなどが指定されていますが、この中でUNIXパスワード認証を指定しているのが4行目のpam_unixモジュールの記述です(参考までに、Red Hat Linuxなどではpam_pwdbが標準のようです)。

 この行を以下のように書き換えます。pam_smbモジュールのファイル名は「pam_smb_auth.so」です(PAMのモジュールファイルは/lib/security以下に置かれています)。「debug」オプションは、syslogd(8)のauthファシリティにデバッグ情報を送らせる指定です。私の環境では/var/log/auth.logファイルに送られるようになっています(/etc/syslog.confの設定による)。

ユーザー認証に pam_smb を使うように書き換え

auth requisite pam_securetty.so
auth required pam_nologin.so
auth required pam_env.so
auth required pam_smb_auth.so debug

account required pam_unix.so
session required pam_unix.so
session optional pam_lastlog.so
session optional pam_motd.so
session optional pam_mail.so standard noenv
password required pam_unix.so nullok obscure min=4 max=8

■試してみよう!

 コンソールもしくはTelnetでログインしてみましょう。Sambaに登録されているユーザー名とパスワードでログインできるはずです。ただし、認証情報以外のユーザーのUNIXアカウント情報が必須なので、SambaだけでなくUNIXにも同名のユーザーを登録しておかなければなりません。

 ログインに成功すると、pam_smbのデバッグ情報がsyslogd(8)のログファイルに記録されるでしょう。

ログイン成功時の /var/log/auth.log のログ (時間とホスト名は除外)
login[756]: pam_smb: Local UNIX username/password check incorrect.
login[756]: pam_smb: Configuration Data, Primary
   localhost, Backup localhost, Domain MYGROUP.
login[756]: pam_smb: Correct NT usernmae/password pair
PAM_unix[756]: pam_smb: (login) session opened for
   user fumiya by LOGIN(uid=0)

 ご覧のように、pam_smbはSMBサーバへのログインを試みる前に、ローカルのUNIXパスワード情報を参照してユーザ認証を行っていることがわかります。UNIXパスワード認証に成功すると、SMBサーバへのログインは実行されません。

 UNIXパスワード認証をさせたくないなら、pam_smbモジュールの起動オプションに「nolocal」オプションを指定することで、これを抑制できます。しかし、このオプションはrootを含む全ユーザが対象となるため、SMBサーバが停止していると誰もログインできなくなってしまいます。

 nolocalオプションを利用するよりも、UNIXパスワード認証をさせたくないユーザーのパスワードを無効にする方法をお勧めします。Debianではpasswdコマンドでパスワードを無効にできます。もしくは、ユーザーの作成時にパスワードを無効にしておけばよいでしょう。

# passwd -l fumiya
Password changed.

Samba関係のそのほかのPAMモジュール

 http://www.kernel.org/の「Linux-PAM modules etc. page」をのぞくと、「SAMBA」の項目にpam_smb以外の有用なPAMモジュールが見つけられます。

pam_smb_passwd
SMBサーバ上のユーザのパスワード変更を行うPAM モジュールです。

pam_smbpass
SMBサーバを利用せずに、ローカルのSambaパスワードファイル(smbpasswd)を直接参照する認証モジュールです。

pam_ntdom
pam_smbをベースに開発されたモジュールで、ドメインコントローラにNTドメインの認証プロトコル用いて通信します。現在広く公開されているpam_ntdom 0.23は古い実装で、Sambaの実験的実装である「Samba TNG (The Next Generation)」(http://www.kneschke.de/projekte/samba_tng/index.php3参照) とともに開発が続けられているようです。

 PAM対応のパスワード変更モジュールであるpam_pwexportも紹介しておきましょう。このモジュールは、アプリケーションから受け取った認証情報(通常はユーザー名とパスワード)と新しいパスワードを、指定された外部コマンドにそのまま渡すことができます。 付属の README ファイルにはsmbpasswd コマンドを利用する例があるように、任意のパスワード変更コマンドを利用することができます(この例では、パスワードをコマンドラインで渡しているため、psコマンドなどでほかのプロセスのコマンドライン引数を参照できる環境では問題があるでしょう)。

 pam_pwexportはhttp://peter.cadcamlab.org/misc/から入手できます。現在のバージョンは0.0で、開発が始まって間もないβ版のような段階ですので、特に注意が必要でしょう。

■更新履歴(2000/10/6)
PAMのインストール時の注意などを追加。

連載 Samba Tips


 Linux Squareフォーラム サーバ構築・運用関連記事
連載:Heartbeatでかんたんクラスタリング(連載中)
オープンソースソフトウェアの「Heartbeat」を使ってHAクラスタを実現し、サービスを「落とさない」仕組みを実現します
特集:Apache 2.2でWebサイトをパフォーマンスアップ!
最新安定版Apache 2.2は、何が変わったのか? 最新のApacheを新機能の使い方とともに解説する
連載:実用 Apache 2.0運用・管理術(全8回)
本連載では、Apache 2.0の運用や管理方法を解説する。まず必須設定と基本的なセキュリティ対策を行い今後の運用に備える
連載:実用 BIND 9で作るDNSサーバ(全15回)
本連載では、BIND 9の構築/運用方法を解説していく。実際に役立つことを目的に、セキュリティや大規模運用などのテーマを取り上げていく
連載:実用qmailサーバ運用・管理術(全14回)
本連載を通して、qmailによるメールサーバの高度な構築・運用・管理術を紹介。SPAM対策やML管理からサーバでのウイルスチェックなどまで
特集:Samba 3.0の全貌 改訂版
Samba 3.0リリースから8カ月。ここであらためて、Samba 3.0系列の新機能、インストール方法、国際化の現状を解説する

MONOist組み込み開発フォーラムの中から、Linux関連記事を紹介します


Linux & OSS フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Linux & OSS 記事ランキング

本日 月間