SambaでWindowsファイル共有を行う正しいやり方

Webを検索しても古いバージョンについての説明が多く、なかなか正しいやり方を見つけるのが難しいSambaの設定メモ。

環境

ここに書く内容は、Samba 3.6.0以降が対象です。

$ cat /etc/redhat-release
CentOS release 6.4 (Final)

$ smbd --version
Version 3.6.9-151.el6

SELinuxを無効化する

セキュリティレベルは落ちるが、設定が煩雑になるためSELinuxを無効化する。

$ sudo vi /etc/selinux/config
SELINUX=disabled

$ sudo reboot

Sambaのインストール

CentOSの場合、パッケージ名を指定してインストールしてもよいが、groupinstallを使うこともできる。

$ sudo yum groupinstall "CIFS file server"

DebianUbuntuの場合はパッケージ名を指定してインストールする。

$ sudo apt-get install samba

文字コードの設定

dos charsetはWindows 9x系と通信する際にWindows側が使用する文字コード。日本語の場合はCP932 (Shift_JIS)となる。デフォルト値はCP850 (Latin-1)。NT系としか通信しない場合は設定しなくても問題ない。

unix charsetLinux側のファイルシステムおよびファイルの記述に使われている文字コード。古いシステムの場合はEUC-JPとなることがある。デフォルト値はUTF-8なので、システムがUTF-8の場合は設定しなくてもよい。

display charsetは標準入出力時の文字コードだが、現在は設定する必要がない。デフォルト値はLOCALEで、システムのロケールがそのまま使われる。かつてはSambaのWeb UI (SWAT)でこの値が用いられていたが、現在は参照されなくなっている。

$ sudo vi /etc/samba/smb.conf
dos charset = CP932
unix charset = UTF-8

接続元を制限する

今回はguestアクセスを許可する共有フォルダを作成する。 このことも考慮し、LAN外からはアクセスできないように接続元をプライベートIPに制限する。 また、同時に通信に使うインタフェースも制限しておく。

$ sudo vi /etc/samba/smb.conf
interfaces = 127.0.0.0/8 eth0
bind interfaces only = yes

hosts allow = 127.0.0.0/8 192.168.0.0/24
hosts deny = all

guestアクセスを許可する

認証なしでアクセスできる共有フォルダを作れるようにする。

Web上でよく説明されているsecurity = shareは、Samba 3.6.0以降ではdeprecatedとなっているため、security = userとする。 guestアクセスを許可するにはmap to guest = Bad Userを指定すればよいが、この項目はCentOSのデフォルト設定ファイルには存在しないため、自分で追記する必要がある。

guest account = nobodyは、多くの場合コンパイル時に決められたデフォルト値そのままであるため書かなくても動くが、わかりやすさのためにここでは明示的に設定しておく。

passdb backendはSambaアカウントの情報を格納するデータベース形式を指定する。LDAPを利用するのでなければ、tdbsamを指定しておけばよい。

$ sudo vi /etc/samba/smb.conf
security = user
passdb backend = tdbsam

guest account = nobody
map to guest = Bad User

共有フォルダの設定

public = yesまたはguest ok = yesと書けば、guestアクセスが許可される。 publicguest okエイリアスである。 また、guestアクセスを許可する場合は、共有フォルダのパーミッションを666に変更しておく。

$ sudo vi /etc/samba/smb.conf
[tmp]
        comment = tmp
        path = /tmp
        public = yes
        writable = yes
        printable = no

Sambaアカウントの追加

guestアクセスではなく、個々のユーザを認証してアクセスする共有フォルダを作りたい場合は、pdbeditコマンドを用いて既存のUNIXユーザごとにSamba用のアカウントを作成する。 ここで設定したパスワード等の情報は、実際に共有フォルダにアクセスする際に用いられる。

$ sudo pdbedit -a -u john

Samba認証に使いたいUNIXユーザが存在していない場合は、pdbeditを実行する前に作成しておく。

$ sudo useradd john

登録したSambaアカウントの情報は、下記のようにして確認できる。

$ sudo pdbedit -L -v

Sambaアカウントのパスワード変更にはsmbpasswdコマンドを使う。 まぎらわしいことに、smbpasswdコマンドはsmbpasswd形式以外のデータベース(tdbsam形式など)のパスワード変更にも用いられる。 すなわち、smbpasswdコマンドはpassdb backendで指定された値に従ってアクセスするデータベースを選択する。

$ sudo smbpasswd john

共有プリンタの無効化

共有プリンタを必要としない場合、デフォルトの設定のままだと再起動のたびに/var/log/samba/log.smbdに「CUPSサーバに繋がらない」というエラーが書き出されてしまう。

[2013/06/21 02:32:16.399765,  0] printing/print_cups.c:151(cups_connect)
  Unable to connect to CUPS server localhost:631 - 接続を拒否されました
[2013/06/21 02:32:16.400867,  0] printing/print_cups.c:528(cups_async_callback)
  failed to retrieve printer list: NT_STATUS_UNSUCCESSFUL

これは、下記のように設定することで抑制できる。

$ sudo vi /etc/samba/smb.conf
printing = bsd

設定内容の確認

testparmコマンドでsmb.confで設定される内容の確認ができる。 -vオプションをつけると、デフォルトそのままの値となっているパラメータも含めたすべての設定内容が表示される。

$ testparm

Sambaを起動する

合わせて、chkconfigで自動実行も行うように設定しておく。

Sambaプロトコルを扱うsmbdと、NBT (NetBIOS over TCP) を扱うnmbdの二つがあることに注意。 nmbdはWindowsのエクスプローラ上で、共有サーバ・共有フォルダのアイコンが表示されるようにするためなどに必要である。

$ sudo service smbd start
$ sudo service nmbd start
$ sudo chkconfig smbd on
$ sudo chkconfig nmbd on

iptablesで通信を許可する

smbd、nmbdを起動後、LISTENしているポートを調べると下記のようになっている。

$ sudo netstat -anp | grep smbd
tcp        0      0 0.0.0.0:139                 0.0.0.0:*                   LISTEN      7437/smbd
tcp        0      0 0.0.0.0:445                 0.0.0.0:*                   LISTEN      7437/smbd
tcp        0      0 :::139                      :::*                        LISTEN      7437/smbd
tcp        0      0 :::445                      :::*                        LISTEN      7437/smbd

$ sudo netstat -anp | grep nmbd
udp        0      0 0.0.0.0:137                 0.0.0.0:*                               7458/nmbd
udp        0      0 0.0.0.0:138                 0.0.0.0:*                               7458/nmbd

これに合わせて、iptablesで通信を許可するように設定を追記する。

$ sudo vi /etc/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 139 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 445 -j ACCEPT
-A INPUT -m state --state NEW -m udp -p udp --dport 137 -j ACCEPT
-A INPUT -m state --state NEW -m udp -p udp --dport 138 -j ACCEPT

参考リンク

display charset関係

o   Björn Jacke 
    * Do not use display charset for swat output.

securityパラメータ関係

o   Andrew Bartlett <abartlet@samba.org>
    * BUG 8151: Deprecate security parameters.