WebDAVは、HTTPベースのファイル共有システムのため、FTPやSSHとはやや異なる部分があります。意識して使用すれば問題ありませんが、扱うドキュメントによっては、結果的にFTPと変わらないオペレーションになってしまうこともあります。
WebDAVモジュールの組み込みの確認
RedHat9の場合、Apache用のモジュールは/etc/httpd/modulesにありますので、mod_dav.so及びmod_dav_fs.soの存在を確認してください(通常はあるはずです)。
WebDAV用の共有ディレクトリ(例 /home/apache/WebDAV)とロックファイルを置くディレクトリ(例 /var/lib/dav)を作成します。
なお、これらのディレクトリは、いずれもApacheの実行ユーザ権限(httpd.confのUser/Groupディレクティブでの指定したものにします。ソースからインストールしたならnobody/nobody、RPMからインストールしたならapache/apache)でなければなりません。
WebDAV用の共有ディレクトリにインターネット等を経由してファイルを書き込むとRPMでインストールした場合、ファイルのUser/Groupはapacheに、モードは644となります。つまり、RPMの場合、WebDAV用の共有ディレクトリをUser/Groupにapache以外にした場合、共有ディレクトリのモードをその他のパーミッションでフルアクセス(危険!!)にしないと書き込めなくなります。
ファイルロックについては、RedHat9の場合デフォルトで以下のとおりとなっています。
ここまでの動作確認
Windowsでは、標準でサポートされているWebフォルダ機能でWebDAV機能を利用できます。ここでは、Windows 2000 Professionalで示します。
日本語を含む名前のファイルやフォルダを作ると、一見正しく作成されているように見えても、フォルダ情報を更新すると実は名前が化けていたりすることに気が付くはずです。この状態でアクセスすると、エラーが発生してそのファイルやフォルダは利用できません。
これは、ファイルの作成やファイル名の変更時に、WebDAVサーバに送るファイル名の文字列符号化形式がシフトJISであるのに対し、WebDAVサーバからクライアントに送られるファイル名の文字列符号化形式はUTF-8なのが直接の原因です。
また、「Windows XPの認証ユーザー名表記対応」は、Windows XPでユーザー認証を実施した場合、ユーザー名が「サーバのIPアドレス\ユーザー名」という形式になってしまうという問題への対策です。mod_encodingの最新版では、最初の「サーバのIPアドレス\」という文字列を消し、ユーザー名のみを取り出す設定が可能となりました。
以上のことにより、mod_encodingの最新版をインストールすることにします。
mod_encodingのインストールと設定
以下の2つのファイルをWebDAV Resources JP(http://webdav.todo.gr.jp/)のdownloadメニューからダウンロードします。 次に、mod_encoding 20021209.tar.gzを保存したフォルダに移動後、展開してmod_encoding.cを差し替えます。
mod_encodingのインストール前にiconv_hookライブラリのコンパイルとインストールを行います。
mod_encodingのコンパイルとインストール
WebDAV Resources JPにトラブル対策が出ているが、RedHatではこれだけでは駄目で、最終的には以下のとおりでインストールできます。
まず、インストールが終了して最終的にApacheを起動したときに、「Cannot load /usr/local/apache2/modules/mod_encoding.so into server: libiconv_hook.so.1: cannot open shared object file: No such file or directory 」と怒られるので、下記でld.so.conf(共有ライブラリの場所を書いたファイル)に/usr/local/libを追記して、iconv_hookライブラリを認識できるようにします。実際には、「/etc/ld.so.cache」というファイルの情報を基に共有ライブラリを読み込むようになっているので、ldconfigでリフレッシュしておきます。
以下の部分を編集または追加してください。
補足
Apacheのバージョンとmod_encoding.cのバージョンが合わない場合は下記の対応は意味がありませんが、今まで動作していたのにモジュール関係を触ったりしてApacheが起動しなくなった場合は以下の対応により解消する可能性があります。
mod_encoding.soをApache用モジュールの標準保存場所である/etc/httpd/modules以外のところにコピーをしてhttpd.confでモジュールを読み込ませた後、Apacheを再起動した場合、以下のようなエラーが表示されることがあります。
セキュリティの問題
この状態では、誰でも自由に共有フォルダにアクセスして書き換えや削除ができてしまうので、ユーザ認証を導入し、セキュリティを向上させることにします。
Apacheでのユーザ認証には、ブラウザ側がサポートしていなかったという問題もあり「Basic認証」が広く使われていますが、Basic認証はID とパスワードを MIME(BASE64)エンコードして送信しているだけなので、パケットを盗聴・デコードされれば、ID とパスワードが簡単に分かってしまいます。そこで、今回は、チャレンジ・レスポンス方式でMD5でハッシュして送信する「Digest認証」を利用することにしました。この方式をとれば、毎回送信内容が変わるので盗聴されても解読は極めて困難になります。
ダイジェスト認証に対応したブラウザは次のとおりです。MS 系だとInternet Explorer 5 以降、Mozilla1.0、Konqueror 2.2.*、Netscape 7.0、Opera 6.0以降です。
ポップアップウィンドウの違い(I.E 6.0使用時)
Basic認証(都合上、一部マスキングしています。)
Digest認証(都合上、一部マスキングしています。)
WebDAV(mod_encoding)とnamazuを組み合わせた場合の注意点
WebDAVで日本語名のファイルを化けずに扱えるようにするには、mod_encodingの設定で
SetServerEncoding UTF-8
の1行を加えておく必要がありますが、これをつけておくとnamazuの検索式がUTF-8に変換されて文字化けを起こしてしまい、うまく検索できません。逆に、SetServerEncodingがUTF-8以外の場合、namazuの検索式は化けないが、WebDAVフォルダに日本語名ファイルを置くと文字化けしてしまいます。
いろいろ検索してみたところ、既知の問題のようで、
後者の方法は、URI中の"?"以降の文字コード変換を行うためパッチ( http://www.namazu.org/ml/namazu-win32-users-ja/msg01596.html )が利用できます。ただし、これは mod_encoding-20020611a 向けのパッチであり、手元のApache2用mod_encoding-20021209(+apache2.hotfix)ではそのまま使えません。そこで、以下のパッチを使用することにしました。
mod_encoding.c.apache2.hotfix へのパッチ: mod_encoding-20021209-safequery.patch
上記パッチを利用してビルドしたRPM: mod_encoding-0.1-0.20021209.2s.i586.rpm
とりあえずこの修正を施したmod_encodingを使い、設定に
SetServerEncoding UTF-8
を書いておくことで、namazu、WebDAV双方とも化けずに使えるようになります。
Sambaと組み合わせた利用と注意点
日本SambaユーザがリリースしているSamba 2.0.7日本語版リリース2.1以降では、ファイルシステム上に格納するファイル名のコーディングシステムにUTF8を指定できるようになっている(ja-2.0でもOKだがバグありとのこと)。これに着目すると、smb.confで
coding system=UTF8
と設定すればUTF-8な日本語ファイル名が利用できるようになる。詳しい設定については、Samba日本語版のドキュメントを参照するなりしてほしい。
次世代プロトコルWebDAVの可能性[前編]
次世代プロトコルWebDAVの可能性[中編]
次世代プロトコルWebDAVの可能性[後編]
WebDAV時代のセキュリティ対策[前編]
WebDAV時代のセキュリティ対策[後編]
Apache 2.0でWebDAV
- CGIやPHPといったダイナミックなリソースをコピーできない。
- 同様に、テキストもブラウザ起動されて表示されてしまうので、一旦ダウンロードして編集後に戻す必要がある。
- Windowsでは問題にはならないが、ファイルのオーナがApacheのuser/groupになってしまう。
- 同様にファイルのパーミッションが触れない。 等々
WebDAVモジュールの組み込みの確認
RedHat9の場合、Apache用のモジュールは/etc/httpd/modulesにありますので、mod_dav.so及びmod_dav_fs.soの存在を確認してください(通常はあるはずです)。
- mod_dav
WebDAV機能のフロントエンドモジュール。WebDAVプロトコルを解釈し、バックエンドのモジュールに引き渡す。 - mod_dav_fs
WebDAV機能のバックエンドモジュール。mod_davから指示を受け、実際の動作を行う
LoadModule dav_module modules/mod_dav.so LoadModule dav_fs_module modules/mod_dav_fs.soWebDAV用のディレクトリの作成
WebDAV用の共有ディレクトリ(例 /home/apache/WebDAV)とロックファイルを置くディレクトリ(例 /var/lib/dav)を作成します。
なお、これらのディレクトリは、いずれもApacheの実行ユーザ権限(httpd.confのUser/Groupディレクティブでの指定したものにします。ソースからインストールしたならnobody/nobody、RPMからインストールしたならapache/apache)でなければなりません。
WebDAV用の共有ディレクトリにインターネット等を経由してファイルを書き込むとRPMでインストールした場合、ファイルのUser/Groupはapacheに、モードは644となります。つまり、RPMの場合、WebDAV用の共有ディレクトリをUser/Groupにapache以外にした場合、共有ディレクトリのモードをその他のパーミッションでフルアクセス(危険!!)にしないと書き込めなくなります。
# mkdir /home/apache/WebDAV # chown apache.apache /home/apache/WebDAV # mkdir /var/lib/dav ← RedHat9の場合、作成する必要ない # chown apache.apache /var/lib/dav ← RedHat9の場合、作成する必要ないファイルロック用のフォルダの指定およびWebDAV用の共有フォルダ用の設定
ファイルロックについては、RedHat9の場合デフォルトで以下のとおりとなっています。
<IfModule mod_dav_fs.c> # Location of the WebDAV lock database. DAVLockDB /var/lib/dav/lockdb ← ロックファイルの指定 </IfModule> NameVirtualHost 192.168.0.1 ← 名前ベースのバーチャルホストとして設定 <VirtualHost 192.168.0.1> ServerName webdav.***.***.jp <Directory /home/apache/WebDAV> Alias /WebDAV "/home/apache/WebDAV" DAV on </Directory> <VirtualHost>以上で、/home/apache/WebDAV以下に対してWebDAVを利用したアクセスが可能になります。基本的な設定はこれで終了です。
ここまでの動作確認
Windowsでは、標準でサポートされているWebフォルダ機能でWebDAV機能を利用できます。ここでは、Windows 2000 Professionalで示します。
- デスクトップの「マイネットワーク」を開き、「ネットワークプレースの追加」をクリックして、「ネットワークプレースの追加ウィザード」を起動する。
- 「ネットワークプレースの場所を入力してください」にURL(上記の例ではhttp://webdav.***.***.jp/WebDAV/)を入力し、次へを押す。
- WebDAVが機能していれば、「ネットワークプレイスの追加ウィザードの終了」画面になり、ネットワークプレイスの名前(例 webdav.***.***.jp上のWebDAV)が表示されるので、必要に応じネットワークプレイスの名前を変更し、完了を押す。
- ここで作成したWebフォルダが開くので、適当なファイル(CGIやPHP等はエラーになりコピーできないので注意が必要)をコピー、削除したりして動作を確認する。なお、日本語対応していない段階でフォルダの新規作成をすると、「新しいフォルダ」というフォルダ名が文字化けして削除が厄介になるので作成しないこと。
日本語を含む名前のファイルやフォルダを作ると、一見正しく作成されているように見えても、フォルダ情報を更新すると実は名前が化けていたりすることに気が付くはずです。この状態でアクセスすると、エラーが発生してそのファイルやフォルダは利用できません。
これは、ファイルの作成やファイル名の変更時に、WebDAVサーバに送るファイル名の文字列符号化形式がシフトJISであるのに対し、WebDAVサーバからクライアントに送られるファイル名の文字列符号化形式はUTF-8なのが直接の原因です。
また、「Windows XPの認証ユーザー名表記対応」は、Windows XPでユーザー認証を実施した場合、ユーザー名が「サーバのIPアドレス\ユーザー名」という形式になってしまうという問題への対策です。mod_encodingの最新版では、最初の「サーバのIPアドレス\」という文字列を消し、ユーザー名のみを取り出す設定が可能となりました。
以上のことにより、mod_encodingの最新版をインストールすることにします。
mod_encodingのインストールと設定
以下の2つのファイルをWebDAV Resources JP(http://webdav.todo.gr.jp/)のdownloadメニューからダウンロードします。 次に、mod_encoding 20021209.tar.gzを保存したフォルダに移動後、展開してmod_encoding.cを差し替えます。
$ tar zxvf mod_encoding-20021209.tar.gz $ cp mod_encoding.apache2.20020611a-2 mod_encoding-20021209/mod_encoding.ciconv_hookライブラリのコンパイルとインストール
mod_encodingのインストール前にiconv_hookライブラリのコンパイルとインストールを行います。
$ cd mod_encoding-20020611a/lib $ ./configure $ make $ su root # make installこれで、iconv_hookライブラリが/usr/local/libにインストールされます。
mod_encodingのコンパイルとインストール
WebDAV Resources JPにトラブル対策が出ているが、RedHatではこれだけでは駄目で、最終的には以下のとおりでインストールできます。
まず、インストールが終了して最終的にApacheを起動したときに、「Cannot load /usr/local/apache2/modules/mod_encoding.so into server: libiconv_hook.so.1: cannot open shared object file: No such file or directory 」と怒られるので、下記でld.so.conf(共有ライブラリの場所を書いたファイル)に/usr/local/libを追記して、iconv_hookライブラリを認識できるようにします。実際には、「/etc/ld.so.cache」というファイルの情報を基に共有ライブラリを読み込むようになっているので、ldconfigでリフレッシュしておきます。
# vi /etc/ld.so.conf
/usr/local/lib ← 追記する
# ldconfig
後は、WebDAV Resources JPのトラブル対策やREADME.JPを参考にインストールしていきます。なお、make時にwarningがたくさんでますが、エラーでなければ下記のとおり進めて下さい。
# cd ../ # ./configure --with-apxs=/usr/sbin/apxs --with-iconv-hook=/usr/local/include # make # gcc -shared -o mod_encoding.so mod_encoding.o -Wc,-Wall -L/usr/local/lib -Llib -liconv_hook # cp mod_encoding.so /usr/local/apache2/modules/ (または # cp mod_encoding.so /etc/httpd/modules/)インストールされたmod_encodingを読み込むためのhttpd.confの設定
以下の部分を編集または追加してください。
LoadModule encoding_module /usr/local/apache2/modules/mod_encoding.so (または LoadModule encoding_module modules/mod_encoding.so) </IfModule mod_encoding.c> EncodingEngine on NormalizeUsername on SetServerEncoding UTF-8 DefaultClientEncoding JA-AUTO-SJIS-MS SJIS AddClientEncoding "cadaver/" EUC-JP </IfModule>
- LoadModule encoding_module /usr/local/apache2/modules/mod_encoding.so
mod_encodingモジュールをロードする。 - (または LoadModule encoding_module modules/mod_encoding.so
mod_encodingモジュールをロードする。) - EncodingEngine on
モジュールを有効にする。 - NormalizeUsername on
Windows XPでユーザー認証を実施した場合、ユーザ名が「サーバのIPアドレス\ユーザ名」という形式になってしまうという問題への対策。 - SetServerEncoding UTF-8 (注)下記参照のこと
サーバー側でファイル名に利用されるエンコーディングを指定する。UTF-8以外は不可。
この設定によりnamazuでの日本語検索がUTF-8に変換されてしまい、うまく検索できない。 - DefaultClientEncoding JA-AUTO-SJIS-MS SJIS
自動判定機能を提供する特殊なコンバータを指定するもので、UTF-8/JIS/MSSJIS/SJIS/EUC-JP を処理することができるようになる。 - AddClientEncoding "cadaver/" EUC-JP
各種エージェントから期待されるエンコーディングを指定する。基本的にIEのWebフォルダしか使用しないので、README.JPにあったcadaverのみ記述。
補足
Apacheのバージョンとmod_encoding.cのバージョンが合わない場合は下記の対応は意味がありませんが、今まで動作していたのにモジュール関係を触ったりしてApacheが起動しなくなった場合は以下の対応により解消する可能性があります。
mod_encoding.soをApache用モジュールの標準保存場所である/etc/httpd/modules以外のところにコピーをしてhttpd.confでモジュールを読み込ませた後、Apacheを再起動した場合、以下のようなエラーが表示されることがあります。
module "mod_encoding.c" is not compatible with this version of Apache. Please contact the vendor for the correct version.これは、httpd.confの中にInclude conf.d/*.confという行があります。このフォルダにmod_encoding.conf(絶対パスは/etc/httpd/conf.d/mod_encoding.conf)というファイルがあり(中身は以下のとおり)、そのファイルと不整合があると表示されますので
LoadModule encoding_module modules/mod_encoding.so
<Location /dav>
EncodingEngine on
</Location>
SetServerEncoding UTF-8
DefaultClientEncoding UTF-8 MSSJIS EUC-JP
AddClientEncoding "Microsoft .* DAV 1.1" ASCII MSSJIS UTF-8
AddClientEncoding "Microsoft .* DAV" UTF-8 MSSJIS
AddClientEncoding "(Microsoft .* DAV $)" UTF-8 MSSJIS
AddClientEncoding "(Microsoft .* DAV 1.1)" MSSJIS UTF-8
AddClientEncoding "Microsoft-WebDAV*" UTF-8 MSSJIS
AddClientEncoding "RMA/*" MSSJIS
AddClientEncoding "xdwin9x/" MSSJIS
AddClientEncoding "cadaver/" UTF-8 EUC-JP
AddClientEncoding "Mozilla/" EUC-JP
/usr/local/apache2/modules/mod_encoding.soをコピーするか、はじめから/etc/httpd/modulesしたにコピーしておきhttpd.confの設定でモジュールの読み込みをLoadModule encoding_module modules/mod_encoding.soとしてください。
セキュリティの問題
この状態では、誰でも自由に共有フォルダにアクセスして書き換えや削除ができてしまうので、ユーザ認証を導入し、セキュリティを向上させることにします。
Apacheでのユーザ認証には、ブラウザ側がサポートしていなかったという問題もあり「Basic認証」が広く使われていますが、Basic認証はID とパスワードを MIME(BASE64)エンコードして送信しているだけなので、パケットを盗聴・デコードされれば、ID とパスワードが簡単に分かってしまいます。そこで、今回は、チャレンジ・レスポンス方式でMD5でハッシュして送信する「Digest認証」を利用することにしました。この方式をとれば、毎回送信内容が変わるので盗聴されても解読は極めて困難になります。
ダイジェスト認証に対応したブラウザは次のとおりです。MS 系だとInternet Explorer 5 以降、Mozilla1.0、Konqueror 2.2.*、Netscape 7.0、Opera 6.0以降です。
ポップアップウィンドウの違い(I.E 6.0使用時)
Basic認証(都合上、一部マスキングしています。)

Digest認証(都合上、一部マスキングしています。)

WebDAV(mod_encoding)とnamazuを組み合わせた場合の注意点
WebDAVで日本語名のファイルを化けずに扱えるようにするには、mod_encodingの設定で
SetServerEncoding UTF-8
の1行を加えておく必要がありますが、これをつけておくとnamazuの検索式がUTF-8に変換されて文字化けを起こしてしまい、うまく検索できません。逆に、SetServerEncodingがUTF-8以外の場合、namazuの検索式は化けないが、WebDAVフォルダに日本語名ファイルを置くと文字化けしてしまいます。
いろいろ検索してみたところ、既知の問題のようで、
- namazuがUTF-8のエンコーディングを扱えるようにする
- mod_encodingでのURLのコード変更をやめる
後者の方法は、URI中の"?"以降の文字コード変換を行うためパッチ( http://www.namazu.org/ml/namazu-win32-users-ja/msg01596.html )が利用できます。ただし、これは mod_encoding-20020611a 向けのパッチであり、手元のApache2用mod_encoding-20021209(+apache2.hotfix)ではそのまま使えません。そこで、以下のパッチを使用することにしました。
mod_encoding.c.apache2.hotfix へのパッチ: mod_encoding-20021209-safequery.patch
上記パッチを利用してビルドしたRPM: mod_encoding-0.1-0.20021209.2s.i586.rpm
とりあえずこの修正を施したmod_encodingを使い、設定に
SetServerEncoding UTF-8
を書いておくことで、namazu、WebDAV双方とも化けずに使えるようになります。
Sambaと組み合わせた利用と注意点
日本SambaユーザがリリースしているSamba 2.0.7日本語版リリース2.1以降では、ファイルシステム上に格納するファイル名のコーディングシステムにUTF8を指定できるようになっている(ja-2.0でもOKだがバグありとのこと)。これに着目すると、smb.confで
coding system=UTF8
と設定すればUTF-8な日本語ファイル名が利用できるようになる。詳しい設定については、Samba日本語版のドキュメントを参照するなりしてほしい。
次世代プロトコルWebDAVの可能性[前編]
次世代プロトコルWebDAVの可能性[中編]
次世代プロトコルWebDAVの可能性[後編]
WebDAV時代のセキュリティ対策[前編]
WebDAV時代のセキュリティ対策[後編]
Apache 2.0でWebDAV