コンテンツにスキップ

SMB・Samba・共有権限の仕組み

SMBはネットワーク越しにファイルやプリンターなどを共有するプロトコルであり、SambaはLinuxなどでSMBサービスを提供するソフトウェア群である。


クライアントは\\server\shareというUNCパスでSMB共有へ接続する。serverはSambaサーバーのDNS名またはIPアドレス、shareはsmb.confのセクション名である。

通常のSMBファイル共有は、NetBIOSを介さずTCP 445でSMBを直接運ぶ。旧来の構成では、TCP 139がNetBIOS session上のSMB通信とファイル転送、UDP 137がNetBIOS名の登録・名前解決、UDP 138がNetBIOS datagramに使われる。DNS名またはIPアドレスを指定して現在のSMBで接続する場合は、TCP 445を使用する。

DebianではSambaパッケージがファイル共有サーバーを提供し、smbdがクライアント接続、認証、共有へのアクセスを処理する。smbclientはLinuxから共有の列挙、接続、ファイル転送を行う確認用クライアントである。


Sambaの主要設定ファイルは/etc/samba/smb.confである。設定はセクションとパラメーターから構成される。

[global]
server role = standalone
[share-name]
path = /srv/samba/share-name

[global]にはサーバー全体へ適用する設定を書く。それ以外の通常セクションは共有を定義し、セクション名がクライアントから見える共有名になる。

server role = standaloneは、Active Directoryドメインコントローラーやドメインメンバーではなく、このサーバー自身がローカルユーザーを認証する役割を表す。security = userでは、接続時に提示されたユーザー名とパスワードを認証してから共有へ接続する。ゲスト共有もこの方式の上で、認証できない特定の接続をゲストアカウントへ対応付けて実現する。

testparm -sは、設定を読み取って構文と内部整合性を検査し、Sambaが解釈した設定を表示する。設定をreloadしても、既に確立済みの接続には新しい設定が直ちに反映されない。


Sambaのアクセス判定とLinuxファイルシステムのアクセス判定は別々に行われる。どちらか一方でも拒否すれば、操作は失敗する。

SMB user or guest
-> share rules: guest ok, valid users, read only
-> POSIX identity: user, primary group, supplementary groups
-> directory ownership and mode
-> allowed only when every layer permits the operation

たとえばread only = noは、Sambaが書き込み要求を受け付ける設定である。共有先ディレクトリに対応するLinuxユーザーの書き込み権限がなければ、実際のファイル作成は失敗する。Sambaの共有設定だけでLinuxファイルシステムの権限を超えることはできない。


読み取り専用共有と書き込み可能共有

Section titled “読み取り専用共有と書き込み可能共有”

read only = yesは、共有をSamba側で読み取り専用にする。read only = noは書き込みを許可するが、Linux側の書き込み権限も必要である。writableとwriteableはread onlyの反対を表す同義のパラメーターであるため、1つの共有で両方を混在させず、どちらか一方の表現に統一する。

browseable = yesは、クライアントがサーバーの共有一覧を取得したときに共有名を表示する。browseable = noでも、共有名を知っているクライアントからの直接接続を拒否する設定にはならない。


ゲスト共有は、Sambaパスワードによる認証を要求せず、ゲストアカウントで接続できる共有である。guest ok = yesはゲスト接続を許可し、guest only = yesを追加すると、認証済みユーザーを含むすべての接続をLinux上のゲストアカウントとして処理する。

現在のWindowsでは、認証なしのSMBゲスト接続をクライアント側の既定ポリシーで拒否する場合がある。Windows 11 24H2で既定となったSMB signingの必須化とも両立しない。Samba側の設定が正しくてもゲスト接続だけが失敗する場合は、クライアントのゲストログオンとSMB signingのポリシーを確認する。認証共有ではこの制約を受けない。

パラメーター 役割
map to guest = Bad User 存在しないユーザー名による接続をゲストへ変換する
guest account = nobody ゲスト接続がファイル操作に使うLinuxユーザーを指定する
guest ok = yes パスワードなしのゲスト接続を共有で許可する
guest only = yes 認証済みユーザーも含め、共有への接続をゲストとして処理する

Bad Userは、存在するユーザーが間違ったパスワードを入力した接続をゲストへ変換しない。誤ったパスワードまでゲスト扱いするBad Passwordは、認証失敗を利用者が認識できなくなるため使わない。

ゲスト接続で作成できるファイルの範囲は、nobodyの権限で決まる。ゲスト書き込み共有では、共有ディレクトリの所有者またはグループとLinuxモードを、この実行ユーザーに合わせる必要がある。


スタンドアロンサーバーのローカル認証では、1人の利用者に次の2つのアカウント情報が関係する。

情報 役割
Linuxユーザー ファイル操作時のUID、グループ、ファイルシステム権限を提供する
Sambaユーザー SMBクライアントから受け取ったパスワードを検証する

smbpasswd -a aliceは、既存のLinuxユーザーaliceに対応するSambaパスワードをローカルのSambaパスワードデータベースへ追加する。Linuxログイン用パスワードとSambaパスワードは別々に管理され、同じ値にする必要はない。

valid users = @smbusersは、Linuxグループsmbusersのメンバーだけに共有への接続を許可する。認証成功だけで全共有へのアクセスが許可されるわけではなく、共有ごとのvalid usersとLinux側のグループ権限が続けて評価される。


新規ファイルとディレクトリのモード

Section titled “新規ファイルとディレクトリのモード”

create maskは、SMB経由で新規作成するファイルのモードから、設定されていないビットを取り除く。directory maskは新規ディレクトリに対して同じ役割を持つ。

create mask = 0660
directory mask = 0770

この設定では、通常ファイルは所有者とグループだけが読み書きでき、ディレクトリは所有者とグループだけが一覧・作成・移動できる範囲に制限される。これらは上限となるマスクであり、親ディレクトリの所有権やアクセス権を新たに付与するものではない。

force group = smbusersは、共有内のファイル操作で使うグループをsmbusersへそろえる。共有元ディレクトリへsetgidビットを設定すると、新しく作られたサブディレクトリやファイルが親ディレクトリのグループを引き継ぎやすくなる。ディレクトリモード2770の先頭の2がsetgidビットである。


コマンド 確認内容
testparm -s smb.confの構文とSambaが解釈した設定
smbclient -L //server サーバーが公開する共有一覧
smbclient //server/share 認証、共有接続、読み書き
pdbedit -L ローカルSambaユーザー一覧
smbstatus 現在のSMB接続、セッション、開いているファイル
journalctl -u smbd smbdの起動・設定・接続時のエラー