連載 Samba Tips!
Sambaユーザーのパスワード管理
UNIXパスワードと同期させる
UNIXとWindowsの間でファイル交換を可能にするSamba。
SambaのUNIX環境とWindows環境のパスワードを自動的に同期する機能をうまく利用すると、TelnetやFtpなどのUNIXサービスのパスワードと、Windowsからのファイル共有のパスワードをつねに同一に保つことができる
佐藤文優 <fumiya@samba.gr.jp>
株式会社デジタルデザイン
日本Sambaユーザ会
2000/5/22
パスワード同期の手段
Sambaを利用する上でもっとも悩ましい問題のひとつは、SambaのパスワードとSamba以外のUNIXのネットワークサービス(Telnet、FTPなど)のパスワードとの同期に関してでしょう。
これを解決する手段としては、以下の方法があります。
- Sambaを平文(非暗号化)パスワード認証に設定して運用する
- SambaによるSambaパスワードと、UNIXパスワードの同期機能を利用
- PAM(Pluggable Authentication Module)によりUNIXサービスのユーザー認証をSambaサーバで行う
(1)は Windows 95やNT 3.5/4.0のリリース当時、もっとも簡単で一般的な方法でした。平文パスワード認証ではUNIXのパスワード情報を利用することができます。しかし、最近の Windowsクライアントが平文パスワードの送信を拒否するように設定されていたりしていたり、一般利用者のセキュリティに対する関心が高まったためか、次第にこの平分パスワード認証は利用されなくなってきているようです。また、ドメインコントローラ機能を利用するには暗号化パスワードが必須である点、NTにおいて共有への自動再接続を行う場合、サーバが暗号化パスワードをサポートしていないと接続のたびにパスワードの入力を求められる点など、平文パスワード認証ではいくつかの制限が発生することも、利用者を減らしている一因かもしれません。
(2) は、Sambaパスワードが変更されたときに、同時にUNIXパスワードも同じパスワードに変更することで同期をとる機能です。パスワード情報はSambaとUNIX、それぞれ異なる場所・形式で保持されます。
(3)の方法は、UNIXのサービスがユーザーから受け取った認証情報を用いてSambaサーバにログインを試みることで、認証の判定を行います。PAMとは名前が示す通り、交換可能な認証モジュールのことで、PAMに対応したサービスでは認証モジュールを交換するだけで、認証方式を簡単に切り換えることができます。ただし、PAMを利用して認証を行っていないサービスでは、当然ながらPAMの影響は受けません。
そこで今回は、(2)のSambaによるパスワード同期機能について、実際の設定例を紹介しながら解説しましょう。
SMBの認証方式
パスワード同期機能の解説の前に、Windowsネットワークが利用してるSMB(Server Message Block)の認証方式を簡単に紹介し、 UNIXのパスワード情報がSambaで利用できない理由を明らかにしておきます。
WindowsネットワークのプロトコルであるSMBでは、大まかに分けて「共有レベル」と「ユーザーレベル」のセキュリティレベル (認証方式) があります。前者はサービスへのアクセス権限ごとにパスワードを設け、パスワードだけで認証を行います。これは、Windows 95/98 のデフォルトの方式です。後者はユーザーに対してパスワードを割り当て、サービスへのアクセス権はユーザごと(あるいは複数のユーザを包含するグループ)に与えます。こちらはWindows NTの方式です。
一方UNIXはというと、SMBでいうユーザーレベルのセキュリティに相当する認証方式をとっています。 また、Sambaでは共有レベルのセキュリティをシミュレートすることができます(security
パラメータを
share
に設定)。しかし、この場合は権限ごとに対応するユーザーを用意しなくてはならないうえ、複雑なアクセス権の設定が困難であるなど、あまりおすすめできません。
さらにSMBの認証情報の交換プロトコルには、パスワードをそのままクライアントからサーバに渡す「平文パスワード認証」と、パスワードを暗号化して渡す「暗号化パスワード認証」の2つがあります(「平文」は「ひらぶん」あるいは「へいぶん」と読みます)。 しかし、Windows 98では暗号文パスワードを利用するようになっていることもあり、最近のWindowsネットワークでは平文パスワードだけが扱えればいい、というわけにはいかなくなっています。
平文パスワード認証の場合、Sambaは受け取ったパスワードをUNIXの認証方式に従って検証することができますが、暗号化パスワードの場合は、SMB方式で暗号化されたパスワードをUNIXの認証方式に適用することができません。SMBの暗号化パスワードは、平文のパスワードをある一定のルールでハッシュ化し、サーバに渡すときにはさらにサーバから提示されたキーで暗号化することで生成されます。一方UNIXでは、ユーザーのパスワードをSMBとは異なる方式でハッシュ化し、保存しています。また、UNIXとSMBどちらのハッシュ化方式も不可逆な演算を用いているため、ハッシュ化されたパスワードから平文のパスワードを求めることはできません。そのため、ハッシュ化された文字列から元の文字列に戻して照合すると行ったことも不可能です。
これらの理由で、SMBクライアントから渡された暗号化パスワードでは、その元となった平分パスワードがUNIXのパスワードと一致するかどうかを検証することはできません。よって、Sambaで暗号化パスワード認証を行うには、UNIXとは別にSamba用のパスワード情報を保持する必要があるのです。
Sambaのパスワード同期の仕組み
UNIXと呼ばれるOSは多数ありますが、ユーザーのパスワード情報を変更するための共通 API は残念ながら存在しません。唯一共通しているのは、パスワード情報変更コマンドとして/bin/passwd
(もしくは
/usr/bin/passwd
など) が用意されているだけです。
Sambaサーバは、unix password sync
パラメータを「yes
」に設定することで、Sambaパスワードが変更されるタイミングでUNIXのパスワード変更コマンドを起動することができます。このコマンドは
passwd program
パラメータで指定します。
ほとんどのUNIXでは、 passwdコマンドは対話型でパスワードを受け取るように作られており、標準入力もしくはコマンドライン引数からパスワードを与えることはできません。そこでSamba は、端末からpasswdコマンドを起動したときと同様に、対話的に情報をやりとりします。つまり、passwdコマンドからのメッセージ(パスワード入力のプロンプトなど)を受け取り、それに対して応答する(パスワードを送るなど)、といった対話(chat)を行います。
対話の内容、特にpasswdコマンドから示されるメッセージが、UNIXの種類に依存するのはもちろん、OSのバージョンや設定によっても異なります。Sambaでは、passwd
chat
パラメータで対話の内容と手順を指定することで、この問題に対応できます。
Sambaの設定
■関連するパラメータ
それでは同期が機能するための設定を順を追って紹介しましょう。設定はSambaの設定ファイルsmb.conf
の[global]
セクションに記述します。関連するパラメータを以下に挙げます(デフォルト値はSambaのパッケージによって異なることがあります)。
unix password sync
- タイプ: 真偽値
- デフォルト値:
no
- 意味: UNIXパスワードとの同期機能を有効/無効にする。
- デフォルト値:
passwd program- タイプ: 文字列
- デフォルト値:
/bin/passwd
- 意味: UNIXのパスワード変更コマンドと引数を指定する。
- デフォルト値:
passwd chat- タイプ: 文字列
- デフォルト値:
*new*password* %n\n *new*password* %n\n *changed*
- 意味:
passwd program
のコマンドとやり取りする対話の内容を指定する。 - デフォルト値:
passwd chat debug- タイプ: 真偽値
- デフォルト値:
no
- 意味:
passwd chat
の値をデバッグするときに「yes
」とする。debug level
パラメータを100
以上にすることで、対話の内容がログファイルに記録される。- 注意: クライアントから与えられたパスワードがログファイルに記録されるため、デバッグが終わったら
「no」
に戻すのを忘れずに。 - デフォルト値:
(
debug levellog level
も同意)- タイプ: 数値
- デフォルト値:
1
(サーバ以外は異なるデフォルト値を持つ)- 意味: デバッグレベルを指定する。大きい数値を指定するほどより詳細に記録される。
- デフォルト値:
以下の設定と実行結果の例は、Samba 2.0.7をDebian GNU/Linux 2.2(potato)で動作させた場合を想定しています。執筆時点ではDebian GNU/Linux 2.2は正式リリースに至っておらず、各パッケージは2000年5月14日時点の最新版を利用しました。
■passwd コマンドの指定
passwd program
で指定したコマンドは、root権限で起動されます。root権限で起動されたpasswdコマンドは、現在のパスワードの入力は要求しません。つまり、認証はせずに新しいパスワードの入力だけを求め、それを設定します。
ただし、UNIXのパスワード情報がNISサーバ上にある場合などの例外もあり、rootユーザーに対しても現在のパスワードを求めることがあります。SMB暗号化パスワード認証ではSMBクライアントから平文のパスワードは渡されないため、この場合には残念ながらSambaのパスワード同期機能は利用できません。
rootユーザーが任意のユーザのパスワードを設定するには、passwdコマンドの引数に対象となるユーザの名前を指定します。よって、passwd
command
パラメータは以下のように設定します。このパラメータでは置換マクロ「%u
」が利用可能で、コマンドの実行時にパスワードが変更されるユーザー名に置き換わります。
passwd program = /usr/bin/passwd %u |
■passwdコマンドとの対話内容の指定
対話の手順は、passwd chat
パラメータに文字列を指定します。この文字列を決定するには、passwd
program
で指定したコマンドラインをroot権限で実行し、その内容を観察します。
# /usr/bin/passwd fumiya |
最後の行が、スペルの誤り (「successfully」が正しい) があったり、改行コードがないためメッセージのすぐ右にシェルのプロンプトがきてしまうなど、正式リリース前ということもあってちょっとおかしい。
passwd chat
のパラメータは、passwdコマンドから受け取る文字列とpasswdコマンドへ渡す文字列を、空白で区切って交互に記述します。上の実行結果から、次のようにしました。
passwd chat = |
このように、passwdコマンドから受け取る文字列には、任意の文字列に一致する「*
」が使えます。また、「%n
」は新たに設定するパスワードに、「\n
」は改行コードに置きかえられます。詳細は
smb.conf(5) のmanページをご覧ください。
この設定例では、passwdコマンドから受け取る文字列を厳密に指定せずに、「*
」であいまいな表現にしています。先にも書きましたが、passwdコマンドの表示するメッセージはOSのバージョンや設定によって異なることがあり、しかもそれが珍しいことではありません。そこで、多少異なる文字列にも一致するようなパターンを記述しておくことで、passwdコマンドの不意なメッセージの違いにも対応することができるでしょう。上の例で、
最後の文字列として「*succes*fully*
」としたのは、将来にミススペルが修正されることを見越してのことです。
■パスワード同期機能の有効化
さて、あとはunix password sync
パラメータを「yes
」にするだけです。smb.confは以下のようになるでしょう。
[global] |
■試してみよう!
Sambaのsmbpasswdコマンドを使って同期が行われることを確認してみましょう。
smbpasswdコマンドは、root権限で起動すると直接Sambaのパスワードファイルを編集してしまうため、 Sambaサーバによる同期機能は働きません。また一般ユーザーが起動すると、root の場合とは異なりオプション以外の最初の引数を新しいパスワードとして受け取ります。自分のユーザ名を指定したつもりで起動すると混乱してしまうため、注意が必要です。
$ smbpasswd |
smbpasswdコマンドでパスワードの変更に成功したら、TelnetやFTPなどのUNIXのサービスにログインし、新しいパスワードがUNIXのパスワードにも反映されていることを確認してください。
制限により同期しないケースもある
ここまで説明してきたように、パスワードの同期を実行しているのは Sambaサーバであるため、以下のような場合には同期はされません。
- rootがsmbpasswdコマンドでローカルのSambaパスワードを変更した場合
- passwdコマンドでUNIXパスワードを変更した場合
(1)は先に解説した通り、この場合のsmbpasswdコマンドは直接Sambaパスワードファイルを編集するためです。 -r
HOSTNAME
オプションでサーバを介してパスワードを変更した場合は機能しますが、認証のために現在のパスワードの入力を求めてきます。
(2)は、passwdコマンドがSambaのことを検知していないので、同期が機能しないのは当然です。 ただし、passwdコマンドのラッパースクリプトを作成すれば、このタイミングで同期することも不可能ではないでしょう。
また、Windows 98 (Second Edition含む)からのパスワード変更でも同期は機能しませんでした。私はWindows 98のコマンドプロンプトで以下のコマンドを実行して試してみました。この結果、Sambaのパスワードは変更されますが、 UNIX のパスワードは同期されませんでした。
C:\>net password \\samba
fumiya |
一方、Windows NT 4.0 からのパスワード変更では同期は機能しました。私の知るかぎり、Windows NTにはコマンドラインからパスワードを変更する機能がないため、 Ctrl + Alt + Deleteキーを押したときに現れる「Windows NT のセキュリティ」ダイアログボックスから、「パスワードの変更」ダイアログボックスを開いて試しました。このダイアログボックスは、一見するとサーバ名を指定する入力欄がありませんが、 [ドメイン(D)] 欄にホスト名を指定することができます。
Windows 95/98とWindows NTでは、リモートホスト上のパスワード変更のプロトコルが異なります。 Windows 95/98からのパスワード変更で同期がされない理由としては、Samba(あるいは Windows 95/98 が利用しているSMBプロトコル)の仕様か、Sambaのバグだと考えられますが、実際のところは不明です。
さてはと思い、Samba をドメインコントローラとして、Windows 98をSambaのドメインにログオンするようにしてみました。すると、[コントロールパネル] - [パスワード] ダイアログボックスの [ほかのパスワードの変更] ボタンをクリックしてWindows ネットワークのパスワードを変更したところ、 Sambaパスワードの変更とUNIXパスワードの同期に成功しました。しかし、相変わらずコマンドラインからのパスワード変更は実行できませんでした。
連載 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」コマンドです。
|
|