第31回 「samba によるアクセス制御」
LANDISK HACKING DIARY
Since2005/8/17
TOPへ戻る
     INDEX
   
1. samba の設定
2. 特定の共有に対してログインの度にパスワードを入力させる
3. 共有にアクセスするにはIPアドレスで!
4. 参考文献



 
     samba の設定
 
さて、今までにも samba の説明は何度かしていましたが、LAN 内での利用を想定していたため、誰もがアクセスできるフルアクセスの状態にしていました。ただ、いつまでもこの状態にしておくのはちょっとばかり不安です。友達が来たとき、彼女が来たとき、親がパソコン使いたいといってきた時、あまり見られたくはないデータのひとつやふたつあることでしょう。

「そんなのないよ」
「ウソはつかないでください!」

絶対にあるはずです。ピー.* とか ^エ.* とか。そういう時のために、きちんとアクセス制御をしておこうと思うのですが、samba って簡単そうに見えて細かな制御をやろうとすると意外と奥が深いんですよね~。でも、がんばってそこら辺をきちんとしておいた方が精神的にも気が楽になるので思い切ってやってしまいましょう。でも、ほんとに全部をやろうとは思いません。きっと一冊の本ができてしまうぐらい奥が深いだろうから。それと説明していてわかったのですが、綺麗にまとめようとするとかなり根気が必要なので、自分にとって役に立てばいいや程度にしか解説していませんので悪しからず。一番下に記した参考文献がとても役に立つのでそちらを見た方がいいという罠もあります。

■Global Settings

全共有フォルダに対して適用されるセッティングです。ここの設定が一番悩むんじゃないかと思われます。制限を緩くすれば便利になりますが、セキュリティは低くなり、制限を厳しくすればセキュリティは高くなるが利便性が損なわれます。ここでは、企業内LAN などの大規模なネットワークを想定するわけではないので、セキュリティを保ちながら、極力、利便性のほうを優先したいと思います。とはいうものの、この「利便性」というのが曲者です。100人いれば100通りの要求があるわけで、1台のマシンしかもっていない方、2台~4台のマシンを持っている方、すでに家庭内小規模LANが出来上がっている方、必要なときだけマシンを立ち上げる人、常時マシンをつけっぱなしの方、どの場合も、Samba でやりたいことは大きく変わってきます。マシンが1台しかない場合は、はっきりいってアクセス制御なんて必要ないと言っても過言ではないだろうし。なので、ここでの想定環境は筆者の望む環境になっています。

まず、「workgroup」ですが、これは特に説明する必要はないでしょう。自分の好きなドメインを入れてください。

workgroup = kororo.jp

これは、LAN内におけるsamba サーバの説明(description みたいなもの?)です。Windows 上のマイネットワークから LANDISKのアイコンを右クリックして「プロパティ」した時に、ここで指定した名前が表示されていることでしょう。あるいは、コマンドプロンプトで、net view コマンドを打ち込んだ際にここでの値が使われます。

server string = LANDISK (Samba %v)

意外と重要。Windows 上から見たLANDISKの名前です。つじあやのファンなので、仮にAYANOとつけてみたり。Winからは「\\ayano」でアクセスできるようになります。

netbios name = AYANO

文字コード設定です。UTF-8 に設定しています。もうセットで考えてしまいます。EUC-JP とかSJIS とかにしたい人は他のサイトをあたってください。

unix charset = UTF-8
dos charset = CP932
display charset = UTF-8

------

区切りをいれて、ここからはアクセス制御に関する設定。samba 共有にアクセスできるユーザを IPアドレス(マシン)単位で制限できる。Global Setting で設定することもできるが、特定の共有ディレクトリに対しても hosts allow を設定することができる。つまり、全体に対して、172.16.50. のネットワークを許可しておき、特定の共有ディレクトリだけ、172.16.50.2 に制限することなどもできる。

hosts allow = 172.16.50., 127.0.0.1

security は大事な項目です。ここで設定した値によって、その他の設定値も変わってきます。デフォルト動作は、security = user に設定されており、共有フォルダに個別のアカウント(あるいは、guest )を使ってアクセスできるようにします。なので、UNIXアカウントで設定されているユーザ名/パスワードでWindows 上にログインすると、共有へのアクセスが容易になる(再度、パスワードを入力する必要がなくなる)のでお勧めします。

security = user

share の場合は、共有ディレクトリに対し、固定のユーザアカウントを利用してアクセスできるようにするもので、共通のパスワードを使って誰もがアクセスできるようになります。当然、便利にはなりますが、その反面、セキュリティは下がります。設定や運用が簡単なので、小規模な共有に適しています。

security = share

その他にも、security = domain と security = server があります。domain の場合は、既にWindowsドメイン(ドメインコントローラなど)が存在し、そこにSambaマシンを追加する場合に適しています。server は、すでに、Windowsドメインや Samba サーバーが存在し、そこに Samba サーバーを追加する場合に適しています。

ここで、user か share かの選択を強いられるわけですが、セキュリティを強固にするためにも、user で解説を進めていきたいと思います。


以下は、筆者の環境での暫定的な smb.conf です。一応、共有名などは変更してあります(^_^;) 注意しておきたいのは、本当に細かく制御したいのなら複数のユーザを作成し、共有ディレクトリひとつひとつに対して異なるパスワードを設定しておくことです。そうでないと、特定の共有ディレクトリにログインしたら、あっちのディレクトリもこっちのディレクトリも芋ずる式に見えることになってしまうからです。書込みを許可していないはずのディレクトリに書き込めてしまったりとかも十分ありえます。ただ、自宅でそこまでする意味はないので、しません。2~3のユーザのみを作成し、管理していきます。

#======================= Global Settings =======================

[global]

#  panic action = /usr/share/samba/panic-action %d
#  workgroup = $OURWINDOWSNTWORKGROUP
        workgroup = kororo.jp
        server string = LANDISK (Samba %v)
        netbios name = AYANO

# code setting
        unix charset = UTF-8
        dos charset = CP932
        display charset = UTF-8

# access
        map to guest = Bad User
        guest account = nobody
        guest ok = No
        null password = No
        hosts allow = 172.16.50., 127.0.0.1
        invalid users = root

# print
        load printers = yes
;       printcap name = /etc/printcap
        printing = lprng
        printer admin = admin, nobody
        print command = /usr/bin/lpr -r -P%p %s
        lpq command = /usr/bin/lpq -P%p %s
        lprm command = /usr/bin/lprm -P%p %j

# log
        log file = /var/log/samba/log.%m
        max log size = 1000

# trash
        vfs objects = recycle
        recycle:repository = .recycle/%u
        recycle:keeptree = yes
        recycle:touch = yes
        recycle:versions = yes
        recycle:maxsize = 0

# security
        security = user
        encrypt passwords = true
;       passdb backend = tdbsam unixsam
        smb passwd file = /etc/samba/smbpasswd

        socket options = TCP_NODELAY SO_RCVBUF=32768 SO_SNDBUF=32768
        os level = 0
        dns proxy = no
        unix password sync = Yes
        passwd program = /usr/bin/passwd %u
        passwd chat = *Enter\snew\sUNIX\spassword:* %n\n *Retype\snew\sUNIX\spassword:* %n\n .
        obey pam restrictions = yes

#======================= Share Definitions =======================

;       [homes]
;       comment = Home Directories
;       browseable = Yes
;       writable = no
;       create mask = 0700
;       directory mask = 0700

# 管理が面倒になってくるので、ホームデイレクトリは共有に含めない。
# 全て /share 以下の空き領域に共有ディレクトリを作成する方針

[FULLDISK]
        comment = FULLDISK
        read only = No
        path = /share/Fulldisk
        public = Yes
        create mode = 0777
        directory mode = 0777

# 誰でも読み書きOK。無法地帯な共有ディレクトリを作成する。
# public = Yes で、全ユーザに公開する
# 「public =Yes」と「guest only = Yes」の違いとして、前者の場合は、ファイルを作成した際に、
# 特定のユーザでログインしている場合はそのユーザのUID/GID で書き込まれ、UNIX 上に存在しない
# アカウントでファイルを作成した場合は、guest ユーザの UID/GID で書き込まれる。
# guest only にした場合は、どのようなユーザでログインしていたとしても、guest ユーザのUID/GID で
# ファイルが書き込まれる。仮に kororo ユーザとしてファイルを作成したとしても、ファイルの所有者は、
# guest ユーザとなる。
#
# あとでわかったことだが、よく考えたら、ゴミ箱機能(vfs objects)で作成された .recycle ディレクトリは、
# 最初にファイルを削除したユーザの所有ディレクトリとなる。guest only = Yes にしていればユーザが
# が統一されているから問題ないが、public = Yes にしている場合は、ログインしているユーザのディレクトリ
# として .recycle が作成されるため、他の guest ユーザがゴミ箱ディレクトリにアクセスできなくなってしまう。
# なので、共有ディレクトリなんて何個もボンボンつくるものではないので、root になって、
# chmod 777 .recycle
# を手動で実行しておく必要がある。-R オプションはつける必要はない。
#
# chown -R root.nogroup /share/Fulldisk
#  chmod -R 777 /share/Fulldisk


[WWW]
        comment = PUBLIC_HTML
        path = /share/WWW
        read only = No
        create mode = 0644
        directory mode = 0755
        valid users = kororo
		
# Webサイトのコンテンツをバックアップしておくディレクトリ。
# 1日1回自動バックアップするので読み書きが可能なようにしておく。
# 自分以外のユーザに変更(書き換え)可能にしておく理由はない。
# 指定のユーザでログインしていなくても、パスワードを入力すればそのフォルダにフルアクセスできるようにしておく。
# 上記の条件を満たすような設定をする。
#
# chown -R root.kororo /share/WWW
#  chmod -R 770 /share/WWW

[DISK1-SOFT]
        path = /share/DISC1-SOFT
        read only = Yes
        create mode = 0644
        directory mode = 0755
        public = Yes
        write list = kororo
		
# Linux 用のパッケージやWindows用のソフトウェアを格納するディレクトリ
# このディレクトリに書き込むことはごく稀なのでリードオンリーにする
# だが、書込みできないのも後々不便なので、write list で自分だけ書き込めるようにする
# 誰でもこのディレクトリを読み込み可能にするが、自分以外は変更・削除等は不可とする
# 上記の条件を満たすように設定する
#
# chown -R root.nogroup /share/DISC1-SOFT
#  chmod -R 777 /share/DISC1-SOFT

[iPOD]
        path = /share/iPOD
        read only = Yes
        create mode = 0644
        directory mode = 0755
        public = Yes
        write list = mi-chan
		
# iPOD で抽出したAAC ファイル、MP3ファイルが格納される
# ネットワーク内の全てのマシンで視聴可能にする
# オペミスによるデータ喪失が怖いので(勿論バックアップはrsync で行う)、リードオンリーとする
# 曲データを後から追加できるユーザを作成しておき、write list に加える
# 上記の条件を満たすように設定する
#
# groupadd -g 1010 mi-chan
# useradd -g mi-chan -u 1010 mi-chan
# smbpasswd -a mi-chan
# smbpasswd -e mi-chan
# 
# chown -R root.nogroup /share/iPOD
#  chmod -R 777 /share/iPOD

[RATOC]
        path = /share/usb1
        read only = No
        public = Yes
        create mode = 0777
        directory mode = 0777

# LANDISKからUSB接続されたリムーバルHDD。2つに切ったパーティションのうちのひとつ(/dev/sda1)
# 第2の無法地帯とする。誰でも読み書きが可能。
# 前述した「FULLDISK」共有と同じ設定。
#
# chown -R root.nogroup /share/usb1
#  chmod -R 777 /share/usb1

[RATOC2]
        path = /share/usb2/free1
        read only = No
        public = Yes
        create mode = 0777
        directory mode = 0777
		
# USBリムーバブルHDDのパーティション2(/dev/sda2)。
# 誰でも読み書きが可能。
# 前述した「FULLDISK」共有と同じ設定。
#
# chown -R root.nogroup /share/usb2/free1
#  chmod -R 777 /share/usb2/free1

[DEBIAN]
        path = /share/usb2/debian
        read only = No
        browseable = Yes
        hosts allow = 172.16.50.3
        admin users = mi-chan
        create mode = 0644
        directory mode = 0755

# LANDISKの/usr,/etc/,/root,/var,/home などのバックアップ先となる
# 自分が使用しているパソコン以外からこのディレクトリが閲覧可能になっている必要はない
# (どうせ家の人や友人がこの中のファイルをみてもわけがわからないだろうから)
# クライアントでは、読み込み専用とし、書込みはLinux 側のroot 権限で行う
# バックアップの最後の砦として、chattr + i をしておき、root でも消せないようにしておく
# CD-R/DVD-R に焼く際に root 権限がないと root 所持のファイルはWin側のデスクトップに落とせないので、
# admin users を指定し、ファイルをコピーできるようにしておく。Linux 側に焼きこみドライヴがあれば必要ない。
#
#
# chown -R root.nogroup /share/usb2/debian
# chmod -R 777 /share/usb2/debian
# chattr +i /share/usb2/debian [EXPORT] read only = No create mode = 0777 directory mode = 0777 guest only = Yes guest ok = Yes force user = samba-nfs # NFS共有(/exort/home)に対して、samba 共有をかけたディレクトリ # Linux<-> Linux、Win<-> Linux 間のファイルのやりとりさえ出来れば問題ない # NFSサーバ(Linux)、NFSクライアント(Linux)、Windows どこからでもファイルの読み書きを可能にする # NFSサーバ、NFSクライアント上でsamba-nfs というユーザーを作成する # /etc/exports でanonuid と anongid をsamba-nfs(2000.2000) に設定する # ファイルへのアクセス、Read/Write は全て samba-nfs ユーザが行うことになるので、 # Linux上で作成されたファイルをWinで消せるようになり、その逆もまた可能になる # 但し、当然のことではあるが、NFSサーバ上で作成されたファイルに関しては、 # NFSクライアントでも、Windows 上でも消すことはできない。 # # groupadd -g 2000 samba-nfs # useradd -g samba-nfs -u 2000 samba-nfs # vi /etc/exports # /export/home 172.16.50.0/255.255.255.224(rw,root_squash,anonuid=2000,anongid=2000) [printers] comment = USBPRINTER path = /mnt/hda3/spool/samba/lp printable = yes browseable = yes



 
     特定の共有に対してログインの度にパスワードを入力させる
 
普通は、毎回パスワードを入力するのは避けたいものだが、特定の共有ディレクトリに対しては、ログインする度にパスワードを入力しなければアクセスできないようにしたいこともあるでしょう。そのためには、Windows でログインしているユーザとは異なる特別なユーザを Linux 上に作成してあげればよいだけだ。しかし、一度パスワードを入力してしまえば、ログイン中はずっとアクセスできるようになるので席を離れるときなどは注意が必要だ。強制的にパスワードを入力させるようにするには、「マイネットワーク」から「ネットワークドライブの切断」をしておけば再度パスワード入力が求められる。フォルダを閉じたら自動的にパスワードが聞かれるようになる(自動的にネットワークドライブを切断する)、という方法が実現可能ならば是非知りたいところだ。一応、net config server ではできるようだが…

landisk~# groupadd -g 1011 tameshi
landisk~# useradd -g tameshi -u 1011 tameshi
landisk~# smbpasswd -a tameshi
landisk~# smbpasswd -e tameshi

smb.conf を編集する。

landisk~# vi /etc/samba/smb.conf

[FREE]
path = /share/usb1/free
read only = No
create mode = 0777
directory mode = 0777
valid users = tameshi



 
     共有にアクセスするにはIPアドレスで!
 
わけのわからないタイトルだろう。まず、筆者の環境を説明する。以下の2つの共有ディレクトリがあるとする。

FREE1 (valid users = kororo)
FRRE2 (valid users = snoopy)

Windows上には kororo ユーザでログインしていると仮定した場合、FREE1 共有には当然アクセスできる。しかも、パスワードを入力する必要がない。しかし、snoopy 共有へは kororo がアクセスすることはできないので、snoopy ユーザが所有するパスワードを入力しなければならない。kororo はそのパスワードを知っているが以下のようなエラーメッセージのため、ディレクトリへアクセスすることができない。



困った kororo は一旦、「マイネットワーク」から 「\\172.16.50.30\free1」のネットワークドライブを切断する。再度、FREE1 にアクセスしようとするが、上図と同じエラー画面が現れる。ここで注意したいのは、Windows2000を使っている場合に上図のようなエラー画面になるのであって、WindowsXPを使っている場合は、「ネットワークドライブを切断」した瞬間、セッションも切断され、再度、FREE1 共有にアクセスしたときには、パスワードプロンプトが現れてそこにユーザ名とパスワードを入力すれば、snoopy 共有にアクセスすることができる。しかし、Windows2000 を使っている場合、ネットワークドライブは確かに切断されるのだが、どこかでkororo のセッションが繋がっているらしく、snoopy でログインしようとしても上図エラーが発生してしまうのである。

しかたがないので、「ネットワークドライブの割り当て」から「異なるユーザ」を選択し、FREE1共有を割り当てようとすると今度は以下図のエラーが発生する。要するに、既に kororo ユーザのセッションがどこかに残っていて、snoopy ユーザとしてはログインできないんだよ、と言われているわけだ。



これを解決する手段として、共有ディレクトリへ フルパスのIPアドレスを指定してあげればよい。上述したものは、いずれも「マイネットワーク」から辿っていった結果として現れたエラー画面であって、IPアドレスを指定してアクセスすればすんなりと共有ディレクトリへ、snoopy ユーザとしてアクセスできるのである。同じような症状の方(いや、これは症状というよりもWindowsの仕様なのだろう)は、是非試してもらいたい。具体的に言うと、

\\172.16.50.30\free1

と指定してアクセスすれば良いのだ。


 
     参考文献
 
⇒Using Samba
⇒smb.conf
⇒Chapter20.スタッカブルVFSモジュール





TOPへ戻る
 
Copyright © KORO All Rights Reserved.