連載 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
の記述例
|
サーバがドメイン構成でないなら、/etc/pam_smb.confのドメイン名の指定は重要ではありません。ワークグループ名でも指定しておきましょう。
■pam_smb.conf
の注意点
pam_smb.confファイルの記述には、いくつか注意点があります。pam_smbのソースを眺めてみたところ、以下のような問題点がありました。
- バックアップ用のホストの指定は省略できない。
- ホスト名の名前解決は 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 を利用)
|
アプリケーションが利用する PAM モジュールの指定と設定は、アプリケーションが提供するサービス名をファイル名にして/etc/pam.d
ディレクトリ以下に保持されます。
私の環境では以下のようなサービス別PAM設定ファイルがおかれています。ただし、「other
」ファイルはデフォルトの設定を記述するためのファイルです。
$ls /etc/pam.d |
「login」は、login(1)が参照するPAM設定ファイルです。login コマンドは、コンソールやTelnetからのログイン時に起動され、 ユーザーからユーザー名とパスワードを受け取り認証し、セッションを開始します。
このファイルを書き換えて、ユーザー認証にpam_smbモジュールを使うように設定してみましょう。以下は、Debianインストール直後のloginファイルの中身です。ただし、コメントや空白行は省いてあります。このファイルのコメントには多量の有用な情報が含まれているので、一読してみることをお奨めします。
/etc/pam.d/login
ファイルの中身 (コメントと空白行は除外)
|
このように設定ファイルの各行は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 を使うように書き換え
|
コンソールもしくはTelnetでログインしてみましょう。Sambaに登録されているユーザー名とパスワードでログインできるはずです。ただし、認証情報以外のユーザーのUNIXアカウント情報が必須なので、SambaだけでなくUNIXにも同名のユーザーを登録しておかなければなりません。
ログインに成功すると、pam_smbのデバッグ情報がsyslogd(8)のログファイルに記録されるでしょう。
ログイン成功時の/var/log/auth.log
のログ (時間とホスト名は除外)
login[756]: pam_smb: Local UNIX username/password check incorrect.
|
ご覧のように、pam_smbはSMBサーバへのログインを試みる前に、ローカルのUNIXパスワード情報を参照してユーザ認証を行っていることがわかります。UNIXパスワード認証に成功すると、SMBサーバへのログインは実行されません。
UNIXパスワード認証をさせたくないなら、pam_smbモジュールの起動オプションに「nolocal」オプションを指定することで、これを抑制できます。しかし、このオプションはrootを含む全ユーザが対象となるため、SMBサーバが停止していると誰もログインできなくなってしまいます。
nolocalオプションを利用するよりも、UNIXパスワード認証をさせたくないユーザーのパスワードを無効にする方法をお勧めします。Debianではpasswdコマンドでパスワードを無効にできます。もしくは、ユーザーの作成時にパスワードを無効にしておけばよいでしょう。
# passwd -l fumiya |
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系列の新機能、インストール方法、国際化の現状を解説する |
|
|
- 【 pidof 】コマンド――コマンド名からプロセスIDを探す (2017/7/27)
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、コマンド名からプロセスIDを探す「pidof」コマンドです。 - Linuxの「ジョブコントロール」をマスターしよう (2017/7/21)
今回は、コマンドライン環境でのジョブコントロールを試してみましょう。X環境を持たないサーバ管理やリモート接続時に役立つ操作です - 【 pidstat 】コマンド――プロセスのリソース使用量を表示する (2017/7/21)
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、プロセスごとのCPUの使用率やI/Oデバイスの使用状況を表示する「pidstat」コマンドです。 - 【 iostat 】コマンド――I/Oデバイスの使用状況を表示する (2017/7/20)
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、I/Oデバイスの使用状況を表示する「iostat」コマンドです。
|
|