2011年5月3日火曜日

WebDAV quota on linux

あまり apache に限った話ではなく、いくつか方法があると思うのだけど、思い
付いたところ。ユーザ WebDAV 用のローカル側にてディレクトリを

1. オーナーをユーザ、グループを www-data。合わせて SUID して user quota
   chmod 4770 $HOME/public_html/webdavdir
   
   でもディレクトリの SUID は意味がないと言うか、許されちゃいない。ここで
   も少し触れられているし、じゃったら FreeBSD をつかえぇ。位の話らしい。
   できる、できないではなくパッチもあり、そんなに難しいことではなさそうな
   ので、セキュリティの問題で、やらないっぽい。あるいは GFS2 なら mount 
   オプションにあるらしいけど、そこまでやる元気もなし


2. オーナーを www-data として SGID & group quota
   グループを各ユーザ毎に --- chamaken ユーザに chamaken グループなど作
   成してグループで group quota は umask を変更すれば可能。

   変更しないとディレクトリ掘られた場合に削除できなくなってしまう。

   Dealing With Dashcode, Part 2: Apache, WebDAV, and umasks と同じ事かな

   umask を 022 から 002 に変更するには、シェルユーザとしては
   /etc/profile や $HOME/.profile あるいは /etc/login.defs の UMASK など。
   apache の場合は /etc/apache2/envvars に umask 002 を追記してあげれば
   ば良い ``らしい''


3. POSIX ACL & group quota
   上の ``Dealing With Dashcode'' 眺めていて、何とかならんのかい。と試し
   ていたらできちゃった程度なので見識ある方ご意見いただけると、とっても
   ありがたいです。
   
   先日の /etc/fstab に acl オプション追加

       # diff -uw fstab.old fs
       --- fstab.old 2011-05-03 08:08:59.000000000 +0900
       +++ fstab 2011-05-03 08:39:53.000000000 +0900
       @@ -7,7 +7,9 @@
        #                
        proc            /proc           proc    defaults        0       0
        # / was on /dev/sda1 during installation
       -/dev/sda1 / ext3 errors=remount-ro,usrjquota=aquota.user,grpjquota=aquota.group,jqfmt=vfsv0 0 1
       +/dev/sda1 / ext3 errors=remount-ro,acl,usrjquota=aquota.user,grpjquota=aquota.group,jqfmt=vfsv0 0 1
        # swap was on /dev/sda5 during installation

   acl パッケージのインストール

       # aptitude install acl

   の後に root 権限不要。一般ユーザで

       $ mkdir g+ws $HOME/public_html/webdavdir
       $ chmod g+ws $HOME/public_html/webdavdir
       $ setfacl -m user:www-data:rwx $HOME/public_html/webdavdir
       $ setfacl -d -m user:www-data:rwx $HOME/public_html/webdavdir

   実際に group quota が効くかまでは試してないです...


長いけど umask を変更しなかった場合のお試し chamaken$ cd ~/public_html chamaken$ mkdir davtest chamaken$ ls -ld davtest drwxr-xr-x 2 chamaken chamaken 4096 May 3 18:05 davtest この配下のファイルはオーナを chamaken グループとしたいので、ディレクト リに SGID して group writable に chamaken$ chmod g+ws davtest chamaken$ ls -ld davtest drwxr-sr-x 2 chamaken chamaken 4096 May 3 18:05 davtest WebDAV でアクセスするためにオーナユーザを www-data に # root がユーザホームに手を入れるのは今一つ root# chown www-data davtest root# ls -ld davtest drwxr-sr-x 2 www-data chamaken 4096 May 3 18:05 davtest www-data になってお試し www-data$ cd /home/chamaken/public_html/davtest www-data$ touch www_file www-data$ ls -l www_file -rw-r--r-- 1 www-data chamaken 0 May 3 18:11 www_file www-data$ mkdir www_dir www-data$ ls -ld www_dir drwxr-sr-x 2 www-data chamaken 4096 May 3 18:11 www_dir www-data$ cd www_dir www-data$ touch www_file_in_www_dir www-data$ ls -l file_in_www_dir -rw-r--r-- 1 www-data chamaken 0 May 3 18:12 file_in_www_dir ずっと SGID が効いてるねぇ。同じ事を chamaken で chamaken$ pwd /home/chamaken/public_html chamaken$ cd davtest chamaken$ touch chamaken_file chamaken$ ls -l chamaken_file -rw-r--r-- 1 chamaken chamaken 0 May 3 18:17 chamaken_file この時点で怪しいけど www-data で、このファイルを消すことは消せる www-data$ pwd /home/chamaken/public_html/davdir/www_dir www-data$ cd .. www-data$ ls -l chamaken_file -rw-r--r-- 1 chamaken chamaken 0 May 3 18:17 chamaken_file www-data$ rm chamaken_file rm: remove write-protected regular empty file `chamaken_file'? y でもディレクトリ掘っちゃうと chamaken$ mkdir chamaken_dir chamaken$ cd chamaken_dir chamaken$ touch file_in_chamaken_dir chamaken$ ls -la total 8 drwxr-sr-x 2 chamaken chamaken 4096 May 3 18:43 . drwxrwsr-x 4 www-data chamaken 4096 May 3 18:39 .. -rw-r--r-- 1 chamaken chamaken 0 May 3 18:43 file_in_chamaken_dir www-data にて削除できず www-data$ rm -rf chamaken_dir rm: cannot remove `chamaken_dir/file_in_chamaken_dir': Permission denied 逆もしかりで chamaken$ rm www_file rm: remove write-protected regular empty file `www_file'? y chamaken$ rm -rf www_dir rm: cannot remove `www_dir/file_in_www_dir': Permission denied
また長いけど POSIX ACL でのお試し chamaken$ cd /home/chamaken/public_html/ chamaken$ mkdir davacl chamaken$ chmod g+ws davacl chamaken$ ls -ld davacl drwxrwsr-x 2 chamaken chamaken 4096 May 3 19:55 davacl chamaken$ setfacl -m user:www-data:rwx davacl chamaken$ ls -ld davacl drwxrwsr-x+ 2 chamaken chamaken 4096 May 3 19:55 davacl chamaken$ getfacl davacl # file: davacl # owner: chamaken # group: chamaken # flags: -s- user::rwx user:www-data:rwx group::rwx mask::rwx other::r-x chamaken$ setfacl -d -m user:www-data:rwx davacl chamaken$ cd davacl chamaken$ touch chamaken_file chamaken$ mkdir chamaken_dir chamaken$ touch chamaken_dir/file_in_chamaken_dir chamaken$ ls -ld chamaken_dir drwxrwsr-x+ 2 chamaken chamaken 4096 May 3 19:57 chamaken_dir chamaken$ getfacl chamaken_dir # file: chamaken_dir # owner: chamaken # group: chamaken # flags: -s- user::rwx user:www-data:rwx group::rwx mask::rwx other::r-x default:user::rwx default:user:www-data:rwx default:group::rwx default:mask::rwx default:other::r-x www-data 側でも www-data$ cd /home/chamaken/public_html/ www-data$ cd davacl www-data$ touch www_file www-data$ mkdir www_dir www-data$ touch www_dir/file_in_www_dir www-data$ ls -ld www_dir drwxrwsr-x+ 2 www-data chamaken 4096 May 3 19:59 www_dir www-data$ getfacl www_dir # file: www_dir # owner: www-data # group: chamaken # flags: -s- user::rwx user:www-data:rwx group::rwx mask::rwx other::r-x default:user::rwx default:user:www-data:rwx default:group::rwx default:mask::rwx default:other::r-x www-data$ ls -l total 8 drwxrwsr-x+ 2 chamaken chamaken 4096 May 3 19:57 chamaken_dir -rw-rw-r--+ 1 chamaken chamaken 0 May 3 19:57 chamaken_file drwxrwsr-x+ 2 www-data chamaken 4096 May 3 19:59 www_dir -rw-rw-r--+ 1 www-data chamaken 0 May 3 19:59 www_file www-data$ で chamaken で作ったモノを削除 www-data$ rm -r chamaken_* www-data$ 他方 chamaken 側でも www-data で作ったモノを削除 chamaken$ ls -l total 4 drwxrwsr-x+ 2 www-data chamaken 4096 May 3 19:59 www_dir -rw-rw-r--+ 1 www-data chamaken 0 May 3 19:59 www_file chamaken$ rm -r * で、前に作った実際の WebDAV 用ディレクトリに適用してみる chamaken$ mv .webdav old.webdav chamaken$ mkdir .webdav chamaken$ chmod g+ws .webdav chamaken$ setfacl -m user:www-data:rwx .webdav chamaken$ setfacl -d -m user:www-data:rwx .webdav 外からアクセスしてみる another_host# aptitude install davfs2 another_host# mkdir davmount another_host# mount.davfs https://testing_webserver/webdav davmount Please enter the username to authenticate with server https://testing_webserver/webdav or hit enter for none. Username: chamaken Please enter the password to authenticate user chamaken with server https://testing_webserver/webdav or hit enter for none. Password: mount.davfs: the server certificate does not match the server name (オレオレ使ってるぜ... と Warning) ... You only should accept this certificate, if you can verify the fingerprint! The server might be faked or there might be a man-in-the-middle-attack. Accept certificate for this session? [y,N] y another_host# ls davmount lost+found another_host# cp /etc/fstab davmount/ 長くなるので割愛。双方でディレクトリ掘ってファイルコピーしてみたりした後 の削除も可能で、まぁ動いた

0 件のコメント: