WebDAVを設定する

環境

参考

目次

修正


手順

Apacheの準備(サーバ管理者の仕事)

apache2 と関連モジュールをaptitude/dselect/apt-get等でインストールしておきます。
詳細は、「Apache 2をインストールする」で解説します。

インストール後、/etc/apache2/mods-available に dav.load, dav_fs.conf, dav_fs.load がある事を確認してください。
これらがApache起動時にロードされるように、/etc/apache2/mods-enabled にシンボリックリンクをつくります。

# cd /etc/apache2/mods-enabled
# ln -l /etc/apache2/mods-available/dav.load dav.load
# ln -l /etc/apache2/mods-available/dav_fs.conf dav_fs.conf
# ln -l /etc/apache2/mods-available/dav_fs.load dav_fs.load

下記のシンボリックリンクができているのを確認して、再起動または設定をリロードしてください。

# ls -l dav*
lrwxrwxrwx  1 root root 36 Jul 28 16:32 dav.load -> /etc/apache2/mods-available/dav.load
lrwxrwxrwx  1 root root 39 Jul 28 16:32 dav_fs.conf -> /etc/apache2/mods-available/dav_fs.conf
lrwxrwxrwx  1 root root 39 Jul 28 16:32 dav_fs.load -> /etc/apache2/mods-available/dav_fs.load

ドキュメントルートで使えるようにする

ドキュメントルートでDAVを有効にするには、/etc/apache2/sites-enabled/000-default に下記修正を加えます。
(それぞれの色は、追加削除を示します)
ちなみに、黄色は 、このサーバで実験した設定なので、一般的には不要でしょう。 構成によっては期待通り動かないかもしれません。

# cat /etc/apache2/sites-enabled/000-default
NameVirtualHost *
<VirtualHost *>
    ServerAdmin web_master@gomimaki.inco.jp
    ServerName www.gomimaki.inco.jp

    DocumentRoot /var/www/
    <Directory />
        Options None FollowSymLinks
        AllowOverride All None
    </Directory>
    <Directory /var/www/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All None
        Order allow,deny
        allow from all
        # This directive allows us to have apache2's default start page
        # in /apache2-default/, but still have / go to the right place
        #RedirectMatch ^/$ /apache2-default/

        DAV on
        Require valid-user
    </Directory>
    DAVLockDB /var/lib/apache2/DAVLock
    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    <Directory "/usr/lib/cgi-bin">
        AllowOverride None
        Options ExecCGI -MultiViews +SymLinksIfOwnerMatch
        Order allow,deny
        Allow from all
    </Directory>

    ErrorLog /var/log/apache2/error.log

    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn

    CustomLog /var/log/apache2/access.log combined env=!worm
    CustomLog /var/log/apache2/worm.log combined env=worm
    ServerSignature On

    Alias /doc/ "/usr/share/doc/"
    <Directory "/usr/share/doc/">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from 127.0.0.0/255.0.0.0 ::1/128
    </Directory>

</VirtualHost>
#

DAV on でDAVが機能します。(実際は、設定を再ロードした後)
更に、DavLockDB ディレクティブを記述。 これを書き忘れたところ、エラーになりました。
on もあるからには、off もあるだろうという推察は正解。 調べたところ確かに存在していた。
そこで新たな事実。 on の代わりに、ファイルシステムプロバイダを指定できるらしい。
on は、mod_dav_fs で提供されている filesystem のエイリアスなのだとか。
であれば、DAV filesystem と書いても動くのか? その内、実験してみよう。

このままでは誰でも書き込めるようなので、認証を有効にしておきます。
とりあえずエラーになれば良いやと考え、Require ディレクティブのみ記述して確認。
後の認証ディレクティブは /var/www 内の .htaccess へ記述しました。
.htaccess の例を、下記に示します。
マーカーで示した部分は自分のディレクトリに合わせて変更してください。
また、AuthNameも、適宜変更してください。

# cat /var/www/.htaccess
IndexIgnore .htaccess */.??* *~

<Limit GET HEAD POST OPTIONS>
    order deny,allow
    deny from all
    allow from all
</Limit>
<Limit PUT DELETE PROPFIND PROPPATCH COPY MOVE>
    Require valid-user
</Limit>

# for WebDAV
AuthType        Basic
AuthName        "WebDAV"
AuthUserFile    "/etc/apache2/.htpasswd"
#

動作が確認できれば、同様の内容を sites-enabled/000-default に記述しても良いでしょう。

なお、 認証については、かなり動作確認を繰り返す必要がありそうです。
Apacheのドキュメントでは、Digest認証やSSLを用いることを推奨しています。
が、何故かDigest認証では期待通りに動いてくれなかったのであった。
たぶん設定ミスかクライアントの問題ではないかと思われる。
今後の研究課題となるかも。

【番外】別の記述方法

"Directory"への記述の代わりに、"Location" を使った記述を示します。
むしろ、Directoryよりは、こちらの方が一般的のようです。 Apacheのドキュメントにも書かれていますし。
Directoryはサーバのファイルシステムに対して、Location は URL に作用するそうですが、実質的な違いは分からないので、これも今後の研究課題かも。

    <Location />
        DAV on
        AuthType Basic
        AuthName "WebDAV"
        AuthUserFile "/etc/apache2/.htpasswd"
        <Limit GET POST PUT DELETE OPTIONS LOCK UNLOCK PROPFIND PATCH PROPPATCH MKCOL COPY MOVE>
            Require valid-user
        </Limit>
    </Location>

ユーザディレクトリでもDAV

更に、ユーザディレクトリ(/~hoge)でも使えるように、/etc/apache2/mods-enabled/userdir.conf に、マーカーで示した部分を追加します。
やっている事は基本的に sites-enabled/000-default と同じです。 DAVを使用しないユーザのためにも、いきなり全部見えずに、各ユーザが .htaccess で制御できるようにします。

※注意点※
Apacheは、ユーザディレクトリに対しても User/Group で指定された実行ユーザ(Debianのデフォルトはwww-data/www-data)でアクセスします。
通常の読み取りでは困らないのですが、書き込みは大いに困ります。
このサーバでは、public_htmlディレクトリのgroupwww-dataにして書き込みを許可することで回避しています。
代償として、suexecの制限によりユーザディレクトリに置くCGIは使えなくなりますが、/cgi-bin/のCGIは使えますので、(日記やブログは困るかもしれませんが)何とかなるでしょう。(…なるかな? ^^;)

# cat /etc/apache2/mods-enabled/userdir.conf
<IfModule mod_userdir.c>
    UserDir public_html
    UserDir disabled root

    <Directory /home/*/public_html>
    AllowOverride FileInfo Indexes AuthConfig Limit Options
    Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
    # for WebDAV / DAVdrive
    DAV on
    <Limit GET POST>
        Order allow,deny
        Allow from all
    </Limit>
    <Limit PUT DELETE OPTIONS LOCK UNLOCK PROPFIND>
        Require valid-user
    </Limit>
    </Directory>
</IfModule> #

"Directory"への記述の代わりに、"LocationMatch"を使った記述を示します。

    <LocationMatch /~*>
        DAV on
        AuthType Basic
        AuthName "My web documents"
        AuthUserFile "/dev/null"
        <Limit GET POST PUT DELETE OPTIONS LOCK UNLOCK PROPFIND PATCH PROPPATCH MKCOL COPY MOVE>
            Require valid-user
        </Limit>
    </LocationMatch>

ユーザディレクトリの場合、複数のディレクトリにマッチさせるため、"Location" ではなく "LocationMatch" でなければならないようです。
もっとも、複数のディレクトリに対応させる必要が無ければ、"Location" でも充分と思いますが。


ディレクトリの準備(ユーザの仕事)

ユーザのホームディレクトリにある public_html のアクセス権はどうなっていますか?
Apacheは www-data ユーザでアクセスしますので、ここでは group を www-data にして書き込み許可を与えます。(ユーザディレクトリでCGIが使えなくなるのは物足りないのですが)

※注意点※
グループの変更は root の権限が必要なので、su (sudo) で root になるか、管理者に変更してもらってください。

drwxrwxr-x 10 hoge www-data 4096 Jul 23 17:34 public_html

そして、一番大事な .htaccess の記述です。
マーカーで示した部分は自分のディレクトリに合わせて変更してください。
また、AuthNameも、適宜変更してください

$ cat .htaccess
IndexIgnore .htaccess */.??* *~

<Limit GET HEAD POST OPTIONS>
    order deny,allow
    deny from all
    allow from all
</Limit>
<Limit PUT DELETE PROPFIND PROPPATCH COPY MOVE>
    Require valid-user
</Limit>

# for WebDAV
AuthType        Basic
AuthName        "WebDAV Folder"
AuthUserFile    "/home/hoge/.htpasswd"
$

パスワードファイルを作る

いよいよ大詰め。 ユーザ hoge のパスワードを、パスワードファイル .htpasswd に書き込みます。
書き込むディレクトリは、.htaccess 内の AuthUserFile で指定したパスです。
ユーザ名は何でも良いのですが、とりあえず普段ログインするユーザ名が無難でしょう。
下記コマンドを実行するとパスワードを2度聞いてきますので、2度とも同じものを入力してください。
間違えずに入力すると、「ユーザ ***** のパスワードを追加しました」(Adding password for user *****)と表示します。

$ htpasswd -c /home/hoge hoge
New password: 
Re-type new password: 
Adding password for user hoge

これでサーバ側の作業は一通り終了です。


動作確認

telnetを使って確認

DAVの動作を手入力で確認するには、OPTIONSリクエストを送るのが一番簡単でしょう。
他のリクエストでも可能ですが、普通にサーバから読み取るのでは意味がありませんし、PROPFINDのようにXMLを送るのは… (^^;)

下記に示したようにコマンドを入力して、DAVサーバに接続します。
この場合、DAVが動いているサーバを davserver.jp ポートは80番、ローカルマシンを tester.jp としていますが、皆さんの環境に合わせて適宜変更してください。

サーバが応答したら、下記のようにOPTIONSリクエストを送ります。
Host: には、アクセスするローカルマシン名を入力すると良いでしょう。
改行を2度送るのを忘れずに。

$ telnet davserver.jp 80
Trying 192.168.128.16...
Connected to davserver.jp.
Escape character is '^]'.
OPTIONS / HTTP/1.1
Host: tester.jp

HTTP/1.1 200 OK
Date: Sat, 06 Aug 2005 13:25:22 GMT
Server: Apache/2.0.54 (Debian GNU/Linux) DAV/2
DAV: 1,2
DAV: <http://apache.org/dav/propset/fs/1>
MS-Author-Via: DAV
Allow: OPTIONS,GET,HEAD,POST,DELETE,TRACE,PROPFIND,PROPPATCH,COPY,MOVE,LOCK,UNLOCK
Content-Length: 0
Content-Type: httpd/unix-directory

Connection closed by foreign host.
$

上記のように "DAV" のメッセージが返ってくれば成功です。
特に、Windows をクライアントとして使う場合、"MS-Author-Via: DAV" は重要になるでしょう。

ちなみに、下記は失敗の時の応答です。 上記成功例と違って "DAV" が見られません。
この場合、何が悪かったかと言うと、Host: に "localhost" を指定してしまったのが原因でした。
それに気付かずになんでぇ〜? 動いてねぇぢゃん!と 勘違いしてキレかけたのは事実です。(((;^^)

HTTP/1.1 301 Moved Permanently
Date: Sat, 06 Aug 2005 13:46:07 GMT
Server: Apache/2.0.54 (Debian GNU/Linux) DAV/2
Location: http://localhost/
Content-Length: 437
Content-Type: text/html; charset=iso-8859-1

Windowsを使って確認

WindowsでDAVの動作を確認するには、Internet Explorer (以下 IE)を使用するのが良いと思います。
IE5以上がDAVに対応しているそうですが、私はIE6を使いました。
ウチの環境もかなり古い(Win2kが現役 ^^;)のですが、さすがにIE5.5なんて残っていません。

確認手順は、

  1. IEを起動します。
  2. 通常のアクセスと同様にアドレスバーに "http://DAVサーバのURL/" を入力 して[移動]ボタンをクリックします。
    これは、通常のWEBサーバをして機能しているかを確認するためなので、省略できます。
  3. メニュー[ファイル]-[開く]を選択して、"http://DAVサーバのURL/" を入力、「Webフォルダとして開く」にチェックを入れて[OK]ボタンをクリックします。
  4. 認証が有効な場合は、ここでユーザ名とパスワードの入力を要求してきますので、パスワードファイルを作るの所で htpasswd で入力したユーザ名とパスワードを入力してください。
  5. 正常にアクセスできれば、Webフォルダが開いてファイル名等が表示されます。
    残念ながら表示されなければ、パスワード等を確認してください。
    それでもダメなら、pingコマンドや上記telnetを使って確認する方法で、サーバが動いているか確認してください。

図はありませんが、無くても分かると思います。