FedoraへのSamba Serverインストール:SELinuxとfirewalldを使ってWindowsと安全にファイル共有する方法

Fedora tutorial - IT technology blog
Fedora tutorial - IT technology blog

Samba、NFS、SFTP — ローカルネットワークにはどれを選ぶ?

同じLAN内でLinuxとWindowsマシン間でファイルを共有する必要がある場合、主に3つの選択肢がある:Samba(SMB/CIFS)、NFS、そしてSSH経由のSFTPだ。Fedoraをメインの開発マシンとして2年間使ってきて、3つすべてを試した。それぞれに独自の強みがあり、異なるシナリオに適している — すべての状況に完璧な選択肢はない。

各選択肢のメリット・デメリット分析

NFS(Network File System)は、Linux同士でのみ作業する場合の理想的な選択だ。パフォーマンスが高く、設定も簡単。デメリット:WindowsはNFSをネイティブにサポートしていない — Windows側に追加ソフトウェアをインストールする必要があり、特にWindows 10/11 Homeでは動作がもたつく。

SSH経由のSFTPは非常に安全で、ポート22を開けるだけでよい。手動でのファイル転送に適している。欠点は、Windowsエクスプローラーでネットワークドライブとしてマウントできないことだ — 毎回WinSCPやFileZillaを開く必要があり、日常業務には不便だ。

SambaはSMBプロトコルを使用しており、これはWindowsが内部でファイル共有に使っているプロトコルそのものだ。Windowsエクスプローラーがすぐに認識し、追加ソフトウェアなしでネットワークドライブとしてマウントでき、プリンタ共有もサポートしている。唯一のデメリット:SELinuxとfirewalldがデフォルトで非常に厳しいため、Fedoraでの設定はより複雑になる。

Sambaが正しい選択となるのはいつか?

  • ハイブリッドなLinux + Windows環境で頻繁にファイルを共有する必要がある場合
  • サードパーティソフトウェアなしにWindowsエクスプローラーでネットワークドライブとしてマウントしたい場合
  • ローカルネットワーク経由でプリンタを共有する必要がある場合
  • チームがWindowsを使用しており、サーバーがFedoraで動いている場合

純粋にLinuxだけの環境ならNFSを使おう。たまにファイルを転送するだけならSFTPで十分だ。この記事ではSambaに集中する — Fedoraで最も複雑で、最もサイレントなエラーが発生しやすいケースだからだ。

なぜFedoraはSambaの実行が他のディストリビューションより「難しい」のか?

UbuntuにSambaをインストールしたことがあって手早くできたと感じているなら、Fedoraに移ったときに戸惑うだろう。最も頭を悩ませる2つはSELinuxfirewalldだ — どちらもデフォルトで有効になっており、画面に明確なエラーを表示せずにSambaをブロックする可能性がある。

典型的なエラー:smb.confの設定は正しく、サービスは動いているのに、Windowsから接続するとshareが見えないか、見えても開こうとすると拒否される — SELinuxコンテキストが間違っているか、firewalldで正しいゾーンが開放されていないだけの理由で。これが技術フォーラムで「FedoraでSambaが動かない」という質問の約80%の原因だ。

FedoraへのSambaインストール

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

sudo dnf install samba samba-common samba-client -y

samba-clientパッケージはサーバーには必須ではないが、Windowsマシンに頼らずFedora自身から接続をテストするのに役立つ。

ステップ2:サービスの有効化と起動

sudo systemctl enable --now smb nmb

smbはSMB/CIFSを処理するメインのSambaサービスだ。nmbはNetBIOSネームサービス — IPアドレスを覚えなくても名前でWindowsがサーバーを見つけられるようにする。

共有フォルダの設定

フォルダの作成とパーミッション設定

# 共有ディレクトリを作成する
sudo mkdir -p /srv/samba/shared

# Sambaユーザー管理グループを作成する
sudo groupadd sambashare

# グループに読み取り/書き込み権限を付与する
sudo chmod 0775 /srv/samba/shared
sudo chgrp sambashare /srv/samba/shared

smb.confの設定

メインの設定ファイルは/etc/samba/smb.confにある。編集前にバックアップを取ろう — 何も失わない良い習慣だ:

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

ファイルの末尾に以下のセクションを追加する:

[global]
    workgroup = WORKGROUP
    server string = Fedora Samba Server
    security = user
    passdb backend = tdbsam
    log file = /var/log/samba/log.%m
    max log size = 50

[shared]
    comment = Shared Folder
    path = /srv/samba/shared
    browseable = yes
    read only = no
    valid users = @sambashare
    create mask = 0664
    directory mask = 0775

保存後すぐに構文を確認する:

testparm

Sambaユーザーの作成

Sambaはシステムユーザーとは分離した独自のユーザーデータベースを使用する。ただし、SambaユーザーはLinuxに先に存在している必要がある — /etc/passwdに存在しないアカウントにSambaパスワードを作成することはできない。

# 現在のユーザーをsambashareグループに追加する
sudo usermod -aG sambashare $(whoami)

# ユーザーのSambaパスワードを作成する
sudo smbpasswd -a $(whoami)

新しい設定を適用するためにSambaを再起動する:

sudo systemctl restart smb nmb

SELinuxの処理 — Fedoraで最も重要な部分

これは、インターネット上のほとんどのガイドが省略するか「SELinuxを無効にしろ」と簡単に書いてしまうステップだ。無効化は推奨しない — 正しいコンテキストとbooleansを設定する必要がある。5分でできて、システムのセキュリティを維持でき、サーバーが監査された後に再び調べ直す必要もない。

共有フォルダへのSELinuxコンテキストの設定

# SELinuxポリシー管理ツールをインストールする(まだインストールしていない場合)
sudo dnf install policycoreutils-python-utils -y

# ディレクトリにsamba_share_tコンテキストを付与する
sudo semanage fcontext -a -t samba_share_t "/srv/samba/shared(/.*)?" 

# ファイルシステムにコンテキストを適用する
sudo restorecon -Rv /srv/samba/shared

コンテキストが正しく設定されているか確認する:

ls -Z /srv/samba/shared

出力のcontextカラムにsamba_share_tが表示されるはずだ。default_tuser_home_tがまだ見える場合、サービスが正常に動いていてもSambaはアクセスを拒否される。

必要なSELinux booleansの有効化

# samba_share_tラベルが付いたディレクトリへのSambaの読み書きを許可する
sudo setsebool -P samba_export_all_rw on

# Sambaのホームディレクトリへのアクセスを許可する(必要な場合のみ有効化)
sudo setsebool -P samba_enable_home_dirs on

-Pフラグはreboot後もbooleanを持続させる。このフラグを忘れると、次回起動後に設定がデフォルトにリセットされ、また一から時間をかけてデバッグする羽目になる。

firewalldの設定

firewalldはネットワークインターフェースをzoneに分けて管理する。Sambaは4つのポートを使用する:137/UDP、138/UDP(NetBIOS)と139/TCP、445/TCP(SMB)。開放する前に、インターフェースがどのzoneにあるかを確認する:

# 現在のzoneを確認する
sudo firewall-cmd --get-active-zones

対応するzoneにSambaサービスを開放する(通常はpublicまたはinternal):

# publicゾーンでSambaを開放する
sudo firewall-cmd --permanent --add-service=samba --zone=public

# 即座に適用する
sudo firewall-cmd --reload

確認する:

sudo firewall-cmd --list-services --zone=public

リストにsambaが表示されるはずだ。完全な内部LANならば?インターフェースをpublicではなくinternalゾーンに割り当てよう — ポリシーがより緩く、企業ネットワークに適している。

Windowsとのプリンタ共有(オプション)

チーム全体で共有したいプリンタがあるか?CUPSを追加インストールしてSambaのプリントサーバーを有効にしよう:

sudo dnf install cups samba-common-tools -y
sudo systemctl enable --now cups

smb.confに追加する:

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

[print$]
    comment = Printer Drivers
    path = /var/lib/samba/printers
    browseable = yes
    read only = yes
    guest ok = no

spoolディレクトリを作成してSELinuxコンテキストを付与する:

sudo mkdir -p /var/spool/samba
sudo chmod 1777 /var/spool/samba
sudo chcon -t samba_spool_t /var/spool/samba

Windowsからの接続

Windowsマシンから、ファイル名を指定して実行(Win+R)を開いて直接入力する:

\\192.168.1.100\shared

192.168.1.100はFedoraマシンの実際のIPアドレスに置き換える。固定のネットワークドライブとしてマウントするには:

  1. ファイルエクスプローラーを開く → PC → ネットワークドライブの割り当て
  2. ドライブ文字を選択する(例:Z:)
  3. パスを入力する:\\192.168.1.100\shared
  4. WindowsのユーザーネームとSambaのユーザーネームが異なる場合は別の資格情報を使用して接続するにチェックを入れる
  5. 完了をクリックして、先ほど作成したSambaのユーザー名/パスワードを入力する

接続エラーのデバッグ

接続できないか?この順番で確認しよう — 簡単なものから複雑なものへ:

# 1. サービスが動作しているか確認する
sudo systemctl status smb nmb

# 2. Fedora自身から接続をテストする
smbclient -L localhost -U $(whoami)

# 3. SELinuxログを確認する — 主な原因であることが多い
sudo ausearch -m avc -ts recent | grep samba

# 4. ファイアウォールが開放されているか確認する
sudo firewall-cmd --list-all

# 5. Sambaのポートがリッスンしているか確認する
ss -tlnp | grep -E '139|445'

# 6. アクティブな接続を確認する(誰が接続できているかを確認)
sudo smbstatus

SELinuxのエラーはausearchの出力にdenied { write } ... samba_t ...という形式で表示される。見つけた場合は、ls -Zでコンテキストを、getsebool -a | grep sambaでbooleanを確認する。ほとんどの場合、restoreconを再実行するだけで解決する。

Share: