Linux上でSambaサーバーを構築・設定する:Windowsクライアント向けの高速かつセキュアなファイル共有

Linux tutorial - IT technology blog
Linux tutorial - IT technology blog

LinuxとWindows間のファイル共有プロトコルの比較

LinuxサーバーとWindowsワークステーション間でのファイル共有は、OSが混在する環境における日常的な運用タスクです。長年にわたり、ネットワーク管理者はいくつかの標準プロトコルを活用してきました。それぞれに明確なメリットと実用上のトレードオフが存在します。

  • Samba (SMB/CIFS): プラットフォーム間のファイル共有におけるデファクトスタンダードです。サードパーティ製ソフトウェアを追加することなく、Windowsのエクスプローラーから標準機能のみで接続できます。WindowsのACLをLinuxのアクセス権限へと綺麗にマッピングでき、ドメインアカウントによる運用拡大時にはActive Directoryともシームレスに統合可能です。
  • NFS (Network File System): Linux同士のファイル転送では極めて高速ですが、Windowsでは扱いづらいプロトコルです。Windowsクライアント側でProまたはEnterpriseエディションが必要となり、オプション機能としてNFSを有効化しなければなりません。さらに、Windowsのセキュリティ識別子(SID)とLinuxのUID/GIDのマッピングが複雑で、権限エラーの原因になりがちです。
  • SFTP / SSHFS: SSH経由での単発的な管理者タスクには最適です。しかし、一般ユーザーがSSHFSディレクトリをドライブレターとしてマウントするには、WinFspやSSHFS-Winなどのドライバをインストールする必要があります。また、大容量ファイルの転送時に接続がフリーズしたり切断されたりしやすいという難点もあります。
  • WebDAV / クラウドゲートウェイ (Nextcloud、ownCloudなど): Webアクセスやモバイル同期を必要とするリモートワーカーには便利で信頼性があります。しかし、社内LANのスイッチ経由で1Gbpsや10Gbpsの高速転送を行いたいだけの場合、WebサーバーやMySQLデータベース全体を稼働させるのはオーバーヘッドが大きすぎます。

Sambaのメリットとデメリット

ローカルストレージをSambaで標準化する前に、そのメリットと日常的な管理における注意点を比較検討しておきましょう。

メリット

  • クライアント側の設定が不要: ユーザーは \\192.168.1.100\share のような標準的なUNC(Universal Naming Convention)パスを入力するだけで、即座にネットワークドライブを割り当てられます。
  • 多層的なアクセス制御: Linux標準のPOSIXパーミッションやPOSIX ACLの上に、Samba独自の共有制限を重ねて適用できます。
  • 最新の通信セキュリティ: 最新のSambaでは、脆弱なレガシープロトコルを排除し、SMB3暗号化、マルチチャネルによる帯域統合、堅牢なダイアレクト(方言)チェックがデフォルトで有効になっています。

注意点・デメリット

  • 2つのユーザーデータベースの二重管理: LDAPやActive Directoryドメインを運用していない場合、すべてのユーザーに対して /etc/passwd とSambaのローカルデータベース(passdb.tdb)の双方でアカウントを作成・管理する必要があります。
  • パーミッションマスクの競合: Unixのディレクトリ権限(chmod/chown)とSambaの作成マスク(create mask/directory mask)の設定がわずかでも食い違うと、新しく作成したファイルにアクセスできなくなるトラブルが発生します。

推奨アーキテクチャ:setgidアプローチ

本番LAN環境では、認証なしのオープンなゲスト共有は絶対に避けてください。代わりに、Linuxの setgid ビットを活用し、特定のグループで管理された隔離ディレクトリを構成します。これにより、新規作成されるすべてのファイルやサブフォルダが、親ディレクトリのグループ所有権を自動的に継承するようになります。

2つのvCPUと4GBのRAMを備えたUbuntu 22.04 LTS仮想マシンで、25台のWindows 11クライアントを同時接続してテストを実施しました。グループ継承を導入したことで、権限関連の問い合わせチケットはゼロになりました。また、業務時間中にCPUリソースを浪費していた毎時の chmod -R クリーンアップ用cronジョブも不要になりました。

基本セキュリティプロファイルとして、以下の4つのルールを適用します。

  • SMB2またはSMB3ダイアレクトを必須化する。SMBv1を無効化することで、EternalBlueなどのレガシーな攻撃を遮断します。
  • アクセス権限をルート以外の専用Linuxグループ(例:smbfinance)に関連付ける。
  • 親ディレクトリを chmod 2770 で保護し、グループ所有権の一貫性を保証する。
  • Sambaのリスナーをプライベートサブネットのみに厳格にバインドする。ポート445をインターネットに公開してはなりません。

導入手順

ステップ1:Sambaパッケージのインストール

まず、パッケージインデックスを更新し、必要なSambaパッケージをインストールします。

sudo apt update
sudo apt install -y samba samba-common-bin smbclient

Sambaデーモンが正常に起動していることを確認します。

sudo systemctl status smbd --no-pager

ステップ2:ディレクトリ構造の作成とグループの割り当て

共有データは個人のホームディレクトリではなく、適切な場所に配置します。DebianおよびUbuntuシステムでの標準的な配置場所は /srv/samba です。共有ディレクトリを作成し、専用のシステムグループを追加します。

sudo mkdir -p /srv/samba/finance_share
sudo groupadd smbfinance

所有権を root:smbfinance に変更し、パーミッション 2770 を適用します。先頭の 2 は setgid ビットを意味します。

sudo chown -R root:smbfinance /srv/samba/finance_share
sudo chmod -R 2770 /srv/samba/finance_share

ステップ3:LinuxユーザーおよびSambaユーザーの追加

Sambaがファイルの所有権を管理するには、基盤となるLinuxユーザーアカウントが必要です。ただし、そのユーザーに対話型シェルへのアクセス権を与える必要はありません。-M(ホームディレクトリを作成しない)および -s /usr/sbin/nologin フラグを使用して、ログイン制限付きのシステムユーザーを作成します。

# 制限付きのLinuxユーザーを作成
sudo useradd -M -s /usr/sbin/nologin -g smbfinance sarah

# Windows認証用のSambaパスワードを設定
sudo smbpasswd -a sarah

プロンプトが表示されたら、強力なパスワードを入力します。Windowsユーザーがデスクトップから共有フォルダに接続する際、このパスワードを使用します。

ステップ4:/etc/samba/smb.conf の設定

編集を行う前に、必ずデフォルトの設定ファイルをバックアップしてください。

sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak

エディタで設定ファイルを開きます。

sudo nano /etc/samba/smb.conf

[global] セクションをセキュリティを強化した以下の設定に置き換えるか、更新します。interfaces の行は、実際のサブネット環境(例: 192.168.1.0/24)に合わせて調整してください。

[global]
   workgroup = WORKGROUP
   server string = Ubuntu ファイルサーバー
   security = user
   passdb backend = tdbsam
   
   # プロトコルの強化: SMB1とNetBIOSを無効化
   server min protocol = SMB2_10
   client min protocol = SMB2_10
   disable netbios = yes
   smb ports = 445
   bind interfaces only = yes
   interfaces = 127.0.0.1/8 192.168.1.0/24
   
   # ログ設定
   log file = /var/log/samba/log.%m
   max log size = 1000
   logging = file

ファイルの末尾までスクロールし、財務チーム向けの共有セクションを定義します。

[Finance]
   comment = 財務チーム共有ストレージ
   path = /srv/samba/finance_share
   valid users = @smbfinance
   guest ok = no
   read only = no
   browsable = yes
   create mask = 0660
   directory mask = 0770
   force group = smbfinance

ファイルを保存し、設定ファイルの構文をチェックします。

testparm

testparm で Loaded services file OK と表示されたら、変更を適用します。

sudo systemctl restart smbd

ステップ5:ファイアウォールの設定

UFWを使用している場合は、ポート445の受信トラフィックを内部サブネットのみに制限します。このポートを外部に無制限に開放してはいけません。

sudo ufw allow from 192.168.1.0/24 to any port 445 proto tcp comment 'Samba SMB'

ステップ6:Windowsワークステーションからの接続

  1. Windowsキー + R を押して「ファイル名を指定して実行」ダイアログを開きます。
  2. サーバーのUNCパス \\192.168.1.100\Finance を入力して Enter キーを押します。
  3. Windowsの資格情報入力画面が表示されたら、ユーザー名 sarah と先ほど設定したSambaパスワードを入力します。
  4. フォルダ内にテスト用の .docx または .txt ファイルを作成し、エラーなく編集、名前変更、削除ができることを確認します。

よくある問題とトラブルシューティング

Windows側で「アクセスが拒否されました」と表示される場合:

  • ディレクトリのパーミッションを確認する: ls -ld /srv/samba/finance_share を実行します。所有権が root:smbfinance、パーミッションが drwxrws--- となっていることを確認してください。もし s ビットが表示されていない場合は、再度 sudo chmod 2770 /srv/samba/finance_share を実行します。
  • アクティブなクライアントログを調査する: sudo tail -n 50 /var/log/samba/log.* を実行して接続ログを監視し、ログインの失敗やプロトコルの拒否が発生していないか確認します。
  • アカウントの状態を確認する: ユーザーが接続できない場合は、Sambaアカウントが無効化されていないか確認してください(sudo smbpasswd -e sarah で有効化できます)。
Share: