ラック
Home > ブログ > 記事 > 2015年2月 > WebDAVの実験

WebDAVの実験

カテゴリ: Linux, サーバ

CentOSでWebDAVの実験を行ったのでメモしておきます。

なお、WebDAVはApache2.0以降のバージョンならデフォルトでモジュールが入っているとのことなので、サクッと設定すれば行けるはず…(と思ったらかなり沼だった

ということでやってみましょう。

設定自体はほぼ以下のサイトをそのまま。

あとは場合に応じて他のサイトも見てみたり。

 

1.ACLアクセス制御の有効化

UUID=foobar /home                       ext4    defaults        1 1
#↓
UUID=foobar /home                       ext4    defaults,acl        1 1

/home にaclを追加。

 

2.共有ディレクトリ作成

# useradd -s /sbin/nologin centos

###webDAV用のcentosというユーザを追加。/sbin/nologin指定なので、通常のユーザとしてログインすることはできない

# passwd centos
Changing password for user centos.
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully.

###パスワード設定

# chmod 711 /home/centos/
# mkdir /home/centos/webdav/
# chown centos. /home/centos/webdav/

###公開用ディレクトリの作成とパーミッション・所有者の設定

# setfacl -m g:apache:rwx,g:apache:rwx /home/centos/webdav/
# setfacl -m d:g:apache:rwx,g:apache:rwx /home/centos/webdav/
# setfacl -m g:centos:rwx,g:centos:rwx /home/centos/webdav/
# setfacl -m d:g:centos:rwx,g:centos:rwx /home/centos/webdav/

###ACLの設定。ここが肝。

# ll /home/centos/
合計 3
drwxrwxr-x+ 2 centos centos 1028  2月  30 23:42 2015 webdav
# getfacl /home/centos/webdav/
getfacl: Removing leading '/' from absolute path names
# file: home/centos/dav
# owner: centos
# group: centos
user::rwx
group::r-x
group:apache:rwx
group:centos:rwx
mask::rwx
other::r-x
default:user::rwx
default:group::r-x
default:group:apache:rwx
default:group:centos:rwx
default:mask::rwx
default:other::r-x

###ACLの確認。

ここで共有ディレクトリにアクセスするためのユーザ(認証で使う)と実際に使用するディレクトリを作成する。
なお、ACLの設定をリセットしたいときは

# setfacl -b /home/centos/webdav/

と入力すれば良い(実際、何度も助けられた)。

 

3.WebDAV設定

# vi /etc/httpd/conf.d/webdav.conf

###以下、viで入力した内容
Alias /webdav/centos /home/centos/webdav
<Directory "/home/centos/webdav">
    DAV On
    AllowOverride None
    Options None
    AuthType Basic
    AuthName WebDAV
    AuthUserFile /etc/httpd/conf/.htpasswd
    Require user centos
    Allow from all
</Directory>

###ここまで

# /etc/rc.d/init.d/httpd restart
httpd を停止中:                                            [  OK  ]
httpd を起動中:                                            [  OK  ]

これで最低限の設定が完了し、apacheの再起動も行ったのでWebDAVが有効になったはず。
ただし、上記で作成した「webdav.conf」の記述の通りBasic認証を行っているのでこれの設定を行わないと実際には接続できない。

 

4.BASIC認証用ユーザ登録

# htpasswd -c /etc/httpd/conf/.htpasswd centos
New password:
Re-type new password:
Adding password for user centos

###.htpasswdファイルが既に存在している場合は「-c」オプションを外す。「# htpasswd /etc/httpd/conf/.htpasswd centos」といった感じ。

クライアントソフトとして「TeamFile」を使用して、2.で作成し、4.でBasic認証を設定したユーザでアクセスできることを確認。

※ただし、Windows7からWebフォルダ(ネットワークの場所)の追加やネットワークドライブの割り当てを行おうとするとエラーが発生する。これについては後述する

 

5.日本語対策

上記の設定で最低限動作の確認は行えるが、あちこちに情報があるように日本語のファイル名が扱えない。なので対策を行う。

##### (1)mod_encodingインストール

# yum -y install httpd-devel
###mod_encodingのインストールにapxsが必要。これを含んだhttpd-develをインストールしておく

# httpd -v
Server version: Apache/2.2.XX (Unix)
###バージョンによって適応させるパッチと方法が変化するため、apacheのバージョンを確認しておく

# wget http://webdav.todo.gr.jp/download/experimental/mod_encoding.c.apache2.20040616
# wget http://webdav.todo.gr.jp/download/mod_encoding-20021209.tar.gz

###Apache2系へのモジュールは「Apache1.3系へのモジュールの差し替え」という形で提供されているとのことなので、
###Apache2を利用している場合、1.3へのモジュールもダウンロードする必要がある。
###ということで2つダウンロード。

# tar zxvf mod_encoding-20021209.tar.gz
# /bin/mv mod_encoding.c.apache2.20040616 mod_encoding-20021209/mod_encoding.c
# cd mod_encoding-20021209/lib/
# ./configure && make && make install

...
checking for gcc... no
checking for cc... no
configure: error: no acceptable cc found in $PATH

Cのコンパイラがないよ!と怒られて失敗してしまったので

# yum -y install gcc

でcのコンパイラをインストールして対処。

# ./configure && make && make install

###気を取り直してもう一度。
###今度は成功したので続きを行う。

# cd ..
# wget http://www.aconus.com/~oyaji/faq/mod_encoding.c-apache2.2-20060520.patch
# patch -p0 < mod_encoding.c-apache2.2-20060520.patch
# ./configure --with-apxs=/usr/sbin/apxs --with-iconv-hook
# vi Makefile

###ここからviでの編集内容

#LIBS =  -liconv_hook
#↓
LIBS =  -L/usr/local/lib -liconv_hook
###LIBSで呼び出すフックを変更

install-exec-local:
	$(APXS) -i -a -n encoding mod_encoding.la
#       $(APXS) -i mod_encoding.so

###APXSのパラメータ変更(インデントはタブで行うこと)
###以上2か所変更(場所は結構離れてる)

###ここまで

# make && make install
Makefile:XXX: *** 分離記号を欠いています (8 個の空白でしたが, TAB のつもりでしたか?).  中止.
###コピペしたときにtabが半角スペースになっていてエラーを招いた模様。「install-exec-local:」のところをタブに直して再度実行。

# make && make install
###今度は上手く行った。警告がたくさん出るがエラーでなければ良い、とのこと。

# rm -rf mod_encoding-20021209
# rm -f mod_encoding-20021209.tar.gz

###後片付け

##### (2)mod_encoding設定 

# vi /etc/httpd/conf.d/mod_encoding.conf

###ここからviでの編集内容
EncodingEngine        on

SetServerEncoding     UTF-8

DefaultClientEncoding UTF-8 CP932 EUCJP-MS

AddClientEncoding "Microsoft .* DAV 1.1" ASCII CP932 UTF-8
AddClientEncoding "Microsoft .* DAV" UTF-8 CP932
AddClientEncoding "(Microsoft .* DAV $)" UTF-8 CP932
AddClientEncoding "(Microsoft .* DAV 1.1)" CP932 UTF-8
AddClientEncoding "Microsoft-WebDAV*" UTF-8 CP932
AddClientEncoding "RMA/*" CP932
AddClientEncoding "xdwin9x/" CP932
AddClientEncoding "cadaver/" UTF-8 EUCJP-MS
AddClientEncoding "Mozilla/" EUCJP-MS
###ここまで

# /etc/rc.d/init.d/httpd restart
httpd を停止中:                                            [  OK  ]
httpd を起動中:                                            [  OK  ]

###apache再起動で設定を読み込ませる

これで一通り完了。

 


Ex1.Basic認証からDigest認証へ

きっかけは先述のようにBasic認証で接続しようとすると上手く行かないため。

>net use z: http://example.com/webdav/centos XXXXXXXXXX /USER:centos
システム エラー 67 が発生しました。

ネットワーク名が見つかりません。

Webフォルダもネットワークドライブもnet useコマンドもアウト。
で、調べてみたらどうもVista以降はセキュリティが厳しくなってWebDAVに対してSSLなしだとBasic認証が通らないようになっているっぽい。
WebClientサービスが起動していることは確認したし、レジストリも弄ってみたがダメだった。

オレオレ認証局のSSLもやってみたが弾かれた。

Alias /webdav/centos /home/centos/webdav
<Directory "/home/centos/webdav">
    DAV On
    SSLRequireSSL #追加
    AllowOverride None
    Options None
    AuthType Basic
    AuthName WebDAV
    AuthUserFile /etc/httpd/conf/.htpasswd
    Require user centos
    Allow from all
</Directory>

ちゃんとSSL要求するように設定し、apacheの再起動もかけてはみたものの、弾かれた。

困ってしまったが、「SSLなしのBasic認証」はダメというのであれば、他の認証はどうなのか、と思ってDigest認証にしてみようと思い立った。

Alias /webdav/centos /home/centos/webdav
<Directory "/home/centos/webdav">
    DAV On
#    SSLRequireSSL #SSLもう一度無効に
    AllowOverride None
    Options None
#    AuthType Basic #Basicはやめる
    AuthName WebDAV
    AuthType Digest
    AuthDigestDomain /home/centos/webdav/
    AuthUserFile /etc/httpd/conf/htdigest
#    AuthUserFile /etc/httpd/conf/.htpasswd #Basicはやめる
    Require user centos
    Allow from all
</Directory>

webdav.confを上記のように書き換える。

# htdigest -c /etc/httpd/conf/htdigest 'WebDAV' centos
Adding password for centos in realm WebDAV.
New password:
Re-type new password:

###今度はDigest認証用のパスワードファイルを作成。
###htdigestファイルが既に存在している場合はやはり「-c」オプションを外す。「# htdigest /etc/httpd/conf/htdigest 'WebDAV' centos」といった感じ。

# /etc/rc.d/init.d/httpd restart
httpd を停止中:                                            [  OK  ]
httpd を起動中:                                            [  OK  ]

これでDigest認証が有効になった。

>net use z: http://ewample.com/webdav/centos XXXXXXXXXX /USER:centos
コマンドは正常に終了しました。

httpでアクセスして、SSLなしでもnet useコマンドが成功することを確認。一度切断してネットワークドライブも割り当てられることを確認。

認証方法変えただけですんなり行くとは…。

 

Ex2.容量制限

これで共有ディレクトリにアクセスできるようになったが、無制限にファイルがアップできてしまうと困るので制限を掛けたい。

しかし、冒頭のmod_davの記述に拠ると

mod_dav がファイルを操作できるようにするためには、 管理下のディレクトリとファイルとに Apache が実行されている User と Group で書き込み可能である必要があります。 新しく作成されるファイルもこの User と Group に所有される ことになります。この理由から、そのアカウントへのアクセスを制御することは 重要です。

Apache モジュール mod_dav - Apache HTTP サーバ バージョン 2.0より引用)

ということで、ファイルをWebDAVディレクトリにアップロードするとそれらのファイルはApache実行ユーザが所有することになる。先ほど作成したcentosの所有ではない。
そのため、disk quotaによるユーザへのアクセス制限でユーザcentosに制限を掛けても引っかからない。

探してみるとディスク容量に関してのパッチが2つ存在するようだ。
しかし、Disk Quotaへのパッチは最新でも2.0.45までにしか対応していないため、2.2.XX系ではアウト。
もう片方は最新のapacheまで対応しているものの、ディスク容量の処理に関して独自実装(OSのコマンドを使用して、そこから計算)っぽい?

どちらもパッチなのでソースからmake && installする必要があり、個人的には少々食指が伸びにくい…。

そんなところで、ループバックデバイスとしてマウントしてディレクトリに容量制限を掛けるという方法が。

しかしかなりざっくりとした容量計算っぽい(あるいは進数の違いによる誤差か?)ので、んー?というところ。

 

…なかなか上手くいかないものです。

タグ: サーバ環境・構築

 



関連する記事一覧