連載 Samba Tips!
NTドメインとUNIXユーザー管理の自動化
Samba 2.0の新機能の1つとして、NTドメインのメンバーサーバになる機能が実装された。これを利用することで、ユーザー情報をNTサーバのプライマリドメインコントローラで一元管理できるようになる。今回はこの機能を中心に、実用的なユーザー追加コマンドを作成。その解説を行う。
佐藤文優<fumiya@samba.gr.jp>
株式会社デジタルデザイン
日本Sambaユーザ会
2000/9/5
今回は、 Sambaのドメインメンバー・セキュリティと、UNIXユーザーアカウント管理の自動化について紹介します。
■ドメインセキュリティの利点Samba 2.0の新機能の1つとして、NTドメインのメンバーサーバになるドメインセキュリティ機能が実装されました。この機能を利用してSambaをドメインメンバーにすることで、ユーザー情報をプライマリドメインコントローラ(PDC)で一元管理できるようになります。
しかし現在のSambaは、このドメインセキュリティ機能を利用してもなお、Sambaが動作するUNIX上にもローカルなユーザーアカウントが必要です。これは、ドメインコントローラ(DC)が提供するユーザーIDなどの情報を利用する機能が、まだ実装されていないためです。つまり現状では、ユーザー認証をDCに依頼しているにすぎません。
一方、それ以前のSamba 1.9.xの頃から、Windows NT ServerあるいはWorkstationにログオンすることでユーザー認証を行う 「サーバ」セキュリティモードも実装されています。これは、ドメインメンバーによるセキュリティモードと一見差がないように思えますが、ドメインセキュリティには以下のようなメリットがあります。
Sambaのドメインセキュリティ機能の利点 |
NTドメインへの参加 |
Windows NTとまったく同じ手順を用い、認証されたRPC(Remote Procedure Call)を通してドメインセキュリティのユーザー認証を実行します。Sambaサーバは、NTと同じようにドメインの信頼関係に参加できます。 |
消費リソースの低減 |
「サーバ」セキュリティでは、ユーザーがSambaへのセッションを持っているあいだ、Samba認証したサーバ間のセッションも保持しなければなりませんでした。「ドメイン」セキュリティでは、ユーザー認証を行うあいだだけセッションを張ります。 |
完全なユーザー情報の一元管理化 |
ドメイン認証を行うことで、DCからユーザーの識別情報を取得することができます。識別情報には、ユーザーのSID (Security ID) や所属するグループなどが含まれます(繰り返しますが、現在のSambaにはこれを利用する実装がありません)。 |
ドメインセキュリティによる完全なユーザー情報の一元管理への対応は、実験的・先進的な機能の実装を目的とする 「Samba TNG (The Next Generation)」と呼ばれる、次世代のSambaで開発が行われています。
Samba TNGには、完全なPDCの実装、ユーザー情報のLDAP(Lightweight Directory Access Protocol)サーバへの問い合わせ、リモートサーバの管理用クライアントなど、非常に魅力的な機能が盛りだくさんです。すでに多くの機能が実装済みで、正式リリースされていないにもかかわらず、実際に利用しているユーザーもだいぶいるようです。
日本Sambaユーザ会では、日々開発が行われているSambaソースのスナップショットを、ftp://ftp.samba.gr.jp/pub/samba-jp/cvs/snapshot/で公開しています。
ここにあるソースアーカイブはどれも正式リリース版ではないため、動作が不安定だったり、ときにはコンパイルさえもできないことがあります。特にSamba TNGは、とにかく機能を詰め込むことを第一としているため、誤ったパラメータ指定をしたり実装途中の機能を利用すると、簡単に落ちます。また、セキュリティ上の欠陥も残されています。ご注意ください。
NTドメインへの参加手順さて、Samba 2.0をNTドメインメンバーにする手順は、Samba付属ドキュメントであるDOMAIN_MEMBER.txtに記述されていますが、ここでも簡単に紹介しておきます。
■メンバーのマシンアカウントの登録NTドメインのメンバーとなるには、PDC上にマシンアカウントが必要です。現在のSambaはリモートのPDCを操作する機能を持たないため、PDCの端末からAdministratorアカウントでログオンして作業しなければなりません。
PDCとして動作しているWindows NT Serverにログオンし、「サーバーマネージャ」を起動します ([スタート]メニュー - [プログラム] - [管理ツール(共通)] - [サーバーマネージャ])。ドメインメンバーを追加するには、 サーバーマネージャのメニューから[コンピュータ] - [ドメインに追加...] を選択し、 [コンピュータをドメインに追加]ダイアログを開きます。
サーバーマネージャでドメインメンバーを追加 |
[コンピュータの種類] に [Windows NTワークステーションまたはサーバー] を選択し、[コンピュータ名] にSambaサーバのNetBIOS名を入力し、[追加] ボタンを押します。これでマシンアカウントの登録は完了です。
■Samba デーモンの停止 Sambaを操作する前に、Sambaのデーモンプロセスを停止します。ps
コマンドでプロセスIDを調べ、kill
コマンドでSIGTERM
シグナルを送ります。以下に操作例を示しますが、ps
のオプションは、システムによってはaxc
の代わりに-ef
を指定してください。
Sambaデーモンの停止
# ps axc | grep mbd |
killall
コマンドがあるシステムなら、プロセス名を指定してシグナルを送ることができます。また、Samba用の起動スクリプト(/etc/init.d/samba
あるいは /etc/rc.d/init.d/smb
など)があるなら、それを利用しても構いません。
Samba デーモンの停止(killall コマンド)
# killall smbd nmbd |
Samba デーモンの停止 (起動/終了スクリプト)
# /etc/init.d/samba stop |
inetdから起動させているなら、/etc/inetd.conf
内のSambaのエントリをコメントアウトして、inetd
のプロセスを再起動してください。
マシンアカウントにはパスワードが割り当てられており、ドメインメンバーはそのパスワードをDCに渡すことで認証され、安全なRPCを実行することができます。
「サーバーマネージャ」で登録された直後には初期パスワードが割り当てられており、ドメインメンバーとなるマシンからパスワードを設定する必要があります。Sambaでは、smbpasswd
コマンドによってマシンアカウントのパスワードを設定します。
マシンアカウントの初期パスワードの変更# smbpasswd -j DOMAINNAME -r PDCNAME |
上記のように、smbpasswd
コマンドに「-j
」オプションでドメイン名を「-r
」オプションでPDCマシンのNetBIOS名を指定します。パスワードはsmbpasswd
コマンドによってランダムに設定され、Sambaサーバのデーモンプロセス(smbd
)によって定期的に変更されます(machine
password timeout
パラメータによって間隔を制御できます)。
設定されたパスワードは、smbpasswd
ファイルが置かれるディレクトリ(smb passwd
file
パラメータによる)の「DOMAINNAME.SAMBANAME.mac
」 という名前のファイルに保存されます。
smb.conf
)
Sambaサーバをドメインセキュリティを利用するように設定します。smb.conf
のglobal
セクションを以下のように設定します。
ドメインメンバーセキュリティの設定 (smb.conf )[global] |
security = domain
- セキュリティモードの指定です。 ドメインメンバーとなるときは「
domain
」を指定します。
workgroup = DOMAINNAME- 参加するドメインの名前の指定です。
encrypt passwords = yes- 暗号化パスワード認証を利用するようにします。 ドメインセキュリティには暗号化パスワード認証が必須です。
password server = *- ドメインコントローラの指定です。PDCと、(存在するならば)BDC(Backup Domain Controller)のNetBIOS名を記述します。
「
*
」を指定すると、DCの名前を解決し、そのホストを利用します。
wins server = 192.168.0.1- DCの名前解決ができるように、WINS(Windows Internet Name Service)サーバを指定します。DCがSambaと同じサブネットワークに接続されているなら必須ではありません。DCも同じWINSサーバを利用するように設定しなくてはなりません。
smb.conf
を書き換えたら、Sambaサーバを起動しましょう。クライアントからドメインユーザーでSamba
にログオンできるか試してみてください。その前に、同名のUNIXユーザーのアカウントを作成するのを忘れないように。
■ユーザー追加/削除コマンドの自動起動
前述のように、SambaサーバにアクセスするにはUNIX上のユーザーアカウントが必須です。これは、「サーバ」セキュリティも「ドメイン」セキュリティも例外ではありません。このため、NTドメインを管理してSambaをドメインに参加させたとしても、ドメインユーザーに対応するUNIXユーザーをSambaホストにも追加しなくてはなりません。 この作業の自動化を支援するための機能がSamba の
add user script
パラメータです。
一方、不要になったUNIXユーザーを削除するためのdelete user script
パラメータも用意されています。
例えば、smb.conf
を以下のように記述します。このように、追加/削除するユーザー名の指定はsmb.conf
の置換マクロの1つ「%u
」を利用します。指定されたコマンドの実行前に、「%u」はSambaへ接続してきたユーザーのログイン名に置き換わります。
add user script
/ delete user script の設定例 (smb.conf )[global] |
add user script
とdelete user script
パラメータは、Sambaがセキュリティモード「ドメイン」(security=domain
)
あるいは「サーバ」(security=server
)で動作している場合にのみ有効です。
Sambaは、ログインしてきたユーザーをリモートのサーバで認証したあと、同名のUNIXユーザーが存在するかどうかを調べ、見つかったならそのユーザーの権限を利用して共有のリソースにアクセスします。該当するUNIXユーザーが見つからなかったなら、add
user script
パラメータに指定されたコマンドを管理者権限(root)で実行します(パラメータが未指定であれば、何もせずにユーザーのログインを拒否する)。コマンドを実行後、SambaはふたたびUNIXユーザーの存在を調べ、見つかったならそのユーザーの権限を使い、見つからなければログインを拒否します。
また、認証サーバがユーザーの認証を拒否して「そのユーザーは存在しない」と応答したときは、対応するUNIXユーザーを削除するためにdelete
user script
のコマンドが管理者権限で起動されます。
■add user script
パラメータの制限
先ほどのsmb.conf
の設定例のように、置換マクロを用いることでいくつかの情報を動的にadd
user script
に渡すことができます。しかし、ユーザーの追加に利用できそうなマクロは「%u
」くらいしかありません。
Sambaからユーザー追加コマンドに指示される情報はユーザー名のみに限られ、所属させるUNIXグループを判断する材料さえありません。これではユーザーのグループ化が不可能になり、共有リソースごとのアクセス制限が難しくなります。
実用的なユーザー追加コマンドの作成Sambaが頼りにならないのであれば、ユーザー追加コマンドを拡張し、認証サーバにユーザーのグループ情報を問い合わせる方法が考えられます。Sambaの実装は複雑かつ巨大であるため、Sambaに手を加えるよりもそのほうが簡単でしょう。
この節では、ユーザーの所属グループを考慮した、より実用的なユーザー追加コマンドの実装例を紹介します。
ここで紹介するコマンド(Perl スクリプト)は、 Samba TNG付属のrpcclient
を利用していますが、
それ以外のSamba バイナリでは安定版のSamba 2.0.7を前提とします。
まずは、Sambaから認証サーバにユーザー情報を問い合わせるための手段を考えます。
(1) リモートシェル経由でユーザ情報の問い合わせ
Windows NTのNET
コマンドを用いると、ユーザーやグループの情報を得ることができます。 詳細はコマンドプロンプトで「NET
HELP コマンド名
」を実行するか、Windows NTのオンラインヘルプ ([スタート]メニュー - [ヘルプ]) を参照してください。
NET コマンドの実行例C:\>net help |
そこで、リモートシェルサーバをPDCにインストールし、リモートシェル経由でNET
コマンドを叩けば、Sambaホストからユーザーの所属グループ情報を得ることができます。
リモートシェルを利用したユーザー追加コマンドの実装はすでに作られており、以下のWebページに詳細な情報があります。
Samba Unixユーザー追加スクリプト (自動グループ選択機能つき)(http://www.da-cha.org/samba/index-j.html) この実装は、現在Samba日本語版の開発を中心になって行っている三浦広志氏によるものです。これは、NET
コマンドではなく、独自の
GetUserGroups.exe
コマンドか、 Windows NT 4.0 リソースキット付属のshowgrps.exe
コマンドを使用しています。
(2) rpcclient
コマンドによるユーザー情報の問い合わせ
Windows NTにはリモート管理用の実装が用意されており、RPC経由で呼び出すことができます。Samba TNGに追加された新しいクライアントコマンドrpcclient
を使えば、これらRPCを利用して、リモートのWindows
NTを管理することが可能です。
rpcclient
のインタフェースは、smbclient
コマンドと似ています。以下にその実行例を示します。このように、Windows
NT上のSAM(Security Account Manager)データベースにアクセスし、ユーザーやグループの情報を得ることもできます。
rpcclient
コマンドの実行例(匿名ユーザーによるアクセス)$ rpcclient -S PDCNAME -U% |
実は、現在の最終安定バージョンであるSamba 2.0.7にもrpcclient
コマンドが含まれています。 しかし非常に初期の実装であるため、Samba
TNGのrpcclient
と比べても実用的ではありません。
逆にSamba TNG全体を見ると、仕様が流動的であったり、先に述べましたが動作が不安定、セキュリティ上の欠陥があるといった問題があります。そこで、Sambaサーバには安定版のSamba
2.0.7を使用し、rpcclient
コマンドだけSamba TNG版を使用するとよいでしょう。 その方法を、以下に紹介します。
まずはSamba TNGのrpcclient
を用意しましょう。以下のURLからSamba TNGのスナップショットを取得してください。私は、2000年8月13日版のSamba
TNGスナップショットを取得しました。Samba TNGのファイル名は「samba-tng.snapshot-年月日.tar.gz
」のようになっています。
ここにあるスナップショットはソースファイルのアーカイブです。 以下のようにしてアーカイブを展開し、コンパイルします。
Samba TNG のコンパイルとインストール
samba-tng.snapshot-20000813.tar.gz
| tar xf - |
必要なのはrpcclient
だけなので、configure
スクリプトには特別なオプションを選択しませんでした。既存のSambaが/usr/local/samba
にインストールされているなら、この例のように--prefix
オプションでSamba
TNGのインストール先を指定するとよいでしょう。
もしコンパイルに失敗したなら、ほかの日付のスナップショットを試してみてください。
■Perl スクリプトによるユーザー追加コマンドの例最後の役者はユーザー追加コマンドです。 実際に、次のような環境を想定したユーザー追加コマンドをPerlで書いてみました。環境に大きく依存している点は、コマンドなどへのパスとシステム標準のユーザー追加コマンドのインターフェイスくらいなので、 そのほかの環境でも多少の手直しで対応できるでしょう。
- Samba動作システム
- Debian GNU/Linux 2.2 (コードネームpotato)
- そのほかのLinuxディストリビューション、あるいはSolaris 2でもおそらく可
- (
useradd
コマンドの仕様に依存) - Sambaサーバ
- バージョン2.0.7(Samba TNGは未サポート)
/usr/local/samba
にインストールrpcclient
コマンド- Samba TNG(2000年8月13日のスナップショット版)
/usr/local/samba-tng
にインストール- Perl インタプリタ
- バージョン5.005 patchlevel 3
- JPerlでは未テスト(おそらく可)
- プライマリドメインコントローラ
- Windows NT 4.0 Server日本語版Service Pack 6a
以下にスクリプトを示します。 実用に耐える実装を目指したため、少々長いコードになってしまいました。 あまりサンプル向けではないかもしれませんが、 やっていることは単純ですのでご了承下さい。
rpcclient
を利用したユーザー追加スクリプト (smbadduserscript
)
スクリプトの先頭から順番に、コメントを目印に簡単に解説します。
- スタートアップ(
# Startup
以降)
利用するPerlモジュールの宣言と、このスクリプトの使い方を示すメッセージを定義します。 - オプション設定(
# Options
以降)
設定ファイルと外部コマンドのパスと有効なユーザー名の要件を定義します。また、コマンドライン引数の読み取りと有効性のチェックを行います。 - グループ名マッピングファイルの読み込み(
# Groupname mapping file
以降)
NT ドメインのグループに対応するUNIXグループ名を関連付けるためのファイルを読み込みます。 rpcclient
の起動(# Samba TNG rpcclient
以降)
rpcclient
の起動オプションを決定し、起動してPDCに接続します。PDCに対する問い合わせはrpcclient
の「-c
」オプションで指定します。- ドメインユーザー/グループ情報の取得(
# Retrieve Domain User and Domain Group info.
以降)
rpcclient
の出力からドメインユーザーの情報とドメイングループの一覧を取得します。 - UNIXユーザー情報の決定(
# UNIX User info.
以降)
PDCから得た情報をもとに、UNIXユーザーの情報(コメント、所属グループ)を決定します。 - UNIXユーザーの作成(
# Create UNIX User
以降)
useradd
コマンドを使用してUNIXユーザーを作成します。
このスクリプトを利用するようにSambaの環境を整えてみましょう。
■スクリプトの書き換えとインストール 現在のところ、いくつかのパラメータはスクリプト内にハードコーディングされているため、必要であれば環境に合わせてスクリプトを書き換えてください(#
Options
以降の箇所)。
スクリプトは、例えば「smbadduserscript
」のような名前で適当なディレクトリにインストールします。私の環境ではSambaが/usr/local/samba
以下にインストールされているので、スクリプトを/usr/local/samba/bin
に置きました。ファイルの所有者はrootに、モードは「0744」にしましょう。
スクリプトには、UNIXグループを自動で作成する機能はないため、ドメイングループに対応する UNIXグループはあらかじめ作成しておく必要があります。
UNIXユーザーに所属させるUNIXグループの名前は、ドメインユーザーが所属するドメイングループの名前をすべて小文字にしたものか、グループマッピングファイルで対応づけされた名前になります。
グループマッピングファイルの形式は、Sambaのusername map
パラメータに指定されるファイルに似た形式で記述します。
つまり、等式の左辺にUNIXグループ名を、右辺にドメイングループ名を記述します。複数のドメイングループをカンマ「,」で区切って並べ、1つのUNIXグループに対応させることもできます。
グループマッピングファイルの例
domadm = Domain Admins |
私の環境では、このファイルを/usr/local/samba/lib/groupname.map
に置きました。別の場所に置きたい場合は、スクリプトを書き換えてください。
対応するUNIXグループが作成されていないと、スクリプトはユーザーを作成せずに異常終了します。結果、Sambaへのログインは拒否されることになります。
■スクリプトのテスト実行 ここまで準備ができたらスクリプトの動作をテストしてみましょう。スクリプトに「-n
」オプションを指定する実行すると、ユーザーの作成は行わずに、ユーザー追加コマンドのコマンドラインを表示します。
ドメイングループ「Domain Users」、「Domain Admins」に所属するドメインユーザー「fumiya」を指定して実行すると、以下のようになります。
smbadduserscript
のテスト (ユーザー追加コマンドの表示のみ)# smbadduserscript -n pdcname fumiya |
ドメインユーザー「fumiya」のプライマリグループは「Domain Users」なので、useradd
コマンドのプライマリグループを指定するオプション「-g
domuser
」と、追加のグループの指定するオプション「-G domadm
」が表示されました。コメントを指定するオプション「-c
」の値「SATOH
Fumiyasu,NT Domain User
」がクォートされていませんが、実際にコマンドを実行する場合はひとまとめになって
useradd
コマンドに渡されるため、問題ありません。
「-n
」オプションをつけなければ、このコマンドラインが実際に起動され、ユーザーが追加されます。
smbadduserscript
のテスト (ユーザー追加コマンドの実行)# smbadduserscript pdcname fumiya |
smbadduserscirpt
を実行すると、rpcclient
がsmb.conf
ファイルを読みこむときに「Unknown
parameter encountered: "xxxx"
」とエラーを出力することがあります。これは、安定版のSambaとSamba
TNGでsmb.conf
のパラメータが一部異なるためです。問題はないので無視してください。
■add user script
パラメータの設定
最後に、add user script
パラメータにこのスクリプトを指定すれば完了です。DCの自動検索には対応していないので、この例のようにPDCのNetBIOS名を直接指定しておきます。
add user script パラメータの設定
(smb.conf ) [global] security = domain |
正直なところ、私がこのスクリプトを作成した理由は次の3点だけです。残念ながら(?)、自分が必要としたから作成したのではありません。
- 記事のネタにするため
- Samba TNG に触れる機会を得たかった
- 単純にプログラミングが好き :-)
スクリプト先頭のコメント(ToDo:)に記述してあるように、 このスクリプトにはまだやるべきことが数多く残されています。今後どのように発展するかは、実際にUNIXユーザー管理に困っているあなた次第かもしれません。
下記の日本Sambaユーザー会のページで、このスクリプトに関する情報を提供する予定です。私の興味を引くご提案やパッチを送ってくだされば、スクリプトに取り込ませていただくことができると思います。
- Samba 関連ツール(http://www.samba.gr.jp/project/contrib/)
連載 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」コマンドです。
|
|