Name

smb.conf — Samba の設定ファイル

概要

smb.conf ファイルは Samba システムの設定ファイルである。smb.conf には、Samba システムの各プログラムが実行時に参照する設定情報が記述される。 smb.conf ファイルは、swat(8) プログラムによって設定、 管理されるように設計されている。 以下参照目的で、ファイルの形式と設定可能なパラメータに関して網羅的に記述する。

ファイルの形式

ファイルはセクションとパラメータから構成される。セクションは、 大括弧([]) で囲まれたセクション名で始まり、次のセクションが始まるまで 続く。セクション内には以下の形式でパラメータが記述される:

パラメータ名(パラメータ) = パラメータ値(値)

ファイルは行を基本単位とし、改行で終了する各行は、コメント、 セクション名、パラメータのいずれかを表す。

セクション名およびパラメータ名は大文字と小文字を区別しない。

パラメータを示す行では、最初の 「=」 文字に重要な意味がある。 最初の 「=」 文字の前後の空白文字は破棄される。 セクション名およびパラメータ名の先頭、 途中、末尾にある空白文字は 無視される。パラメータ値の先頭と末尾にある空白文字も無視される。 ただし、パラメータ値の途中にある空白文字はそのまま意味を持つ。

セミコロン (:)、シャープ (#) で始まる行や、空白のみの行は 無視される。

\ 文字で終わる行は、UNIX の慣習通り次の行へ継続する。

「=」文字に続くパラメータ値には、文字列 (引用符で囲む必要はない)、または真偽値を表す、yes/no、0/1、true/false のいずれかを記述する。真偽値の場合、大文字と小文字は同じ意味だが、 記述されたとおりの文字列が保存される。 create mask など、幾つかのパラメータ値は数値となる。

セクションの説明

設定ファイル中の ([global] セクションを除く) 各セクションでは、 共有リソース (単に共有とも呼ぶ (訳注: 「サービス」とも呼ばれる)) の設定が行なわれる。 セクション名は共有リソース名となり、 セクション内のパラメータは共有の設定に利用される。

[global]、[homes]、[printers] という 3 つの特殊なセクションに ついては、特殊なセクション で説明する。 以下の説明は、通常のセクションについてのものである。

共有の設定としては、大きくアクセスを許可するディレクトリの設定と それを利用するユーザに対するアクセス許可の設定とがある。 その他いくつかの補助的なオプションの指定も可能である。

セクションは、ファイル共有サービス (クライアントからファイルシステムの延長として利用される) とプリントサービス (クライアントからサーバ上で動作している 印刷サービスにアクセスするために利用される) のいずれかに分類される。

セクションは、パスワードなしでアクセスできる ゲスト サービスとして構成することもできる。 この場合、UNIX 側で指定されたゲストアカウントの権限でアクセスが 行なわれる。

ゲストサービス以外のセクションにアクセスするにはパスワードが 必要である。通常クライアントからはユーザ名も提供されるが、 年代物のクライアントはパスワードのみでユーザ名を提供しないため、 user = パラメータで指定したユーザのリストを用いてパスワードの検証を 行なうことも可能である。Windows 95/98/Me/NT/2000 のような最近の クライアントでは、このパラメータは不要である。

Samba より与えられたアクセス権は、システムより UNIX ユーザ (またはゲストユーザ) に与えられたアクセス権によって制限されることに注意して欲しい。 Samba はシステムが許可する以上のアクセス権を許可することはできない。

以下の簡単なセクションは、ファイル共有を定義するものである。 ユーザは /home/bar に対して書き込みができる。 共有は、foo という共有名でアクセス可能である:

	[foo]
	path = /home/bar
	read only = no

以下の簡単なセクションは印刷サービスを定義するものである。 共有は読み取りのみであるが、印刷可能である。これは、 スプールファイルのオープン、書き込み、クローズという作業についてのみ書き込みが許可されるということである。guest ok パラメータは、(別途定義された) デフォルトのゲストユーザとしてアクセスが許可されていることを意味する:

	[aprinter]
	path = /usr/spool/public
	read only = yes
	printable = yes
	guest ok = yes

特殊なセクション

[homes] セクション

homes セクションが設定ファイル中にあると、 接続してきたユーザのホームディレクトリを共有するサービスが 必要時にサーバによって作成されるようになる。

接続の要求が行なわれると、存在するセクションが検索される。 要求に合致するセクションが見つかった場合はそのセクションが 利用される。見つからなかった場合は、 要求されたセクション名をユーザ名とみなしてローカルのパスワードファイルが検索される。 ファイル中に名前が存在して、パスワードが適切だった場合、 [homes] セクションの設定を引き継ぐ形で共有が作成される。

新しく作成される共有に対しては、 幾つかの変更が行なわれる:

  • 共有名は、homes からユーザ名に変更される。

  • path パラメータが設定されていなかった場合、 ディレクトリのパスはユーザのホームディレクトリに設定される。

path = 行を [homes] セクションに記述した場合、"%S" マクロを用いると便利になる 場合があるかも知れない。以下に一例を示す:

path = /data/pchome/%S

これは、UNIX からのアクセスと PC からのアクセスとでホームディレクトリが異なる場合に便利である。

これは多数のクライアントに対するホームディレクトリの 提供を最小の手間で素早く簡単に実現する方法である。

要求されたセクション名が homes の場合にも同様の処理が行われるが、共有名が要求したユーザの 名前に変更されることはない。 [homes] セクションを使用する 方法は、複数のユーザがクライアント PC を共有する場合に 便利である。

[homes] セクションでは、通常のサービスで指定可能な すべてのパラメータを指定できるが、幾つかのものは他の セクションと少し違った意味になる。以下は典型的な [homes] セクションの例である:

[homes]
read only = no

重要な点として、[homes] セクションでゲストアクセスを許可した場合、 全てのホームディレクトリが全てのクライアントから パスワードなしで アクセス可能になるという点が挙げられる。 ほとんどあり得ないと思うが、もしこの設定を実際に行なうのであれば、読み取り専用 アクセスの設定にしておくことが好ましいであろう。

自動的に作成されるホームディレクトリの browseable パラメータの値は、[homes] セクションの browseable パラメータからではなく、[global] セクションの browseable パラメータより継承される。これは、 [homes] セクションで browseable = no を指定して [homes] 共有を不可視にしても、自動的に作成されるホームディレクトリを表示させるようにするための仕様である。

[printers] セクション

このセクションは、プリンタ用の [homes] セクションに 相当する。

[printers] セクションが設定されていると、ユーザは、 ローカルホストの printcap ファイルで設定されている各プリンタに接続することが可能となる。

接続の要求が行なわれると、存在するセクションが検索される。 要求に合致するセクションが見つかった場合はそのセクションが利用される。 見つからなかった場合、[homes] セクションがあれば前述した処理が行なわれる。 それでも要求が解決できない場合は、 要求されたセクション名をプリンタ名とみなし、 適切な pritcap ファイルが検索され、 要求されたセクション名をプリンタ共有名とみなすかどうかの 確認が行なわれる。ファイル中に名前が存在した場合は、 [printers] セクションの設定を引き継ぐ形でプリンタ共有が 作成される。

新しく作成される共有に対しては、 幾つかの変更が行なわれる:

  • 共有名には、実際のプリンタ名が設定される。

  • プリンタ名が設定されていない場合、 プリンタ名として実際のプリンタ名が設定される。

  • 共有がゲストアクセスを許可しておらず、 username パラメータも指定されていない場合、username に実際のプリンタ名が設定される。

[printers] サービスは、必ず printable にすること。 それ以外の設定を行なうと、サーバが設定ファイルの読み取りを 拒否してしまう。

通常指定されるパスは、sticky ビットが設定され、 誰でも書き込み可能になっているスプールディレクトリである。 典型的な [printers] のエントリは次のようになる:

[printers]
path = /usr/spool/public
guest ok = yes
printable = yes

printcap ファイル中で定義されているすべてのプリンタの エイリアス(別名)は、プリンタ名として認識される。 印刷システムが printcap ファイルのような機構を使用して いないのであれば、仮の printcap ファイルを設定する必要がある。 このファイルは以下のような形式の行で構成される:

alias|alias|alias|alias...    

各エイリアスは、印刷システムが処理可能なプリンタ名で ある必要がある。[global] セクションで、別のファイルを printcap ファイルとして指定することで、仮想的な printcap ファイル中にある名前のみがサーバに認識される。 もちろんこのファイル中には任意のエイリアスを記述することが 可能である。このテクニックは、ローカルプリンタの一部のみに アクセスを制限する機能を簡単に実現するためにも利用できる。

なお、エイリアスとは printcap ファイル中の各レコードの 最初のエントリに続く各要素をさす。 各レコードは改行コードで区切られ、各要素は (複数個存在する場合) 縦棒 (|) で区切られる。

Note

lpstat コマンドによりシステムで定義されている プリンタの一覧を取得可能な SYSV 系のシステムでは、 printcap name = lpstat とすることで、 プリンタの一覧を取得することが可能である。 詳細は、printcap name オプションを参照のこと。

ユーザ定義共有

Samba 3.0.23 より、root 以外のユーザが共有の追加、修正、削除を行なうことを可能とする機能が追加された。 この機能を ユーザ定義共有(usershares) と呼び、 smb.conf の セクションで定義される一連のパラメータによって制御される。 関連するパラメータを以下に示す :

usershare allow guests

ユーザ定義共有でゲストアクセスを許可するかどうかを制御する。

usershare max shares

作成を許可するユーザ定義共有の最大数を制御する。

usershare owner only

有効にすると、ユーザが所有しているディレクトリのみが共有可能となる。

usershare path

ユーザ定義共有を作成可能なディレクトリを指定する。 実際にユーザ定義共有を作成可能かどうかは、ファイルシステム上のディレクトリのパーミッションに依存する。

usershare prefix allow list

共有を許可するディレクトリの絶対パス名をコンマで区切って列挙する。 ここで指定されたパス名から始まるディレクトリのみが共有を許可される。

usershare prefix deny list

共有を拒否するディレクトリの絶対パス名をコンマで区切って列挙する。 ここで指定されたパス名から始まるディレクトリは共有を拒否される。

usershare template share

新しいユーザ定義共有を作成する際のテンプレートとなる既存の共有を指定する。 ユーザ定義共有の定義時に指定されなかったすべての共有に関するパラメータは、この共有のものが用いられる。

UNIX グループ foo のメンバにユーザ定義共有の作成を許可したい場合は、 共有の定義ファイルを格納するディレクトリを以下のように作成する:

root 権限で以下を実施:

mkdir /usr/local/samba/lib/usershares
chgrp foo /usr/local/samba/lib/usershares
chmod 1770 /usr/local/samba/lib/usershares

ついで、以下のパラメータ

	usershare path = /usr/local/samba/lib/usershares
	usershare max shares = 10 # (もしくは必要な共有数)

smb.confの global セクションに追加。 これにより foo グループのメンバは、以下のコマンドでユーザ定義共有を作成することが可能となる。

net usershare add sharename path [comment] [acl] [guest_ok=[y|n]]

これにより、ユーザ定義共有を作成もしくは修正(上書き)する。

net usershare delete sharename

ユーザ定義共有を削除する。

net usershare list wildcard-sharename

ユーザ定義共有を一覧する。

net usershare info wildcard-sharename

ユーザ定義共有の情報を表示する。

変数による置換

設定ファイルに記述可能な文字列の多くには、変数による置換を利用できる。 たとえば、path = /tmp/%u は、john というユーザ名でユーザが 接続すると、path = /tmp/john として解釈される。

これら置換の詳細については、各々のパラメータの説明にて 解説するが、どのパラメータに対しても適用される共通の変数置換もいくつか 存在する。それらを以下に記載する:

%U

セッションのユーザ名 (クライアントが接続時に 送信したものであるが、実際に接続したユーザ名と同じであるとは 限らない)。

%G

%U のプライマリグループ。

%h

Samba が動作しているマシンの インターネットホスト名。

%m

クライアントマシンの NetBIOS 名 (とても便利)。

Samba がポート 445 で待機している場合、クライアントがこの情報を送信しないため、この変数は利用できない。 Samba がドメインコントローラであるドメインで include パラメータにおいてこの変数を用いている場合などは、 [global] セクションで smb ports = 139 の設定を行なうこと。 これにより Samba はポート 445 で待機しなくなり、Samba 2.X で実現していた include 機能が利用できる。

%L

サーバの NetBIOS 名。これを用いることで、 クライアントから呼ばれた名前に応じて設定を変更することが 可能となる。これによりサーバは 二つの顔 を持つことができる。

%M

クライアントマシンのインターネットホスト名。

%R

プロトコルのネゴシエーションを経て選択された プロトコルレベル。これは CORE、COREPLUS、LANMAN1、LANMAN2、NT1 のいずれかの値をとる。

%d

サーバプロセスのプロセス ID。

%a

リモートマシンのアーキテクチャ。 現在認識できるのは Samba (Samba)、 Linux の CIFS ファイルシステム (CIFSFS)、 OS/2 (OS2)、 Windows for Workgroups (WfWg)、 Windows 9x/Me (Win95)、 Windows NT (WinNT)、 Windows 2000 (Win2K)、 Windows XP (WinXP)、 Windows XP 64-bit(WinXP64), 2003R2 (Win2K3)を含むWindows Server 2003 (Win2K3)と, Windows Vista (Vista) である。 それ以外のものは UNKNOWN となる。

%I

クライアントマシンの IP アドレス。

%i

クライアントが接続してきたサーバの IP アドレス。

%T

現在の日付と時間。

%D

現ユーザが所属するドメインかワークグループ名。

%w

Winbind のセパレータ

%$(envvar)

環境変数envvarの値。

以下の置換マクロは (すでに接続が確立されている場合に) いくつかの 設定オプションに対して有効なものである:

%S

現在のサービス名 (存在する場合)。

%P

現在のサービスのトップディレクトリ (存在する場合)。

%u

現在のサービスのユーザ名 (存在する場合)。

%g

%u のプライマリグループ。

%H

%u で指定されたユーザのホームディレクトリ。

%N

NIS のホームディレクトリサーバの名前。 これは NIS の auto.map エントリから取得される。Samba が --with-automount オプションをつけて コンパイルされていない場合、このオプションは %L と同じになる。

%p

NIS auto.map エントリから取得された サーバの ホームディレクトリのパス。NIS auto.map エントリは %N:%p のように分割されている。

これらの置換操作とその他の smb.conf のパラメータを組み合わせると、非常に凝った動作を設定できる。

名前の短縮(NAME MANGLING)

Samba は、DOS や Windows クライアントが 8.3 形式に準拠しない 名前のファイルを扱うことができるように 名前の短縮 機能を提供している。この機能により、8.3 形式のファイル名についても 文字の case (大文字、小文字) を調整可能である。

短縮時の動作を制御するパラメータが幾つか存在しており、 それらは個々に解説を行なわず、ここでまとめて説明を行なう。 デフォルト値は testparm コマンドの出力を参照のこと。

以下のオプションは、すべて共有毎に設定できる (もちろん全体に対しても設定できる)。

オプションは以下の通りである:

case sensitive = yes/no/auto

ファイル名の case を識別するかどうかを制御する。 識別を行なわない場合、Samba は指定された名前に合致する ファイル名の有無を検索することが必要になる。デフォルトは auto であり、ファイル名の case を識別するクライアント(現在のところ Linux CIFSVFS や Samba 3.0.5 以降の smbclient) に対しては、case を識別する(UNIX の case を識別する挙動に準拠する) ファイルシステム上の Samba サーバにアクセスしているものとして通知する。 Windows および DOS システムでは case を識別するファイル名はサポートされておらず、このパラメータを auto に設定した場合、no の設定で動作する。 デフォルトは auto である。

default case = upper/lower

新しく作成されるファイル(現在ファイルシステム上に存在していないファイル)のファイル名のデフォルトの case を制御する。 デフォルトは lower である。 重要: case sensitive = yespreserve case = Noshort preserve case = No の場合、このオプションにより、新しく作られるファイル名だけではなく、クライアントから渡される すべての ファイル名の case が変更されることに注意。 非常に多くのファイルを格納するディレクトリの最適化作業の一貫として、この設定変更が必要となる。

preserve case = yes/no

新しく作成されるファイル(現在ファイルシステム上に存在していないファイル)のファイル名について、クライアントから 渡された case で作成するか、デフォルトの case で作成するかを制御する。 デフォルトは yesである。

short preserve case = yes/no

すべて大文字で適切な長さの 8.3 形式に 準拠した新しく作成されるファイル(現在ファイルシステム上に存在していないファイル)のファイル名について、大文字で作成するか、 デフォルト の case で作成するかを制御する。 このオプションにより、preserve case = yes で長いファイル名が case を保持する設定の時であっても、 短いファイル名は小文字で作成するといったことが可能になる。 デフォルトは yes である。

Samba 3.0 のデフォルトは、Windows NT のサーバと同様に動作する。 すなわち、case を識別しないが case は保持する。 ただし、大量のファイルが存在するディレクトリにおいては、case 関連のパラメータを "case sensitive = yes"、"case preserve = no"、"short preserve case = no" に設定するとよいであろう。 これにより、"default case" パラメータが有効になり、クライアントから送信されるすべてのファイル名が変更される。 (訳注: 上記設定は、case sensitive = yes によりファイル名の検索を抑止することで、パフォーマンスを向上させようとする意図だと思われる)

ユーザ名とパスワード認証についての注意

ユーザがサービスに接続するための方法は幾つかある。サーバは、 以下のステップを踏みサービスに対して接続を許可するかどうかを確認する。 すべてのステップが失敗した場合、接続要求は拒否される。 いずれかのステップで成功した場合、それ以降のステップは行なわれない。

サービスが guest only = yes となっており、 サーバが共有レベルのセキュリティ (security = share) で構成されている場合、ステップ 1 から 5 は省かれる。

  1. クライアントからユーザ名とパスワードが 提供されており、それが UNIX システムのパスワード機構によって 認証された場合、そのユーザ名を使った接続が行なわれる。この ステップは \\server\service%username 形式でユーザ名が提供された場合にも行なわれることに注意。

  2. クライアントからシステムに登録されている ユーザ名が提供された場合、そのユーザ名に対する適切な パスワードが提供されれば、接続が許可される。

  3. クライアントの NetBIOS 名および以前に使われた ユーザ名について提供されたパスワードとの確認が行なわれ、 合致すれば、対応するユーザ名を使った接続が許可される。

  4. クライアントが既にユーザ名とパスワードを 提供してサーバに認証されており、その際の認証トークンが 提示された場合、そのユーザ名が使われる。

  5. user = フィールドが smb.conf ファイルで 該当サービスに対して設定されており、クライアントから提供された パスワードが (UNIX システムのパスワード認証により) user = 行に記述されたユーザ名のいずれかのものと 合致した場合、接続は、user = 行で設定された ユーザ名で行なわれる。user = リスト中のユーザ名の 中に @ ではじまるものがあった場合、それはその名前の グループに所属するユーザ名のリストに展開される。

  6. サービスがゲストサービスの場合、 提供されたパスワードがなんであっても、そのサービスの guest account = で指定されたユーザ名で接続が 行なわれる。

レジストリベースの設定方法

Sambaのバージョン 3.2.0 から、レジストリ中にSambaの設定を 格納する機能が有効になった。Sambaの設定は、レジストリキー HKLM\Software\Samba\smbconf中に格納される。 レジストリベースの設定は2つのレベルがある。

  1. レジストリに共有の定義を格納する。 これは、smb.conf中のグローバル パラメータregistry sharesyesに設定することで利用可能になる。

    レジストリ定義の共有はスタートアップ時にはロードされ ないが、smbdによって、実行時に動的に ロードされる。smb.conf中の共有定義 はレジストリ中での同じ名前の共有定義に優先する。

  2. グローバルなsmb.conf オプションをレジストリに格納する。これは,以下の2つの異なった 方法で有効にできる:

    1番めは、smb.conf中の [global]セクション中のconfig backend = registryを設定することで、レジストリのみの 設定を有効にできる。これは,この時点まで読み込んだ設定ファイ ルの内容をすべてリセットし、レジストリからグローバルセク ションの内容を読む。これは、レジストリベースの設定方法を使う 時の推奨方法である。

    2番目はsmb.confの[global] セクション中の、特別に新しい意味を持つ、include = registryパラメータによって有効にできる 混成設定方法である。これは,テキストファイルをインクルード するのと同じような優先度で、レジストリからグローバルオプ ションを読む。これは,初期設定がレジストリにアクセスするのに 必要な場合に特に有益である。

    グローバルレジストリオプションの有効化は、レジストリ ベースの共有が有効になることで自動的に行われる。そのため、 レジストリのみの場合、共有は要求時にのみロードされる。

レジストリベースの設定に伴うシステムの破壊を限定的にするために、 レジストリでの設定中では、lock directoryconfig backendの使用は無効化 されることに注意。 特に、レジストリでの設定中に、lock directoryを 変更してしまい、それがいったん有効化されてしまうと、 デーモンからはそれの設定自体が見えなくなる、壊れた設定を作成することになる。

レジストリベースの設定は、キーHKLM\Software\Samba\smbconfregeditnet (rpc) registryを使ってアクセスすることもできる。 利便性のため、net(8)ユーティリティ のconfサブコマンドが、レジストリ ベースの設定をローカルに読み書きするための特別なインタフェース として提供されている。すなわち、データベースファイルに直接 アクセスし、サーバを迂回できる。

注意

設定ファイルでは、スペースを含むサービス名も利用できるが、 クライアント側のソフトウェアで禁止されているかもしれない。 文字列比較を行なう際にスペースは常に無視されるため、 問題は発生しないはずであるが、可能性は考慮しておく必要がある。

同様の注意事項として、多くのクライアント、特に DOS クライアントでは、サービス名が最長8文字に制限されている。 smbd(8) にはそのような制限はなく、 こうしたクライアントからの接続要求は、サービス名が切り捨てられてしまう ために失敗することになる。このため、サービス名の長さは、最大 8 文字に制限すべきである。

[homes] および [printers] という特殊セクションにより、 管理者の負担を軽減することができるが、デフォルトの設定の組合せ方に よっては、予期しない設定が行なわれる可能性もある。これらのセクションの 設定を行なう際には、特に注意深く行なうこと。特にスプールディレクトリの パーミッションが適切であることを確認しておくこと。

著者

オリジナルの Samba ソフトウェアと関連するユーティリティは、 Andrew Tridgell によって作成された。現在 Samba は Samba Team によって、 Linux カーネルの開発と同様のオープンソースプロジェクトとして開発が 行なわれている。

オリジナルの Samba マニュアルページは Karl Auer によって 作成された。マニュアルページは YODL 形式 ( ftp://ftp.icce.rug.nl/pub/unix/ で入手可能な優れた オープンソースソフトウェア) に変換され、Samba 2.0 リリースに伴い、 Jeremy Allison によって更新された。Samba 2.2 における DocBook 形式への変換は、Gerald Carter によって行なわれた。Samba 3.0 における DocBook XML 4.2 形式への変換は Alexander Bokovoy によって行われた。