Apache2のWebDAV機能を使う

 Apache2はWebDAVサーバとして使うことができます。 DAV(HTTP Distributed Authoring and Versioning)とは、 HTTP(HyperText Transfer Protocol)を拡張したプロトコルで、 それは言うなればサーバ→クライアントの一方向だったHTTPに、 クライアント→サーバのアップロード機能をつけるべく拡張したものです。 つまりHTTPとFTPのよいところを合成したものと言いましょうか、 もっというとWeb上で共有ファイルシステムを構築することを可能になる、 「次世代のプロトコル」として注目が集まっています。

 では基本的な設定ということで、conf/httpd.confを編集します。 ServerNameとListenは少なくとも設定しないといけません。 また、Windowsでは、

LoadModule dav_module modules/mod_dav.so
LoadModule dav_fs_module modules/mod_dav_fs.so

の2行のコメントを解除しておく必要があります。

 WebDAVディレクトリの設定ですが、ごく簡単には

Alias /davroot "/usr/local/apache2/davroot"
<Location /davroot>
  DAV on
</Location>
DAVLockDB /usr/local/apache2/var/DAVLock

こんな感じでOKです。あとはディレクトリ /usr/local/apache2/davroot と /usr/local/apache2/var を作り、 両方ともhttpdの実効ユーザIDで書き込み可能になるようにしておけば、 /usr/local/apache2/davroot 以下が http://{サーバ名}:{ポート}/davroot としてWebDAVクライアントに公開されます。

Alias設定とパーミッションの注意
 余談ですが、上のようにAliasディレクティブを使うときに、 別名と本当のディレクトリパスの最後に、スラッシュ"/"をつけるとドツボにはまります。 両方ともにつけないようにします。
 また、DAVLockDBで指定したファイルは最初に存在している必要はありませんが、 そのファイルが作られるディレクトリ(上の場合はvar)はApacheの実行ユーザ、 典型的にはnobodyで書き込み可能である必要があります。 でないと書き込みアクセスの際にInternal Server Errorの原因になります。 勿論、WebDAVのファイル格納ディレクトリ(上の場合はdavroot)も、 nobodyで書き込み可能でないと書き込みアクセスができません。

WebDAVのBasic認証の設定
上の「DAV on」だけでは、アクセスに対して常に読み書きを許可するので、 セキュリティ上問題です。そこで、簡単な認証機構として、Apache上のWebDAVで Basic認証を行う方法があります。 これは、次のように記述を追加して行います。

Alias /davroot "C:/wintools/apache/apache2/davroot"
<Location /davroot>
  DAV on
  AllowOverride None
  Options None
  AuthUserFile     C:/wintools/apache/apache2/var/users.pwd
  AuthGroupFile    /dev/null
  AuthName         "Public Folder"
  AuthType         Basic
  require valid-user
</Location>
DAVLockDB C:/wintools/apache/apache2/var/DAVLock

また、特定のプロトコルに対してだけ、特定のユーザでの認証を求めるには、 「require valid-user」の代わりに、

  <Limit HEAD PUT POST DELETE PROPFIND PROPPATCH MKCOL COPY MOVE LOCK UNLOCK>
    require user uranodav
  </Limit>

のようにします。 上のように指定すると、HEAD、PUT、POST…のアクセスの場合 「require user uranodav」により、クライアントにはユーザ「uranodav」 での認証が求められます。uranodavに対するパスワードの設定は、 Apacheの一般的なBasic認証に使う「htpasswd」で作ればOKです。 また「LimitExcept」を使うと、GET、HEAD、OPTIONS 「以外の」アクセスで任意のユーザによる認証が必要になるようにできます。
 さらに細かいアクセス制御をするには、 「Limit」タグの中を例えば次のように設定します。

  <Limit HEAD PUT POST DELETE PROPFIND PROPPATCH MKCOL COPY MOVE LOCK UNLOCK>
    satisfy any
    require valid-user
    deny from all
    allow from 127.0.0.1 192.168.1
  </Limit>

「allow from」を列挙することによって、アクセス可能なクライアントのIPアドレスを限定できます。 「require valid-user」はパスワード認証を行うことを示します。 「satisfy」のデフォルト値は「all」です。 この場合は、allow fromで許可されたクライアントからのみアクセスでき、 さらにユーザ認証が必要です。 そうではなく、「any」を指定すると、 allow fromで許可されたクライアントはユーザ認証不要でアクセスでき、 その他のクライアントはユーザ認証を行えばアクセスできます。 つまり、 「satisfy all」は列挙された条件に全てヒットしないとアクセスできず、 「satisfy any」は列挙された条件のうちどれか1つにヒットすればアクセスできる、 という意味になります。


WebDAVクライアントを使う

 WebDAVクライアントとして身近なのはWindows2000/XPの「ネットワークプレース」です。 エクスプローラから「マイ ネットワーク」→「ネットワークプレースの追加」で、WebDAVフォルダ (Windowsでは「Webフォルダ」と呼ばれます」)に簡単にアクセスできます。 但し、WindowsXPの場合は注意が必要です。 WebDAVにアクセスする際に認証が必要な場合、 WindowsXPは「ユーザアカウント」の代わりに「ホスト名\ユーザアカウント」 の形式で認証を試みる(不具合?)ため、認証が失敗しアクセスできません。 これを解決する方法としては、3つあるとされています。 全部試したわけではありませんが、同様の現象で困ったら順番に、 または一斉に試してみるとよいと思います。

  1. Webサーバ(Apache)側の認証ファイルに、「ホスト名\ユーザアカウント」 という変な名前のユーザアカウントを登録する
  2. 「ネットワークプレース」を新しく作る際に、WindowsXPのサービス「WebClient」 を一時的に停止しておく(私は効果未確認)
  3. mod_encodingモジュールを導入する
の3つです。 1.を実施するには、WebサーバがWindowsの場合は、コマンドプロンプトで以下のようにして実行します。

htpasswd ninsho.txt localhost\uranodav

UNIXの場合はバックスラッシュ(円マーク)を二重にする必要があります。
上記の方法を試しまくることによって、Linux上のApacheサーバにはアクセスできるようになりました。 が、Windows上のApacheサーバに対しては、mod_encodingを導入していないためか、 認証を伴うWebDAVアクセスにまだ成功していません。(ダメじゃん)


mod_encodingを使う

 上でWindowsXPからアクセスしようとすると、Windowsがホスト名をユーザ名に勝手につけてしまう、 という問題を回避する方法の1つが、上述の mod_encodingモジュールを使うことです。 (mod_encodingの本来の目的はそれではないのですが)

  1. 上記のホームページから、 Apache 1.3用のmod_encoding-*.tar.gzと2.0用のmod_encoding.c.apache2.* をダウンロードし、前者を展開します。
  2. 前者の中に含まれるmod_encoding.cを、後者のファイルで差し替えます。
  3. iconv_hookライブラリをコンパイルします。 まだシステムにインストール済みでなければ、mod_encodingに同梱なので、 libディレクトリに行き、 「configure; make; make install」でインストールします。
  4. 次に元のディレクトリに戻り、次のようにしてコンパイルします。

    ./configure --with-apxs=/usr/local/apache2/bin/apxs
    make
    

    一旦エラーになりますが、続けて

    gcc -shared -o mod_encoding.so mod_encoding.o -Wall -L/usr/local/lib -Llib -liconv_hook
    cp mod_encoding.so /usr/local/apache2/modules
    

    こんな感じで強引に共有ライブラリmod_encoding.soを作り、 cpコマンドでmodulesディレクトリに配置します。
  5. httpd.confを編集し、次の部分を書き加えます。

    LoadFile   /usr/local/lib/libiconv.so
    LoadModule encoding_module  modules/mod_encoding.so
    
    NormalizeUsername on
    <IfModule mod_encoding.c>
      EncodingEngine        on
      SetServerEncoding     UTF-8
      DefaultClientEncoding JA-AUTO-SJIS-MS SJIS
      AddClientEncoding SJIS "Microsoft .* DAV"
      AddClientEncoding "cadaver/" EUC-JP
    </IfModule>
    

    ★LoadFileの行は不要の環境もあるようです。
  6. Apacheを(再)起動します。

 ということで、以上でネットワークプレースはひとまずおいといて、 今度はWebDAVクライアントとして独立したツールとして、よく知られているソフトウェアをご紹介します。

 Linuxではcadaverというコマンドラインツールが有名です。 これはFTPにおけるftpコマンドのような対話型のキャラクタベースのツールで、 使い方はftpとほとんど同じです。

 Javaで書かれたプラットフォーム可搬のツールには、 DAV Explorerや、 SkunkDAVがあります。 どちらもバイナリ配布があるので、すぐに使い始めることができます。

 また、C言語でWebDAVクライアントを開発するためのライブラリとしては、 Neonというライブラリが公開されています。

Open Source Web Architecture Top

(first uploaded 2004/09/12 last updated 2004/09/19, URANO398)

PC用眼鏡【管理人も使ってますがマジで疲れません】 解約手数料0円【あしたでんき】 Yahoo 楽天 NTT-X Store

無料ホームページ 無料のクレジットカード 海外格安航空券 ふるさと納税 海外旅行保険が無料! 海外ホテル