WindowsファイルサーバをLinuxからcifsマウントしてApacheのWebDAVで公開する方法

WebDAVでWindowsファイルサーバをマウント公開する

自宅のファイルサーバ(Windows2000)を,インターネットから参照,更新できるようにしたい.

この場合,簡単にやるなら以下のような選択肢があると思われる.

長所短所
SSHでトンネルを掘ってSCP/SFTPを使うサーバ側はSSHだけの準備で済むSSHの通信が通る環境からしかアクセスできない.SCPクライアントでのアクセスは操作性がいまいち
WebFTPのサーバを立てる (net2ftpなど)HTTP(S)の通信が通る環境であればアクセスできるブラウザでの操作になるので操作性がいまいち
WebDAVを使うHTTP(S)の通信が通る環境であればアクセスできるエクスプローラから開けるので操作性は良い

今回,エクスプローラから開けるという利便性から,WebDAVを使って実現することにした.

前提

  • CentOS 4.4 (Kernel 2.6.9-42.EL)
  • Apache 2.2.3 + mod_dav + mod_encoding
  • マウント先のファイルサーバ:Windows2000 Server

ファイルサーバは内部LAN上にあるが,インターネットからアクセス可能なサーバでApache(WebDAV)が稼働しており, そのサーバからファイルサーバをマウントして参照することで, 間接的にインターネットからファイルサーバにアクセスできるという状態を作る.

1.WebDAVの設定

まず,Apache2.0から2.2への移行に書いてある内容で,mod_davとmod_encodingが使える状態にしておく.

日本語ファイル名を含むディレクトリをWebDAVで公開する場合,例えば以下のようにmod_encodingを設定するのが定番だと思う.

<IfModule mod_encoding.c>
  SetServerEncoding     UTF-8
  DefaultClientEncoding JA-AUTO-SJIS-MS SJIS
  AddClientEncoding "cadaver/" EUC-JP
  NormalizeUsername on
</IfModule>
SetServerEncodingはUTF-8だ.(UTF-8しかうまくいったことがない)

ファイルサーバをマウントするローカルのディレクトリは,普通にAliasやDocumentRoot等で設定しておく.

ただし,EnableSendfile Offの指定が必要なので注意. これを設定しないと,Apacheがレスポンスのヘッダだけ返してボディ部分を返さず,エラーは出ないがブラウザに何も表示されないという奇怪な現象が発生した.

EnableSendfileについては,以下を参考にしました.

結局うちの場合は,こんな感じの設定だ.

Alias /fsmnt /mnt/fs/
<Location /fsmnt>
        EnableSendfile Off
        EncodingEngine on
        DAV On

        Order Allow,Deny
        AuthName "file server WebDAV Folder"
        AuthType Basic
        AuthUserFile /usr/local/apache2/conf/.basic
        Require user aaaaa
        RemoveHandler .cgi

        Options Indexes
        DirectoryIndex .not.exist.file
        IndexOptions FancyIndexing IgnoreCase NameWidth=* SuppressDescription
</Location>
RemoveHandlerは,CGIプログラムが実行されてしまうことの抑制です.うちは全域で拡張子cgiをCGIプログラムとして実行可能にしているので,CGIプログラムをダウンロードできるようにするためにはこの指定が必要です.

Options Indexes以降の設定は,WebDAVが使えない環境からはFancyIndex(mod_autoindex)で閲覧だけでもできるようにしようという意図です. 今回の内容とは直接関係ありません.

※追記
後日,Apacheを2.2.6にバージョンアップしたのですが,この時にはIndexOptionsを以下のように変更しました.

        IndexOptions FancyIndexing IgnoreCase NameWidth=* SuppressDescription Charset=UTF-8
2.2.6からはmod_autoindexでCharset指定ができるようになったため,これを指定すれば日本語ファイル名を含むディレクトリの閲覧が楽ちんです.

なお,このあたりのmod_autoindexの話は,mod_autoindexで遊ぶ(日付書式の改造など)に詳細を記述してあります.WebDAVとは別の話なので.

2.smbclientの設定 (cifsでのmount)

ファイル名の文字コード

WebDAVの設定でSetServerEncodingがUTF-8だということは必然的に, 日本語ファイル名がUTF-8になるようにファイルサーバをmountしなければならない.

そのため,

mount -t smbfs //fsever/home /mnt/fs/home -o username=test,password=xxxxx,codepage=cp932,iocharset=utf8
という風にマウントしてみたのだが,これだとファイル名がShitfJISになってしまった.

どうも,

 iocharset=utf8
が効いてくれないようだ.

それで色々調べたところ,smbfsではなくcifsとしてマウントすれば良いようだ.

mount -t cifs //fsever/home /mnt/fs/home -o username=test,password=xxxxx,iocharset=utf8
こうすれば,めでたくファイル名がUTF-8になった.

mount.cifsのmanページによると,cifsとはsmbの後継らしい.後継なら,多分こっちを使う方が良いのだろう.

また,smbfsにあったcodepageのオプションは無くなっていた.

しかしiocharsetは残っていて,これは今までと同じようにローカルでのファイル名として使用するキャラクタセットの指定だ. 今回は上述したように,WebDAVと共用するためUTF-8にする必要があるので,utf8を指定している.

ここが無指定だと,カーネルをビルドしたときのnls_defaultというのが使われるらしい. うちのCentOS 4.4では無指定時はUTF-8になったのでそれでも悪くはないのだが, こういうものは省略せずに明示的に指定しておいた方が良かろう.

マウント時のパーミッション

mountはたいていrootで行うので,そのままだとApacheの実行ユーザ(nobodyやdaemon)に書き込み権限が無く, WebDAVでのファイル更新ができない.

色々やり方はあると思うが,今回はファイルサーバアクセス用のグループ(fsmount)を作成し, Apache実行ユーザ(nobody)をそこに所属させる Apacheをfsmountグループで動作させる という方法を採ってみた. (2008.02.05 修正)

groupadd fsmount
mount -t cifs //fsever/home /mnt/fs/home -o username=test,password=xxxxx,iocharset=utf8,uid=nobody,gid=fsmount
mount時にgidを指定しているため,そのグループのユーザは書き込み可能な状態でマウントすることができた.

httpd.confを変更する

Group fsmount

2008.01.20 追記
さらに,uid=nobodyを追加した.これがないと,WebDAV経由で作成したファイルのオーナーがrootになり,WebDAV経由で編集できないという状態になった.

2008.02.05 追記
Apacheの実行ユーザ(nobody)を特定のグループに所属させるということには,意味がなかった. 上記のように,Apacheの設定(Group)で,Apacheプロセスをfsmountグループとして動作させるように修正した.

WebDAV経由で作成したファイルのパーミッション (2009.04.02 追加)

なお,WebDAV経由でファイルを新規作成した場合,次のようなパーミッションになった.
-rw-r--r--  1 nobody fsmount    399  4月  2 15:16 GNUGlobal.txt
これだと,groupに書き込み権限がないので,ファイルサーバアクセス用のfsmountグループの他のユーザがこのファイルを変更できない. これは,WebDAV以外の経路(sambaなど)でファイルサーバにアクセスしたときに困る.

ここはnobodyユーザのumaskの関係なので,Apache起動用のスクリプト(apachectl)を編集して, Apache起動時にumaskを変更するようにした.
apachectlのhttpdを起動する前あたりに挿入

umask 002
これで,新規作成したファイルが次のようなパーミッションになったのでOK.
-rw-rw-r--  1 nobody fsmount

3.その他

セキュリティを考慮して,このWebDAVへのアクセスには,Basic認証をかけてかつhttps(SSL)としている.

httpsを使うのには他にも理由があって...

会社からアクセスするときに,会社のproxyサーバがWebDAVのメソッドを通してくれないという現象があるのだが, httpsを使えばproxyサーバは関与しなくなるので通るようになると.

kamolandをフォローしましょう


© 2017 KMIソフトウェア