homelab notes ポート開放できない家の自宅サーバー

smb.conf に書いた設定が12個まるごと無視されていた

共有定義を追記する場所を間違えると、それ以降に書いてある [global] 用の設定が全部その共有の一部として解釈される。 エラーにはならない。静かに効かなくなるだけ。

症状

$ testparm -s /etc/samba/smb.conf
Global parameter log file found in service section!
Global parameter map to guest found in service section!
Global parameter obey pam restrictions found in service section!
...(12件)

実効値を見ると、書いてあるのに効いていないことが確認できる。

$ testparm -s --parameter-name="log file" /etc/samba/smb.conf
                    ← 空。書いてあるのに効いていない

原因

Ubuntu が配る smb.conf は、[global] の下に 200行近い解説コメントが延々と続く構造をしている。

[global]
   workgroup = WORKGROUP
   ...
#### Networking ####
   ↑ ここに共有定義を差し込んでしまった

# The specific set of interfaces...
   log file = /var/log/samba/log.%m      ← 以降ぜんぶ
   server role = standalone server       ← 共有セクションの
   obey pam restrictions = yes           ← 一部になる

[printers]

ファイルの途中に [home][ssd] を追記した結果、 [global] として効いていたのは最初の16行だけになっていた。 残りは全部、最後に追記した共有セクションの中身として扱われていた。

ついでに、同じ [home] が2箇所に完全に同一の内容で存在していた。 おそらく過去に追記した位置を忘れて、もう一度末尾に書いたのだと思う。

直し方

12行を個別に移動するより、共有定義のほうを末尾に動かすほうが安全で確実。 それだけで [global] が連続する。

[global]
  (解説コメント込みで全部ここ)
[printers]
[print$]
[home]        ← 重複していた片方を削除して
[ssd]         ← 末尾に移動

差分としては共有定義のブロックが移動するだけで、内容は一切変わらない。

直したら緩くなる、に注意

「無視されていた設定が効くようになる」ということは、 厳しい側に倒れていたものが、書いてある値に戻るということでもある。

設定修正前(無視)修正後(書いてある値)
map to guestNeverBad User
usershare allow guestsNoYes

どちらも Ubuntu の既定値なので「間違い」ではないが、 たまたま厳しい側で動いていたものが緩む。うちでは現状維持を選び、 その2つだけ明示的に厳しい値を書いた。

もう一つ、挙動が変わりうるもの

obey pam restrictions が新たに有効になる。 PAM 側にアカウントの制限があると SMB ログインが通らなくなる可能性がある。 適用したら必ず実際に接続を試すこと。

踏んだ罠: 行末コメントが使えない

修正スクリプトで、値の横に注釈を付けたら Samba が起動しなくなった。

map to guest = never   # Ubuntu 既定は bad user

WARNING: Ignoring invalid value 'never # Ubuntu 既定は bad user'
         for parameter 'map to guest'
Error loading services.
smb.conf は行末コメントを解釈しない。 #; は行頭でしかコメントにならず、 それ以外の位置では値の一部として読まれる。注釈は必ず独立した行に置く。

おまけ: 適用スクリプトの出力順

最初の適用は成功したのに、19秒後に元に戻っていた。ログを見たら理由がわかった。 スクリプトの最後に

戻す場合: sudo cp /etc/samba/smb.conf.bak-... /etc/samba/smb.conf

と出力していたので、それをそのまま実行してしまっていた。 成功メッセージの直後にコピペ可能な取り消しコマンドを置いてはいけない。 枠で囲って「今は実行しないこと」と書き、最後は「次にやること」で終わらせるようにした。