Apache2.0+WebDAVの設定(Linux編)


サーバに置いたファイルを外部から扱う方法にはいろいろな方法がありますが、WebDAVは扱いが簡単そうなことからテストしてみました。結論 は、HTTPで無理をして動かしている感があり、普通のドキュメントだけなら使えそうですが、いくつか問題があり本格導入は諦めました。
WebDAVは、HTTPベースのファイル共有システムのため、FTPやSSHとはやや異なる部分があります。意識して使用すれば問題ありませんが、扱うドキュメントによっては、結果的にFTPと変わらないオペレーションになってしまうこともあります。
RedHatで動かすにはいくつかポイントになる点があり、少し苦労したのでこのまま眠らせるのはもったいないので、使ってみたいという方への情報として掲載することにしました。動作確認は、RedHat9のみで行いました。

Apache2.0系でのmod_encoding 導入に伴う日本語の文字化け対策を こちら に対策をまとめましたので、必ず実行してください。

しかくApache2.0/DAVのインストール

ApacheはDAV対応は当然ですが、日本語フォルダやファイル名に対応するため後でDSOモジュールとしてmod_encodingを組み 込みますので、./configure時に「--enable-so」オプションを付けてコンパイルします。新規にソースからインストールされる場合は、 SSLが不要ならこちら、SSL対応ならこちらを参考にしてインストールしてください。外部から使うことが想定されるなら、SSL対応されることを薦めます。もちろんRedHat標準のApache2でもかまいません。

なお、おやじは基本的に暗号化を必要とするコンテンツへのアクセスは、誤ってHTTPでアクセスしたときには強制的にHTTPSに Redirectしていますが、WebDAVはうまくできませんでした。従って、意識的にHTTPSでアクセスせざるを得ませんでしたが、HTTPS以外 でのアクセスを拒否し、不用意にHTTPでアクセスしないようにはできますので、後述します。

しかくApache2.0+WebDAVの設定

Apache2.0+WebDAVを動かすため、Apacheのhttpd.conf の設定を追加・変更していきます。

だいやまーく基本的な設定と動作確認

Apache2.0系ではWebDAVを標準でサポートしていますので、httpd.confの設定+αで動かすことができます。
テキストエディタでhttpd.confを編集していきます。変更する場合は、失敗に備えて変更行を下の行にコピーし、元の行の先頭に「#」を付加することにより、コメント行として保存しながら作業すると良いでしょう。 (青字は削除、赤字は追加、緑字は変更したものです。)

  1. WebDAVモジュールの組み込みの確認

    ・RedHat標準版もしくはソースからDSOで組み込んだ場合は、以下のとおりDAV関連モジュールがコメントアウトされていない(行頭に#なし)ことを確認する。

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

    ・ソースから組み込みでコンパイルした場合は、下記のようにして組み込みモジュール(mod_so.c、mod_dav.c、mod_dav_fs.c)があることを確認します。

    # /usr/local/apache2/bin/httpd -l
    Compiled in modules:
    (snip)
    mod_dav.c
    mod_dav_fs.c
    mod_so.c


  2. 事前準備(WebDAV用のディレクトリの作成)

    ここで、WebDAV用の共有ディレクトリ(ex. /usr/local/apache2/dav)とロックファイルを置くディレクトリ(ex. /var/lock/dav)を作成する。
    な お、これらのディレクトリは、いずれもApacheの実行ユーザ権限(httpd.confのUser/Groupディレクティブでの指定値。ソースから インストールしたならnobody/nobody、RPMから入れたのならapache/apache)でなければならない。

    # mkdir /usr/local/apache2/dav
    # chown nobody.nobody /usr/local/apache2/dav
    # mkdir /var/lock/dav
    # chown nobody.nobody /var/lock/dav


  3. ファイルロック用のフォルダの指定およびWebDAV用の共有フォルダ用の設定

    下記ディレクティブを追記し、共有フォルダを設定する。記述する場所は任意だが、分かりやすく一番最後に追記すると良い。

    DavLockDB /var/lock/dav/DavLock
    Alias /doc "/usr/local/apache2/dav"
    <IfModule mod_dav.c>
    DAVMinTimeout 600
    <Location /doc>
    DAV On
    SSLRequireSSL
    </Location>
    </IfModule>

    • DavLockDB /var/lock/dav/DavLock

      ファイルロック用のフォルダ(前項で作成済み)の指定。WebDAVでファイル共有した場合に、同じファイルを二人が操作できないようにするためのロックファイルを拡張子を除いた形(拡張子はApacheが付与)でパスを指定する。

    • Alias /doc "/usr/local/apache2/dav"

      Aliasとは、「別名」のこと。/docとWebDAVアクセスで指定されたら、それは「/usr/local/apache2/dav」のことという意味であり、実際はここにアクセスにくる。

    • DAVMinTimeout 600

      クライアントが DAV リソースロックを要求した場合、 ロックがサーバによって自動的に解除されるまでの時間を指定。ここでは600秒とした。あまり長いとロックされっぱなしになる恐れもあるので、ほどほどに。

    • DAV on

      設定したコンテナ(ディレクトリ)で WebDAV HTTP メソッドが使えるようにするための設定。

    • SSLRequireSSL

      この設定で、SSLを使用していないリクエスト(HTTPS以外)が全て拒否される。不用意なアクセス防止のためなので、ApacheがSSL対応していない場合は指定しないこと。

  4. Apacheの再起動

    設定が終了したら、WebDAVの基本動作を確認するため、Apacheを再起動する。

だいやまーく基本動作確認

Windowsでは、標準でサポートされているWebフォルダ機能でWebDAV機能を利用できます。ここでは、Windows2000 Professionalベースで示します。

なお、Windows XP では、下記のままでは 2項のところで ユーザ名の前にサーバ名が付与された認証画面が出て先に進みません。対策としては、「ネットワークプレースの追加」をするときだけ、「 WebClient 」サービスを停止してから追加作業を行えば問題は発生しません。その後、「 WebClient 」サービスを起動しなおして置いてください。 http://support.microsoft.com/default.aspx?scid=kb;ja;825382 参照。

  1. デスクトップの「マイネットワーク」を開き、「ネットワークプレースの追加」をクリックして、「ネットワークプレースの追加ウィザード」を起動する。

  2. 「ネットワークプレースの場所を入力してください」にURL(ex. http://localhost/doc/ 、 http://www.aconus.com/doc/ etc.)を入力し、次へを押す。

  3. WebDAVが機能していれば、「ネットワークプレイスの追加ウィザードの終了」画面になり、ネットワークプレイスの名前(ex. www.aconus.com上のdoc)が表示されるので、必要に応じネットワークプレイスの名前を変更し、完了を押す。

  4. こ こで作成したWebフォルダが開くので、適当なファイル(CGIやPHP等はエラーになりコピーできないので注意が必要)をコピー、削除したりして動作を 確認する。なお、日本語対応していない段階でフォルダの新規作成をすると、「新しいフォルダ」というフォルダ名が文字化けして削除が厄介になるので作成し ないこと。

だいやまーくセキュリティの確保

このままでは、誰でも自由に共有フォルダにアクセスして書き換えや削除ができてしまうので、ユーザ認証を導入することによりセキュリティを確保 します。Apacheでのユーザ認証には、ブラウザ側がサポートしていなかったという問題もあり「Basic認証」が広く使われていますが、Basic認 証はID とパスワードを MIME(BASE64)エンコードして送信しているだけなので、パケットを盗聴・デコードされれば、ID とパスワードが簡単に分かってしまいます。そこで、今回は、チャレンジ・レスポンス方式でMD5でハッシュして送信する「Digest認証」で行くことに しました。この方式をとれば、毎回送信内容が変わるので盗聴されても解読は極めて困難になります。
ところが、Digest認証はうまくいきませんでした。後述する日本語対応のためのmod_encodingに問題があるようで、新規のWebフォルダを登録できない等の問題がでます。 従って、Basic認証とせざるを得ず、外部から使うならSSLが必須と思います。

  1. パスワードファイルの作成

    Apacheのbinフォルダ内にあるhtpasswdコマンドでパスワードファイルを作成する。コマンドプロンプトで、

    htpasswd -c ファイル名 ユーザ名

    と入力すると、パスワードを2回聞かれるので入力する。パスワードファイルはドキュメントルート以外に置き、フォルダはあらかじめ作成しておかないとエ ラーとなる。-cオプションは、初回にファイルがないときだけ指定すればよく、二人目からは不要である。パスワード変更は、上書きされるので二人目以降同 様、-cオプションなしで入力すればよい。

    # cd /usr/local/apache2/bin
    # htpasswd -c /usr/local/apache2/conf/.htpasswd oyaji
    Automatically using MD5 format.
    New password: *****
    Re-type new password: *****
    Adding passwd for user oyaji


  2. 設定の追加

    設定は、httpd.confに追加したDAV関係のところに下記を書き加える。

    DavLockDB /var/lock/dav/DavLock
    Alias /doc "/usr/local/apache2/dav"
    <IfModule mod_dav.c>
    DAVMinTimeout 600
    <Location /doc>
    DAV On
    SSLRequireSSL

    AuthType Basic
    AuthName "DAV専用です。"
    AuthUserFile "/usr/local/apache2/conf/.htpasswd"
    Require valid-user

    Order deny,allow
    Deny from all
    Allow from 192.168.0.0/23

    </Location>
    </IfModule>


    • AuthType

      認証方式の指定をする。今回はベーシック認証なので、「Basic」と記述する。

    • AuthName

      認証画面の領域に表示される内容であり、日本語でも可。(ex. パスワードを入力してください。)

    • AuthUserFile

      1項で作成したパスワードファイルを指定する。

    • Require

      ここでは、「valid-user」としてパスワードファイルに登録したユーザ全てにアクセス許可を与えた。
      パスワードファイルに登録したユーザの中でも、特定のユーザだけにアクセス許可したい場合は、以下のとおり「Require user」に続けてユーザ名を記述すればよい。複数ユーザなら空白で区切って列記すればよい。

      Require user oyaji xxxx

    • 外部からのアクセス規制

      DAVフォルダに外部からアクセスできないようにするには、Allow/Denyディレクティブが使用できる。ここでは、「Allow from 192.168.0.0/23」として家庭内の「192.168.0.0/24と192.168.1.0/24」を許可した。

  3. 動作確認

    ここで、設定したとおりに認証ができるかApacheを再起動して動作確認しておこう。

だいやまーく日本語ファイル名対応(mod_encodingの導入)

実はこのままでは、日本語名ファイルやフォルダが扱えません。これは、WebDAVへの送信と受信で形式が異なるために発生するとのこと。日本 語ファイル名を扱えるようにするには「mod_encoding」というモジュールを使いますが、これが最大の難関で、エラー出まくりで苦労しました。

mod_encodingを単純に導入すると、程度の差はありますが他のソフトの日本語環境やCGIやPHPで日本語が文字化けしてしまいます。こちらにApache2.0系での対策をまとめましたので、必ず実行してください。

  1. 事前準備

    mod_encodingは、WebDAV Resources JPのDownloadからダウンロードできますが、Apache2.0用はApache1.3用のmod_encoding.cの差し替えファイルの形で提供されていますので、以下の2つのファイルを同じディレクトリにダウンロードします。

    • mod_encoding-20021209.tar.gz
    • mod_encoding.c.apache2.20020611a-2

    ダウンロードしたmod_encoding-20021209.tar.gzを展開してmod_encoding.c.apache2.20020611a-2をmod_encoding.cとして差し替えます。

    # tar zxfv mod_encoding-20021209.tar.gz
    # cp mod_encoding.c.apache2.20020611a-2 mod_encoding-20021209/mod_encoding.c


  2. iconv_hookのインストール

    mod_encodingのインストール前にiconv_hookライブラリのコンパイルとインストールを行います。

    # cd mod_encoding-20021209/lib
    # ./configure
    # make
    # make install


    これで、iconv_hookライブラリが/usr/local/lib配下にインストールされます。

  3. 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

    [Esc]、[:]、[w]、[q]で保存。

    # ldconfig


    後 は、WebDAV Resources JPのトラブル対策やREADME.JPを参考にインストールしていきます。なお、make時にwarningがたくさんでますが、エラーでなければ下記 のとおり進めて大丈夫です。mod_encoding-20021209のディレクトリに戻り、インストールを行います。

    # cd ../
    # ./configure --with-apxs=/usr/local/apache2/bin/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/mod_encoding.so


  4. httpd.confの設定

    mod_encoding関係の設定を、httpd.confに追加します。
    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 modules/mod_encoding.so

      mod_encodingモジュールをロードする。

    • EncodingEngine on

      モジュールを有効にする。

    • NormalizeUsername on

      Windows XPでユーザー認証を実施した場合、ユーザ名が「サーバのIPアドレス\ユーザ名」という形式になってしまうという問題への対策。

    • SetServerEncoding UTF-8

      サーバー側でファイル名に利用されるエンコーディングを指定する。UTF-8以外は不可。

    • DefaultClientEncoding JA-AUTO-SJIS-MS SJIS

      自動判定機能を提供する特殊なコンバータを指定するもので、UTF-8/JIS/MSSJIS/SJIS/EUC-JP を処理することができるようになる。

    • AddClientEncoding "cadaver/" EUC-JP

      各種エージェントから期待されるエンコーディングを指定する。基本的にIEのWebフォルダしか使用しないので、README.JPにあったcadaverのみ記述。

  5. 動作確認

    これで、日本語ファイルが扱えるようになるので、Apacheを再起動して動作確認しよう。


Top Pageへ

AltStyle によって変換されたページ (->オリジナル) /