第17章 Sambaサーバーの構築と運用

LPIC-2 209.1 相当

Windowsとのファイル共有を実現するSambaは、LPIC-2全体でも最大のweight(209.1、weight 5)を持つトピックです。本章では、SMB/CIFSプロトコルの基礎から、smb.confの設定項目、ユーザー管理、Active Directoryへの参加、運用・診断コマンド、Linux側でのマウント方法まで、実務で必要になる内容を一通り扱います。Unix系間の標準的な共有方式であるNFSは、次章で扱います。

SMB/CIFSプロトコルの位置づけ

Sambaは、Windowsが標準で使うSMB(Server Message Block)・CIFS(Common Internet File System、SMB1の別名として使われることが多い呼称)プロトコルをLinux上で実装したソフトウェアです。ファイル共有だけでなくプリンタ共有、認証、名前解決までを一体で提供します。

バージョン主な特徴
SMB1(CIFS)1980年代からの最も古い世代。性能・セキュリティ面で多くの弱点を抱え、現在は既定で無効化するのが標準的な運用
SMB2Windows Vista/Server 2008で導入。プロトコルの単純化・性能改善が図られた
SMB3Windows 8/Server 2012以降。通信の暗号化(SMB Encryption)、マルチチャネル、透過的フェイルオーバーなどに対応した現行の標準
SMB1を無効化すべき理由(WannaCryの教訓): 2017年に世界的な被害をもたらしたランサムウェア「WannaCry」は、SMB1の脆弱性(EternalBlue)を悪用して感染を広げました。この事件を契機に、Microsoftを含む業界全体でSMB1を既定で無効化する流れが定着しています。Sambaでもserver min protocol = SMB2のように最低プロトコルバージョンを引き上げ、SMB1を受け付けない設定にするのが現在の標準的な運用です。

SMB/CIFSと合わせて理解しておきたいのがNetBIOS(Network Basic Input/Output System)による名前解決です。NetBIOSは、DNSが普及する以前からWindowsネットワークで使われてきた独自の名前解決の仕組みで、nmbdデーモンがこれを担当します。現在の環境ではDNSによる名前解決が主体となっていますが、Active Directory環境ではDNSが正式な名前解決手段として使われる一方、同一セグメント内のブロードキャストによる簡易な検索やレガシー用途でNetBIOSも併存しているため、両者の役割分担を理解しておく必要があります。

ポート番号プロトコル役割
137/udpNetBIOS Name ServiceNetBIOS名の名前解決(問い合わせ・応答)
138/udpNetBIOS Datagram Serviceコネクションレスなデータグラム通信(ブラウジング等)
139/tcpNetBIOS Session ServiceNetBIOS上でのSMBセッション(SMB1時代の主経路)
445/tcpSMB over TCP(Direct Host)NetBIOSを経由せず直接TCP上でSMBを流す、現在主流の経路

現在主流の構成では、445/tcpが実際のファイル共有通信の主役であり、137〜139番はNetBIOS関連の互換性維持のために残されています。ファイアウォールで不要なポートを絞り込む際は、社内ネットワークの構成(NetBIOSに依存した古いクライアントが残っていないか)を確認したうえで判断する必要があります。

Sambaのデーモン構成

Sambaは単一のプロセスではなく、役割の異なる複数のデーモンで構成されています。それぞれの役割を理解しておくと、障害時にどのデーモンを疑えばよいかの切り分けが早くなります。

デーモン役割停止しているとどうなるか
smbdファイル共有・プリンタ共有の本体。クライアントからのSMB接続要求を処理する
nmbdNetBIOS名前解決とブラウジング(ネットワーク上の一覧表示)を担当
winbinddWindowsドメイン(AD)のユーザー・グループ情報をLinux側のUID/GIDへ解決する

smbdが停止していると、そもそもファイル共有そのものにアクセスできなくなります。nmbdが停止していても445/tcp経由のSMB接続自体は機能しますが、NetBIOS名でのホスト検索やネットワーク上の「コンピュータ一覧」への表示ができなくなります。winbinddが停止していると、ADドメインのユーザーでログインしようとしても認証やUID/GIDの解決に失敗し、getent passwdでもドメインユーザーが一切表示されなくなります。3つのデーモンは独立したsystemdサービスとして管理されており、必要なものだけを個別に起動・停止できます。

$ sudo systemctl status smbd nmbd winbindd
● smbd.service - Samba SMB Daemon
     Active: active (running) since Fri 2026-08-21 07:58:10 JST; 1h 20min ago
● nmbd.service - Samba NMB Daemon
     Active: active (running) since Fri 2026-08-21 07:58:10 JST; 1h 20min ago
● winbindd.service - Samba Winbind Daemon
     Active: inactive (dead)
$ sudo systemctl enable --now smbd nmbd winbindd
Created symlink /etc/systemd/system/multi-user.target.wants/smbd.service → /usr/lib/systemd/system/smbd.service.
Created symlink /etc/systemd/system/multi-user.target.wants/nmbd.service → /usr/lib/systemd/system/nmbd.service.
Created symlink /etc/systemd/system/multi-user.target.wants/winbindd.service → /usr/lib/systemd/system/winbindd.service.

この行のこの値に注目: statusを複数サービス名まとめて指定すると、それぞれのActive行が個別に表示されます。この例ではwinbinddだけがinactive (dead)で、AD連携を使わない構成であれば起動不要ですが、AD参加済みの環境でこの状態だと認証が機能しません。

ディストリビューションによる違い: ここで使っているsmbd/nmbd/winbinddというユニット名はDebian系での表記です。RHEL系の派生ディストリビューションではsmb/nmb(末尾のdなし)というユニット名が使われることもあるため、実際の環境ではsystemctl list-units | grep -i sambaのように確認してから操作すると確実です。

smb.confの設定例([global]セクション)

Sambaの中核となる設定ファイルは/etc/samba/smb.confです。[global]セクションには、サーバー全体に関わる設定を記述します。

/etc/samba/smb.conf([global]セクションの設定例)
[global]
    workgroup = EXAMPLE
    server string = Samba File Server %v
    security = user
    map to guest = Bad User
    netbios name = FILESERVER01
    server min protocol = SMB2
    log file = /var/log/samba/log.%m
    max log size = 1000
    passdb backend = tdbsam
    unix charset = UTF-8
    dos charset = CP932
パラメータ役割
workgroupWindowsのワークグループ名(またはドメインのNetBIOS名)
server stringネットワーク上に表示されるサーバーの説明文字列。%vはSambaのバージョンに置換されるマクロ
security認証方式。user(個々のユーザー認証、標準的)やads(Active Directoryドメインへの参加)など
map to guest認証情報がない・失敗したアクセスをゲストとして扱うかの制御
netbios nameネットワーク上でこのサーバーが名乗るNetBIOS名(ホスト名と異なる名前も設定可)
server min protocol許可する最低限のSMBプロトコルバージョン。古いSMB1は脆弱性が多いため無効化するのが一般的
log fileログの出力先。%mは接続元クライアントのマシン名に置換される
max log size1ログファイルあたりの最大サイズ(KB単位)。超過すると自動的にローテーションされる
passdb backendSambaのユーザー・パスワード情報の保存方式。tdbsam(tdbデータベース)が標準的
unix charsetLinux側(ファイルシステム上)で使う文字コード。通常はUTF-8
dos charset古いDOS/Windowsクライアント向けの文字コード。日本語環境ではCP932(Shift-JIS系)を指定することが多い

[homes]・[printers]・共有セクションの書式

[global]以外のセクションは、それぞれ1つの共有(またはホームディレクトリ・プリンタの自動共有)を表します。[homes]と[printers]は特別な意味を持つ予約セクション名です。

/etc/samba/smb.conf([homes]セクションの例)
[homes]
    comment = ホームディレクトリ
    browseable = no
    writable = yes
    valid users = %S

[homes]セクションを定義しておくと、Sambaにログインしたユーザーごとに、そのユーザーのLinuxホームディレクトリが自動的に\\fileserver\ユーザー名という共有として見えるようになります。個々のユーザーごとに共有セクションを手書きする必要がない点が特徴です。%Sは「現在アクセスしているサービス(共有)名」に置換されるマクロで、[homes]の文脈ではログイン中のユーザー名と一致します。

/etc/samba/smb.conf(通常の共有セクションの例)
[shared]
    comment = 部署共通フォルダ
    path = /srv/samba/shared
    read only = no
    valid users = alice, bob, @staff
    write list = alice
    create mask = 0664
    directory mask = 0775
    force group = staff
    browseable = yes
    guest ok = no
パラメータ役割
read only共有全体を読み取り専用にするかどうか(writableの否定形にあたる書き方)
valid usersこの共有へのアクセスを許可するユーザー・グループの一覧。@グループ名でグループ指定も可能
write listread only = yesの共有であっても、例外的に書き込みを許可するユーザー
create maskファイル作成時に許可する最大パーミッション
directory maskディレクトリ作成時に許可する最大パーミッション
force group実際の書き込みを常に指定したUnixグループの権限で行わせる
browseableネットワーク上の共有一覧にこの共有を表示するかどうか
guest ok認証なしのゲストアクセスを許可するかどうか

[shared]セクションの各パラメータのうち、書き込み可否に関わる設定は、最終的にLinux側のファイルシステム権限(所有者・パーミッション)とも掛け合わされます。Samba側で許可していても、Linux側のパーミッションで書き込みが拒否されていれば書き込めません。この「2段構えの権限チェック」はトラブルシューティングでよく見落とされるポイントです。

セキュリティモード(share/user/domain/ads)

Sambaのsecurityパラメータは、クライアントをどう認証するかを決める設定で、歴史的に何段階か変遷してきました。

値認証方式
share共有ごとにパスワードを設定する古い方式(レガシー、現在のSambaでは廃止済み)
userSambaサーバー自身がユーザーごとに認証する、スタンドアロン構成の標準
domainNT4スタイルのドメインコントローラに認証を委任する(レガシー)
adsActive Directoryドメインのメンバーサーバーとして、Kerberosベースで認証する現在の標準

security = userとsecurity = adsでは、必要となる設定項目が大きく異なります。単体のファイルサーバーとして構築する場合と、既存のAD環境に参加させる場合の設定差分を比較します。

スタンドアロン構成(security = user)の[global]
[global]
    workgroup = EXAMPLE
    security = user
    passdb backend = tdbsam
ADメンバーサーバー構成(security = ads)の[global]
[global]
    workgroup = EXAMPLE
    realm = EXAMPLE.COM
    security = ads
    idmap config * : backend = tdb
    idmap config * : range = 3000-7999
    idmap config EXAMPLE : backend = rid
    idmap config EXAMPLE : range = 10000-999999

security = adsでは、認証をADドメインコントローラに委ねるためpassdb backend(ローカルのユーザーDB)は不要になる一方、Windows側のSID(セキュリティ識別子)とLinux側のUID/GIDを対応付けるidmap configと、AD参加のためのKerberosレルム(realm)の指定が新たに必要になります。新規に構築する場合、単体のファイルサーバーであればuser、既存のAD環境と連携するのであればadsを選ぶのが基本方針です。shareは既に廃止されているため、古い解説記事などで見かけても現在の構築では使用しません。

ユーザー管理とパスワードデータベース

Sambaのユーザーアカウントは、Linuxのユーザーアカウントとは別に管理されます。passdb backend = tdbsamを使う場合、SambaはLinux上に既に存在するユーザー名と紐づけつつ、SMB認証専用のパスワードハッシュを別のデータベース(/var/lib/samba/private/passdb.tdb)に保持します。これはWindowsのSMB認証プロトコルが要求するパスワードハッシュ形式(NTLMハッシュなど)がLinuxの標準的なパスワードハッシュ(shadowのSHA-512等)と異なるためで、この理由からLinuxのパスワードを変更してもSamba側のパスワードは自動的には変わりません。

$ sudo smbpasswd -a alice     # Sambaユーザーを新規追加(要事前にLinuxユーザーが存在すること)
New SMB password:
Retype new SMB password:
Added user alice.
$ sudo smbpasswd -x alice     # Sambaユーザーを削除
Deleted user alice.
$ sudo smbpasswd -d alice     # アカウントを無効化(一時的にログイン不可にする)
Disabled user alice.
$ sudo smbpasswd -e alice     # 無効化したアカウントを再度有効化
Enabled user alice.

この行のこの値に注目: smbpasswdのパスワードはLinux本体のログインパスワードとは別に管理されており、-aで新規追加する際も専用のパスワードを2回入力します。Added/Deleted/Disabled/Enabledという応答から、それぞれの操作が意図通りに完了したかを確認できます。

$ sudo pdbedit -L -v alice
---------------
Unix username:        alice
NT username:
Account Flags:        [U          ]
User SID:              S-1-5-21-1234567890-987654321-135798642-1000
Primary Group SID:     S-1-5-21-1234567890-987654321-135798642-513
Full Name:
Home Directory:        \\fileserver01\alice
HomeDir Drive:
Logon Script:
Profile Path:          \\fileserver01\alice\profile
Domain:                EXAMPLE
Account desc:
Workstations:
Munged dial:
Logon time:            0
Logoff time:           never
Kickoff time:          never
Password last set:     Wed, 20 Aug 2026 10:00:00 JST

pdbedit -Lだけだとユーザー名の一覧のみですが、-v(verbose)を付けるとSID・ホームディレクトリ・パスワード最終変更日時などの詳細情報を確認できます。

Windowsのユーザー名とLinuxのユーザー名を別々に運用したい場合はusername mapを使います。たとえばWindows側のドメインユーザー名j.smithを、Linux側の既存ユーザーjsmithに対応付けるといった用途です。

/etc/samba/smb.confの[global]セクション
[global]
    username map = /etc/samba/smbusers
/etc/samba/smbusers の書式(Windows側名 = Linux側名)
root = administrator admin
jsmith = j.smith
nobody = guest pcguest smbguest

1行に複数のWindows側ユーザー名を空白区切りで列挙すると、それらすべてが同じLinuxユーザーへマッピングされます。異動や組織変更でWindows側のログオン名だけを変更したい場合にも、Linux側のユーザーやファイルの所有権はそのまま維持できる、実務上便利な仕組みです。

Active Directoryへの参加

既に存在するWindows Active Directoryドメインに、LinuxサーバーをSamba経由で「メンバーサーバー」として参加させる手順を説明します。事前に、DNS解決とKerberos認証が正しく機能している必要があります。

/etc/krb5.conf の設定例
[libdefaults]
    default_realm = EXAMPLE.COM
    dns_lookup_realm = false
    dns_lookup_kdc = true
$ sudo net ads join -U administrator
Enter administrator's password:
Using short domain name -- EXAMPLE
Joined 'FILESERVER01' to dns domain 'example.com'

Joined ... to dns domain ...という出力が表示されれば、ドメインへの参加は成功です。続けて、参加状態の確認と、winbinddの設定を行います。

/etc/samba/smb.confの[global]セクション(winbindd関連)
[global]
    winbind use default domain = yes
    idmap config * : backend = tdb
    idmap config * : range = 3000-7999
    idmap config EXAMPLE : backend = rid
    idmap config EXAMPLE : range = 10000-999999
    template shell = /bin/bash
    template homedir = /home/%D/%U

template shellはwinbindd経由で解決されたドメインユーザーに割り当てるログインシェル、template homedirはホームディレクトリのパスのひな形です。%Dはドメイン名、%Uはユーザー名に置換されるマクロで、この例ではドメインごとにホームディレクトリが分離されます。

$ sudo net ads testjoin
Join is OK
$ wbinfo -u
administrator
guest
krbtgt
jsmith
alice
$ wbinfo -g
domain admins
domain users
staff
$ getent passwd jsmith
EXAMPLE\jsmith:*:10000:10000::/home/EXAMPLE/jsmith:/bin/bash

wbinfo -u・wbinfo -gはwinbindd経由で見えるADユーザー・グループの一覧、getent passwdはNSS(Name Service Switch)を経由して、Linuxの標準的なユーザー検索の仕組みからADユーザーが正しく引けるかどうかを確認するコマンドです。getentで結果が返ってこない場合は、/etc/nsswitch.confのpasswd行にwinbindが追加されているかを確認します。

運用・診断コマンド

Sambaの運用でよく使う診断コマンドと、それぞれの実行結果の読み方を確認します。

$ testparm
Load smb config files from /etc/samba/smb.conf
rlimit_max: increasing rlimit_max (1024) to minimum Windows limit (16384)
Loaded services file OK.
Server role: ROLE_STANDALONE
Press enter to see a dump of your service definitions

構文エラーがある場合は、次のようにエラー箇所と行番号が表示され、Loaded services file OK.は表示されません。

$ testparm
Load smb config files from /etc/samba/smb.conf
Unknown parameter encountered: "raed only"
Ignoring unknown parameter "raed only"
params.c:Parameter() - Ignoring badly formed line in configuration file: raed only = no
rlimit_max: increasing rlimit_max (1024) to minimum Windows limit (16384)
Loaded services file OK.

これはread onlyのタイプミス(raed only)の例です。testparmは未知のパラメータ名を検出すると警告を出しますが、致命的な構文エラーでなければ処理自体は続行される点に注意が必要です。testparm -vを使うと、明示的に設定していない項目も含めた全パラメータの実効値(既定値込み)を確認できます。

$ smbstatus

Samba version 4.19.5
PID     Username     Group        Machine                                  Protocol Version  Encryption   Signing
----------------------------------------------------------------------------------------------------------------
2451    alice        staff        192.168.1.50 (ipv4:192.168.1.50:54212)   SMB3_11           -            AES-128-GMAC

Service      pid     Machine       Connected at                  Encryption   Signing
---------------------------------------------------------------------------------------
shared       2451    192.168.1.50  Tue Aug 20 10:15:22 2026 JST  -            AES-128-GMAC

Locked files:
Pid     Uid    DenyMode   Access       R/W    Oplock         SharePath   Name   Time
--------------------------------------------------------------------------------------
2451    1001   DENY_NONE  0x100081    RDONLY NONE           /srv/samba/shared  report.xlsx  Tue Aug 20 10:16:01 2026

smbstatusの出力は大きく3つのブロックに分かれます。最初のブロックは現在接続中のセッション(誰が・どのマシンから・どのプロトコルバージョンで接続しているか)、2番目は接続中の共有(サービス)ごとの状態、3番目はロックされているファイルの一覧です。Locked filesのセクションを見れば、「誰が・どのファイルを・どのモードで開いているか」が分かるため、他のユーザーがファイルを編集できない、という問い合わせの一次切り分けに使えます。

$ nmblookup -A 192.168.1.50
Looking up status of 192.168.1.50
        FILESERVER01    <00> -         B <ACTIVE>
        FILESERVER01    <03> -         B <ACTIVE>
        FILESERVER01    <20> -         B <ACTIVE>
        EXAMPLE         <00> - <GROUP> B <ACTIVE>

nmblookup -Aは、指定したIPアドレスに対してNetBIOSステータスを問い合わせ、そのホストが名乗っているNetBIOS名の一覧を表示します。<20>はファイル・プリンタ共有サービスが有効であることを示すサフィックスです。

$ smbclient -L //fileserver01 -U alice
Enter alice's password:

        Sharename       Type      Comment
        ---------       ----      -------
        shared          Disk      部署共通フォルダ
        alice           Disk      ホームディレクトリ
        printers        Printer   All Printers
        IPC$            IPC       IPC Service (Samba File Server 4.19.5)

smbclient -L(list)は、指定したサーバーが公開している共有の一覧を表示します。IPC$は管理用の内部通信に使われる特殊な共有で、通常のファイル共有とは異なります。

$ smbclient //fileserver01/shared -U alice
smb: \> ls
  .                                   D        0  Tue Aug 20 10:00:00 2026
  ..                                  D        0  Tue Aug 20 10:00:00 2026
  report.xlsx                        A    24576  Tue Aug 20 09:30:00 2026
smb: \> cd subdir
smb: \subdir\> get notes.txt
getting file \subdir\notes.txt of size 512 as notes.txt
smb: \subdir\> put localfile.txt
putting file localfile.txt as \subdir\localfile.txt

smbclientは共有に対話的に接続できるクライアントで、FTPクライアントに似た内部コマンド(ls・cd・get・putなど)でファイルの一覧表示・ディレクトリ移動・ダウンロード・アップロードができます。スクリプトから自動化する場合は-cオプションでコマンドを直接渡すことも可能です。

SambaをADドメインコントローラとして動かしている場合、ユーザー管理にはsamba-toolを使います。

$ sudo samba-tool user create bob P@ssw0rd123 --given-name=Bob --surname=Smith
User 'bob' created successfully
$ sudo samba-tool domain info 192.168.1.10
Forest              : example.com
Domain              : example.com
Netbios domain      : EXAMPLE
DC name             : dc01.example.com
DC netbios name     : DC01

最後に、Sambaの管理系サブコマンドはnetコマンドの下に体系立てて用意されています。

サブコマンド体系用途
net rpc ...RPC(リモートプロシージャコール)経由でWindowsサーバー・ドメインを操作する(net rpc infoでドメイン情報表示など)
net ads ...Active Directory(LDAP/Kerberos)経由での操作。ドメイン参加(join)や参加状態確認(testjoin)など
net cache ...winbindd等が保持するキャッシュの確認・削除(net cache flushでキャッシュを全消去)

winbinddの名前解決結果が古いままで反映されない、といった問題に遭遇した場合は、net cache flushでキャッシュをクリアしてから再確認するのが定石です。

Linuxクライアントからのマウント

他のLinuxサーバーからSamba(またはWindows)の共有をマウントするには、cifs-utilsパッケージに含まれるmount.cifsヘルパーを使います。まず、パッケージがインストールされていることを確認してください。

$ sudo apt install cifs-utils     # Debian/Ubuntu系
Setting up cifs-utils (2:7.0-6ubuntu2) ...
$ sudo dnf install cifs-utils     # RHEL/CentOS系
Installed:
  cifs-utils-7.0-4.el9.x86_64
Complete!
マウントオプション意味
username接続に使うユーザー名
passwordパスワード(コマンドラインや平文でのfstab記述は非推奨、次項参照)
credentialsユーザー名・パスワードを別ファイルから読み込ませる指定
uid / gidマウントしたファイルのLinux側の所有者・グループを固定する
file_mode / dir_modeマウントしたファイル・ディレクトリに見せるパーミッション
vers使用するSMBプロトコルバージョンを明示的に指定(vers=3.0など)
iocharsetファイル名の文字コード変換に使う文字セット(通常utf8)

パスワードをコマンドラインや/etc/fstabに平文で書くのはセキュリティ上望ましくないため、credentialsファイルに分離するのが標準的な運用です。

/root/.smbcredentials の例
username=alice
password=P@ssw0rd123
domain=EXAMPLE
$ sudo chmod 600 /root/.smbcredentials   # root以外が読めないよう制限(パスワードが平文で書かれているため必須。正常時は無出力)
$ sudo mount -t cifs //fileserver01/shared /mnt/win \
    -o credentials=/root/.smbcredentials,uid=1000,gid=1000,file_mode=0664,dir_mode=0775,vers=3.0,iocharset=utf8

credentialsファイルのパーミッションを600(所有者のみ読み書き可)に制限しないと、他のユーザーがファイルを開いてパスワードを盗み見できてしまうため、この設定は必須の手順として扱ってください。恒久的にマウントする場合は/etc/fstabに記述します。

/etc/fstab の例
//fileserver01/shared  /mnt/win  cifs  credentials=/root/.smbcredentials,uid=1000,gid=1000,vers=3.0,_netdev  0  0

_netdevオプションは、ネットワークが利用可能になってからこのエントリをマウントするようsystemdに指示するもので、ネットワーク越しのファイルシステムには必須です。これを付けずに再起動すると、ネットワークが上がる前にマウントが試行されて失敗し、システムの起動が遅延・停止する原因になることがあります。

プリンタ共有の設定

Sambaはファイル共有だけでなく、Linuxサーバーに接続されたプリンタ、あるいはCUPS(Common Unix Printing System)で管理されているプリンタを、Windowsクライアントへ共有することもできます。

/etc/samba/smb.confのプリンタ共有設定例
[global]
    printing = cups
    printcap name = cups

[printers]
    comment = All Printers
    path = /var/spool/samba
    browsable = no
    printable = yes
    guest ok = no

[printers]という特別なセクション名は、CUPSに登録されている全てのプリンタを自動的に共有対象にする特殊な意味を持ちます。個別のプリンタごとにセクションを分けて細かく権限を設定することも可能です。pathに指定するのは、印刷ジョブが処理されるまでの一時的なスプールディレクトリです。

ログとトラブルシューティング

Sambaのログは既定で/var/log/samba/以下に、デーモンごと・接続元クライアントごとに分かれて出力されます。ログの詳細度はlog levelで制御します。

log level詳細度
0致命的なエラーのみ。通常運用での最小構成
1〜3警告・接続の成否など、通常運用で継続的に見ておく範囲
5〜7個々のSMB操作の詳細。障害の切り分けに有用だがログ量が増える
10デバッグレベル。プロトコルの生データに近い情報まで出力され、一時的な調査以外では使わない

通常運用では1〜3程度、切り分けが難航する場合は一時的に10前後まで上げて調査し、原因が分かったら元の値に戻すのが定石です。ログレベルを上げたまま放置すると、ディスクを圧迫するだけでなく機微な情報がログに残るリスクもあるため注意してください。

「接続できない」という問い合わせを受けた場合の切り分け手順は、次の順序で進めると効率的です。

  1. ポート疎通の確認: nc -zv fileserver01 445などで、そもそもネットワーク的に到達できているかを確認する
  2. testparmでの構文チェック: smb.confに構文エラーがないか、意図した設定が実際に読み込まれているかを確認する
  3. smbclient -Lでの共有一覧確認: サーバー側が想定通りの共有を公開しているかを確認する
  4. 認証の確認: ユーザー名・パスワードが正しいか、ADメンバーサーバーであればwinbinddが正常に動作しているか(wbinfo -u)を確認する
  5. Linux側パーミッションの確認: Samba側の設定では許可されていても、Linux側のファイル・ディレクトリのパーミッション(所有者・グループ・モード)で拒否されていないかを確認する

特に5番目の「Samba側で許可しているのに書き込めない」は頻出のパターンです。valid usersやwrite listでSamba側は書き込みを許可していても、実際のディレクトリのUnixパーミッションが読み取り専用(例:drwxr-xr-xで書き込みグループに属していない)であれば、最終的には書き込みが拒否されます。この「2段構えの権限チェック」を意識せずに、Samba側の設定だけを何度も見直して原因が分からなくなる、というのはよくある落とし穴です。

エラー主な原因
NT_STATUS_ACCESS_DENIED認証は成功しているが、共有・ファイルへのアクセス権限がない(Samba側のvalid usersやLinux側のパーミッションを確認)
NT_STATUS_LOGON_FAILUREユーザー名・パスワードが誤っている、またはアカウントがsmbpasswd -d等で無効化されている
NT_STATUS_BAD_NETWORK_NAME指定した共有名がsmb.confに存在しない、またはタイプミスしている

ADメンバーサーバー構成でログインできない場合は、まずnet ads testjoinでドメイン参加状態を確認し、次にwbinfo -uでwinbinddがユーザー一覧を正しく取得できているかを確認する、という順序で切り分けます。

確認クイズ

Q1. WindowsのSMB/CIFSプロトコルを使ったファイル共有をLinuxサーバーから提供するソフトウェアはどれですか?

解説: SambaはSMB/CIFSプロトコルを実装しており、Windowsとのファイル共有・プリンタ共有を可能にします。

Q2. 2017年のランサムウェア「WannaCry」の感染拡大を受けて、既定で無効化することが標準的な運用になったSMBのバージョンはどれですか?

解説: WannaCryはSMB1の脆弱性(EternalBlue)を悪用したため、この事件を契機にSMB1を既定で無効化する運用が定着しました。

Q3. SMBをNetBIOSを経由せず直接TCP上で流す、現在主流の通信で使われるポート番号はどれですか?

解説: 445/tcpはNetBIOSを経由しない直接のSMB通信(Direct Host)に使われる、現在主流のポートです。

Q4. Sambaのデーモンのうち、Windowsドメイン(AD)のユーザー・グループ情報をLinuxのUID/GIDへ解決する役割を持つものはどれですか?

解説: winbinddは、AD等のドメインのユーザー・グループ情報をLinux側のUID/GIDへ解決するデーモンです。

Q5. Sambaのユーザーアカウントのパスワード情報をtdbデータベースで管理する、smb.confの標準的なpassdb backendの値はどれですか?

解説: tdbsamは、Sambaのユーザー・パスワード情報をtdbデータベースに保存する、現在の標準的なpassdb backendです。

Q6. 既にログインを無効化したSambaユーザーを再度有効化するsmbpasswdのオプションはどれですか?

解説: smbpasswd -eは無効化されたアカウントを再度有効化します。-xは削除、-dは無効化に使います。

Q7. Windows側のユーザー名とLinux側のユーザー名を別々に対応付けたい場合に使う、smb.confのパラメータはどれですか?

解説: username mapは、Windows側のログオン名とLinux側の既存ユーザー名を対応付けるための設定です。

Q8. 既存のActive Directoryドメインへメンバーサーバーとして参加する際に実行するコマンドはどれですか?

解説: net ads joinコマンドで、LinuxサーバーをActive Directoryドメインへメンバーサーバーとして参加させます。

Q9. 次のsmbstatusの出力の「Locked files」ブロックから読み取れる情報として適切なものはどれですか?
Locked files:
Pid  Uid  DenyMode  Access  R/W  Oplock  SharePath  Name  Time
2451 1001 DENY_NONE 0x100081 RDONLY NONE /srv/samba/shared report.xlsx Tue Aug 20 10:16:01 2026

解説: Locked filesブロックには、現在開かれているファイルとそのアクセスモード・PID・所有者UIDが表示され、ファイルロックの問い合わせの一次切り分けに使えます。

Q10. 次のtestparmの出力から読み取れる状態として適切なものはどれですか?
Unknown parameter encountered: "raed only"
Ignoring unknown parameter "raed only"
Loaded services file OK.

解説: 未知のパラメータ名(この場合read onlyのタイプミス)は警告として無視され、致命的な構文エラーでなければ設定ファイルの読み込み自体は継続されます。

Q11. 次のsmb.confの共有設定には、valid usersでaliceの読み書きを許可する意図に反して、実際には書き込みができない典型的な原因が潜んでいます。最も可能性が高い原因はどれですか?
[shared]
    path = /srv/samba/shared
    valid users = alice
    read only = no

(/srv/samba/sharedのLinux側パーミッションが drwxr-xr-x root:root の場合)

解説: Samba側でread only = noとして書き込みを許可していても、Linux側のディレクトリパーミッション(drwxr-xr-x)ではowner(root)以外に書き込み権限がないため、2段構えの権限チェックの後段で拒否されます。

Q12. 次のsmb.conf設定には、意図せず誰でも書き込める公開共有になってしまう危険なミスがあります。該当する行はどれですか?
[public]
    path = /srv/samba/public
    guest ok = yes
    read only = no
    browseable = yes

解説: guest ok = yes(認証不要のゲストアクセスを許可)とread only = no(書き込み許可)を同時に設定すると、認証なしの誰もが書き込める公開共有になってしまうため、公開範囲の意図を確認する必要があります。