本ページの位置づけについて
ロードマップ上の「Phase 1:ハイブリッドストレージ&ゼロトラスト認証・認可(RBAC)」は、本来 authentik連携によるグループ別フォルダ表示・MFA強制 までを完成条件(DoD)としています。本ページで実施・検証したのは、その土台となるSamba単体の構築とLAN内アクセス検証までです。authentik LDAP Outpost連携・グループ別ACL・Nextcloud/OnlyOffice統合は未実施のため、Phase 1全体としては「一部完了」の状態です。詳細は「11. 未実施項目と次ステップ」をご確認ください。
目次
1. Phase 1 ネットワーク&フォルダ設計
| 項目 | 内容 |
|---|---|
| ホストIP | 192.168.2.3(AlmaLinux 9) |
| SMBポート | TCP 445 |
| パブリック共有 | /srv/samba/public(全ユーザー・ゲスト共有) |
| プライベート共有 | /srv/samba/private(認証ユーザーのみ) |
| Samba設定ファイル | /srv/containers/samba/smb.conf |
2. STEP 1:共有ディレクトリ作成&SELinux設定
sudo mkdir -p /srv/samba/public
sudo mkdir -p /srv/samba/private
sudo mkdir -p /srv/containers/samba
sudo chmod -R 777 /srv/samba/public
sudo chmod -R 770 /srv/samba/private
sudo chcon -t container_file_t -R /srv/samba/
system_u:object_r:container_file_t:s0:c537,c901 private
system_u:object_r:container_file_t:s0:c537,c901 public
3. STEP 2:Samba設定ファイル(smb.conf)
下記は実機で最終的に稼働している内容です(privateのvalid usersはトラブル②の対応により修正済み)。
sudo tee /srv/containers/samba/smb.conf << 'EOF'
[global]
workgroup = WORKGROUP
server string = Home Server Samba
security = user
map to guest = Bad User
log file = /var/log/samba/log.%m
max log size = 1000
guest account = nobody
[public]
comment = Public Shared Directory
path = /mount/public
browseable = yes
writable = yes
guest ok = yes
read only = no
force user = nobody
[private]
comment = Private Shared Directory
path = /mount/private
browseable = yes
writable = yes
guest ok = no
valid users = smbuser
EOF
4. STEP 3:Samba Quadletファイルの定義
sudo tee /etc/containers/systemd/samba.container << 'EOF'
[Unit]
Description=Samba File Server Container
After=network-online.target identity-dns-ntp.service
Requires=network-online.target
[Service]
Restart=always
RestartSec=10
[Container]
ContainerName=samba-server
Image=docker.io/dperson/samba:latest
Network=host
Volume=/srv/containers/samba/smb.conf:/etc/samba/smb.conf:Z
Volume=/srv/samba/public:/mount/public:Z
Volume=/srv/samba/private:/mount/private:Z
[Install]
WantedBy=multi-user.target
EOF
Network=host により、LAN内からのSMB(Port 445)名前解決やレスポンス速度を最大化しています。
5. STEP 4:サービスの有効化&起動
sudo systemctl daemon-reload
sudo systemctl start samba
sudo systemctl status samba --no-pager
● samba.service - Samba File Server Container
Active: active (running) since Mon 2026-08-03 20:50:16 JST
Main PID: 284314 (conmon)
8月 03 20:50:16 samba-server[284314]: smbd version 4.12.2 started.
8月 03 20:50:17 samba-server[284314]: daemon_ready: daemon 'smbd' finished starting up and ready to serve connections
精査ポイント:enable ではなく start
Phase 0で判明した通り、Quadlet生成ユニットはdaemon-reload時点で自動的に有効化されるため、enableは不要です。本手順も最初からstartのみで正しく起動しています。
6. トラブル①:Windowsゲストアクセスのブロック
手順書通りにpublic共有(ゲストアクセス)へWindows 11から接続を試みたところ、以下のエラーで拒否されました。
「組織のセキュリティポリシーにより、認証されていないゲストアクセスがブロックされています」(Insecure Guest Logon Block)
Samba側の設定に問題はありません。Windows 10/11は近年、認証なし(ゲスト)SMBアクセスをクライアント側のセキュリティポリシーでデフォルトブロックするようになっています。手順書の設計(guest ok = yesによるパブリック共有)は、現行のWindows既定設定とは相性が悪い状態です。
未解決(既知の制限として記録)
今回はpublic共有のゲストアクセス自体の修正は行わず、認証付きのprivate共有側で検証を継続しました。publicを実際に使う場合は、Windowsクライアント側で「安全でないゲストログオンを有効にする」ポリシーを変更するか、public側にも認証ユーザーを設定する方針転換が必要です。
7. トラブル②:存在しないグループ参照(@smbgroup)
手順書のsmb.confではprivate共有にvalid users = @smbgroupを指定していましたが、このグループを作成する手順が手順書に含まれていませんでした。コンテナ内を確認したところpdbedit -L(登録済みSambaユーザー一覧)が空で、誰もprivate共有にログインできない状態でした。
グループを新規作成する代わりに、コンテナに既定で存在するUNIXユーザーsmbuserを直接指定する方式に変更しました。
sudo sed -i 's/valid users = @smbgroup/valid users = smbuser/' /srv/containers/samba/smb.conf
sudo systemctl restart samba
sudo podman exec -it samba-server smbpasswd -a smbuser
8. トラブル③:ファイル所有者の不一致(Access Denied)
smbuserでのログイン(net use)自体は成功しましたが、private共有へのファイル書き込み・読み込み・削除がすべて「アクセスが拒否されました」で失敗しました。
| 項目 | 実際の値 |
|---|---|
ホスト側 /srv/samba/private の所有者 | root:root(sudo mkdirで作成したため) |
| ディレクトリ権限 | 770(所有者・所有グループのみアクセス可) |
コンテナ内 smbuser のUID/GID | 100 / 101 |
Samba認証(SMBレベル)は成功していても、コンテナ内で実際にファイルへアクセスするのはsmbuser(UID100/GID101)のLinuxプロセスです。フォルダの所有者がroot(UID0/GID0)のままだったため、Linuxの標準パーミッションで拒否されていました。
sudo chown -R 100:101 /srv/samba/private
9. STEP 5:LAN側疎通確認(DoDエビデンス)
Windows 11クライアント(192.168.2.xセグメント内)から、コマンドプロンプト経由で認証・書き込み・読み込み・削除を実施しました。
C:\>net use \\192.168.2.3\private /user:smbuser
(パスワード入力)
コマンドは正常に終了しました。
C:\>echo Phase1 DoD test > "\\192.168.2.3\private\test.txt"
(成功・エラーなし)
C:\>type "\\192.168.2.3\private\test.txt"
Phase1 DoD test
C:\>del "\\192.168.2.3\private\test.txt"
(成功・エラーなし)
DoD達成状況
- TCPポート445への疎通 証跡あり
- 認証ユーザー(smbuser)によるprivate共有への書き込み・読み込み・削除 証跡あり
- public共有への匿名(ゲスト)アクセス Windows側ポリシーによりブロック(未解決)
10. 精査メモ:Sambaユーザーの永続化について
重要:現状のsmbuserパスワードはコンテナ再起動で消えます
Samba Quadletの起動コマンドには--replace --rmが使われており、コンテナは停止のたびに破棄され、次回起動時にイメージから新規に作り直されます。今回podman execで対話的に設定したsmbpasswd -a smbuserはコンテナの一時領域に保存されているため、ホスト再起動やサービス再起動(systemctl restart sambaを除く現在稼働中のプロセスのみ有効)で消える可能性があります。今回はあくまで動作検証のための一時設定です。恒久的に使うには、次のいずれかが必要です。
dperson/sambaイメージ本来の起動引数(-u "smbuser;パスワード"など)をQuadletのExec=に追加し、コンテナ起動のたびに自動で同じユーザーが再作成されるようにする- または
/var/lib/samba(passdbを含む)をホスト側にボリューム永続化する
Samba基盤構築・LAN内DoD達成 🎉
Quadletによるコンテナ化、SELinuxラベル設定、認証付き共有(private)でのLAN内書き込み・読み込み・削除の検証まで完了しました。全体ロードマップは「ゼロトラスト統合基盤検証ロードマップ」を、基盤フェーズは「Phase 0 実践構築マニュアル」をご参照ください。
11. 未実施項目と次ステップ
ロードマップ上のPhase 1完成条件(DoD)と比較した、現時点での未実施項目です。
- authentik LDAP Outpost連携によるSambaユーザー管理の一元化 未実施
- authentikグループ(grp_sales等)とSamba ACL/Nextcloudグループフォルダの自動同期 未実施
- MFA(TOTP/Passkey)強制とNextcloud/OnlyOfficeでのブラウザ共同編集 未実施
- Sambaユーザーの永続化(Quadlet Exec=引数化、またはpassdbボリューム化) 未実施
- public共有のWindowsゲストアクセスブロック問題への対応方針決定 未実施
上記のうち、優先度が高いのは「Sambaユーザーの永続化」と「authentik LDAP Outpost連携」の2点である。