ちょっと jot

2011年5月19日木曜日

USB Storage iSerial for KVM

# on debian squeeze

## Apache WebDAV 調子芳しくなく... 
## 素直な設定のままでいろいろイジらん方が良さげ

また唐突、絶対に覚えられないのでメモ。地味に必要なヒトいるかも。KVM と言
うか QEMU の話で、-usbdevice オプションは古いから -device オプションを使
おう。調べたところ本家? に指定方法アリ。ドキュメント眺めたり debian git
のソース取ってきたりしたところ -drive 側で

    -drive id=usbmem,file=thinstick.img,serial=01234567890ABCDEF

でイケると思いきや、常に "1" に。また調べると、こんなパッチ があったけど
debian のソース - git://git.debian.org/git/collab-maint/qemu-kvm.git
ではバージョン 0.14.0+dfsg-1~tl からで squeeze にバックポートもないし、
このバージョンでバイナリパッケージ作るも依存関係、他パッケージのバージョ
ン合わずインストールできず。で、いつものよぉおーに...ムリヤリ

    --- hw/usb-msd.c.dpkg-dist 2011-05-19 22:52:54.000000000 +0900
    +++ hw/usb-msd.c 2011-05-19 22:53:00.000000000 +0900
    @@ -296,7 +296,11 @@
                     break;
                 case 3:
                     /* serial number */
    +                if (s->dinfo && s->dinfo->serial) {
    +                     ret = set_usb_string(data, s->dinfo->serial);
    +                } else {
                     ret = set_usb_string(data, "1");
    +                }
                     break;
                 default:
                     goto fail;

多分モニタからは指定できず、起動時のオプション指定のみしか有効にならない。
でもまぁ

    kvm -m 512M -net tap -net nic,model=e1000 \
    -device piix3-usb-uhci -device usb-storage,drive=usbmem \
    -drive id=usbmem,file=memstick.img,serial=0123456789ABCDEF

で動くことは動いてる。根性ナシで手抜き、こっちも忘れそうだけど

    $ dpkg-buildpackage -b -rfakeroot -us -uc
    ...
    $ su
    ...
    # mv /usr/bin/kvm /usr/bin/kvm.dpkg-dist
    # cp debian/qemu-kvm/usr/bin/kvm /usr/bin 

でゴマカシ。

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/ 長くなるので割愛。双方でディレクトリ掘ってファイルコピーしてみたりした後 の削除も可能で、まぁ動いた

2011年5月1日日曜日

apt-cacher-ng

インストールマニアのつもりはないけど、仮想マシンを度々作るにあたって何か
手軽にできないかな。えーっと g4u だっけ? の debian 版は。と探してみたら
FAI (Fully Automatic Installation) というモノがあった。いつものごとく
Quickstart - For the impatient user コレコレ。と眺め始めるも 明確な計画先
に立たず一旦保留。ドキュメントの中で apt-proxy 使うみたいなことが書かれて
いたけど squeeze になく、他をあたったところと似たようなパッケージを発見。確かに epoch 時間は読みヅラいけど、まぁ。
サーバ側は何もせず、クライアント側だけ /etc/apt を少々
  • /etc/apt/apt.conf.d/02proxy
    Acquire::http { Proxy "http://CacheServerIp:3142"; };
  • sources.list を
    • 前 deb http://ftp.uni-kl.de/debian etch main
    • 後 deb http://192.168.0.17:3142/ftp.uni-kl.de/debian etch main
のどちらか tap 接続なのでソレナリの bridge /etc/kvm-ifup 設定と netboot の準備した 後にインストール
...の前にごめんなさい。以前 dhcpd.conf で二つ誤り。一点はファイル名 filename "pxelinux.0"; ルートのスラッシュが必要らしく、正しくは filename "/pxelinux.0"; もう一点は failover らしき内容調子に乗って書いていたけど、できないそうで す。加えて isc-dhcpd の仕様でもないそうで、無理矢理稼動させようとしたと ころ /etc/dhcp/master.conf line 1259: dynamic-bootp flag is not permitted for address range dynamic-bootp 172.27.101.193 172.27.101.220; ^ range declarations where there is a failover peer in scope. If you wish to declare an address range from which dynamic bootp leases can be allocated, please declare it within a pool declaration that also contains the "no failover" statement. The failover protocol itself does not permit dynamic bootp - this is not a limitation specific to the ISC DHCP server. Please don't ask me to defend this until you have read and really tried to understand the failover protocol specification. と叱られてしまいました。さて... と僅かばかりの試行錯誤、格闘してみたとこ ろの結果としては、当該 subnet では failover 使わない。が無難そう ignore bootp; ... subnet 172.27.101.0 netmask 255.255.255.0 { option routers 172.27.101.1; option broadcast-address 172.27.101.255; option domain-name-servers 172.27.1.1, 172.27.129.1; option domain-name "mydomain.or.jp"; pool { # ignore unknown-clients; deny dynamic bootp clients; failover peer "poolish"; range 172.27.101.65 172.27.101.190; } } としてあったところを allow bootp; ... subnet 172.27.101.0 netmask 255.255.255.0 { option routers 172.27.101.1; option broadcast-address 172.27.101.255; option domain-name-servers 172.27.1.1, 172.27.129.1; option domain-name "mydomains.or.jp"; filename "/pxelinux.0"; next-server 172.27.1.1; range 172.27.101.65 172.27.101.190; range dynamic-bootp 172.27.101.193 172.27.101.220; } として。こんなんで failover のよくある設定方法、dhcpd.conf と master.conf での master.conf があっちとこっちで違ってくると言う悲しい結 果。他にも間違いあったら指摘いただけると嬉しいです。
と、気を取り直して # kvm -net nic,model=virtio -net tap -boot n -curses netest.img とすると virtio で PXE が稼動開始して下記テキスト画面 Starting SeaBIOS (version 0.5.1-20101112_103537-polaris) Booting from virtio-net.zrom 5.4.4 (GPL) ether... ROM segment 0xc900 length 0x8000 reloc 0x00000000 Etherboot 5.4.4 (GPL) http://etherboot.org Drivers: VIRTIO-NET Images: NBI ELF PXE Exports: PXE Protocols: DHCP TFTP Relocating _text from: [00087780,0009f310) to [07ee8470,07f00000) Boot from (N)etwork or (Q)uit? Probing pci nic... Probing isa nic... Boot from (N)etwork or (Q)uit? Probing pci nic... [virtio-net]I/O address 0x0000c020, IRQ #11 MAC address 52:54:00:12:34:56 Searching for server (DHCP).... ちょっと待つと、いつもの真っ黒画面の真ん中に 640 x 480 Graphic mode 何度も書いている内に覚えたエコーバックないけど ''[スペース] linux text'' 更に覚えられず F8 見ながら install vga=normal fb=false。さくさくっと進ん で debian アーカイブミラー選択の下記画面になったら、一番上 ====== [!] Choose a mirror of the Debian archive ====== = = = The goal is to find a mirror of the Debian archive that is close to = = you on the network -- be aware that nearby countries, or even your = = own, may not be the best choice. = = = = Debian archive mirror country: = = = = enter information manually = = = Argentina = = = Australia = = = Austria = = = Bangladesh = = = Belarus = = = Belgium = = = Bosnia and Herzegovina = = = Brazil = = = Bulgaria = = = = = = = = ========================= enter information manually を選択すると、こんな画面 ===== [!!] Choose a mirror of the Debian archive ===== = = = = Please enter the hostname of the mirror from which Debian will be = = downloaded. = = = = An alternate port can be specified using the standard = = [hostname]:[port] format. = = = = Debian archive mirror hostname: = = = = mirror____________________________________________________________ = = = = = = = ======================= この mirror hostname: に上の例であれば 192.168.0.17:3142 として Continue。長くなるので省略しちゃうけど、次の画面の Debian archive mirror directory: を /ftp.uni-kl.de/debian として Continue。更に次の proxy は何もせず Continue で OK。一回目は取りに行っちゃ うけど、二回目以降は確認しに行くだけなので、速くなる...ハズ

apache webdav つづきの Tips

* URL の変更
   https://servername/~chamaken/.webdav がちょっと格好悪いので /webdav
   でアクセス。認証ユーザによって URL を変更する方法。いくつかあるらしい
   けど、説明ページの多い mod_rewrite を利用。

   # ~ をなくすには AliasMatch ^/([^/]+)/(.*) /home/$1/.webdav/$2 だそうだ

       # a2enmod rewrite
        Enabling module rewrite.
        Run '/etc/init.d/apache2 restart' to activate new configuration!
        # mv default-ssl default-ssl.dpkg-dist
        # cp default-ssl.dpkg-dist default-ssl
        # emacs default-ssl
        # diff -uw default-ssl.dpkg-dist default-ssl
        --- default-ssl.dpkg-dist       2011-03-23 06:13:14.000000000 +0900
        +++ default-ssl 2011-04-30 22:28:06.000000000 +0900
        @@ -168,5 +168,13 @@
                # MSIE 7 and newer should be able to use keepalive
                BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
 
        +        # mod_rewrite
        +        RewriteEngine on
        +        RewriteLog "/var/log/apache2/rewrite.log"
        +        RewriteLogLevel 1
        +
        +        RewriteCond %{LA-U:REMOTE_USER} (.*)
        +        RewriteRule ^/webdav(.*) /~%{LA-U:REMOTE_USER}/public_html/.webdav$1 [NS,L]
        +        RewriteRule ^/private(.*) /~%{LA-U:REMOTE_USER}/public_html/private$1 [NS,L]
         </VirtualHost>
         </IfModule>

   これで https://servername/webdav とアクセスすると認証したユーザ名で、
   ソレナリの URL に変換される


* davfs2
   webdab アクセスするユーザの所属するグループを増やしてよいのであれば、
   設定ファイルは特段変更せず当該ユーザを davfs2 グループに加えてあげる。

       # aptitude install davfs2
       ...
       # adduser chamaken davfs2
       Adding user `chamaken' to group `davfs2' ...
       Adding user chamaken to group davfs2
       Done.

   やっぱり root で引き続き。/etc/fstab に追記

       # cd /etc
       # cp fstab fstab.old
       # vi fstab
       # diff -uw fstab.old fstab
       --- fstab.old 2011-05-01 08:07:33.000000000 +0900
       +++ fstab 2011-05-01 08:08:59.000000000 +0900
       @@ -11,3 +11,5 @@
        # swap was on /dev/sda5 during installation
        /dev/sda5 none            swap    sw              0 0
        /dev/scd0 /media/cdrom0   udf,iso9660 user,noauto 0 0
       +https://localhost/webdav /home/chamaken/webdav davfs defaults,user,noauto 0 0
       +
       # 

   うーん、ちょっと微妙だけど一般ユーザから操作したいので setuid

       # chmod u+s /usr/sbin/mount.davfs

   一般ユーザアカウントで

       $ mount webdav
       Please enter the username to authenticate with server
       https://localhost/webdav or hit enter for none.
         Username: chamaken
       Please enter the password to authenticate user chamas with server
       https://localhost/webdav or hit enter for none.
         Password:  パスワード
       /sbin/mount.davfs: the server certificate does not match the server name
       /sbin/mount.davfs: the server certificate is not trusted
         issuer:      oreore
         subject:     oreore
         identity:    oreore.invalid.net
         fingerprint: aa:bb:cc:dd:ee:ff:11:22:33:44:55:66:77:88:99:00:11:22:33:44
       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

   何だか自分のホーム配下に間接アクセスはもぞかしいいけど、まぁ

   
* (意味がないけど) quota
   apache webdav quota で調べるとモジュールがあったり FAQ では obsolute
   になったモジュール使うかコンパイルし直してハンドラ書けとかあるけど、
   何かソコまでやる元気がないと言うか...

   で、あまり意味がなくなってしまったけど、普通の quota 設定も備忘録とし
   て残しておこうかと。How To Set Up Journaled Quota On Debian Lenny
   そのままとはちょっと違っていたので

   # げっ.../home 切ってないし

       # aptitude install quota quotatool
       ...
       # cp fstab fstab.old
       # vi fstab
       # diff -uw fstab.old fs
       --- fstab.old 2011-05-01 08:08:59.000000000 +0900
       +++ fstab 2011-05-01 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 0       1
       +/dev/sda1 / ext3    errors=remount-ro,usrjquota=aquota.user,grpjquota=aquota.group,jqfmt=vfsv0 0       1
        # swap was on /dev/sda5 during installation

   ここで touch /aquota.user /aquota.group すると後でサイズおかしいとか
   言われるので作らずに

       # cd /
       # mount -o remount /
       # quotacheck -avugm
       quotacheck: Scanning /dev/sda1 [/] done
       quotacheck: Cannot stat old user quota file: No such file or directory
       quotacheck: Cannot stat old group quota file: No such file or directory
       quotacheck: Cannot stat old user quota file: No such file or directory
       quotacheck: Cannot stat old group quota file: No such file or directory
       quotacheck: Checked 17441 directories and 259009 files
       quotacheck: Old file not found.
       quotacheck: Old file not found.
       # ls -l /aquota.*
       -rw------- 1 root root 10240 May  1 08:40 /aquota.group
       -rw------- 1 root root  9216 May  1 08:40 /aquota.user
       # quotaon -avug
       /dev/sda1 [/]: group quotas turned on
       /dev/sda1 [/]: user quotas turned on

   linux quota で検索すると、ここで edquota になるんだけど、サイズ指定よ
   くわかんなかったりエディタでの編集煩しく quotatool 使用。quotatool(8)
   眺めた後に

       # id -u chamaken
       1000
       # quotatool -u 1000 -d /
       # quotatool -b -u 1000 -q $((1024 * 32))MB -l $((1024 * 32 - 128))MB /
       # quotatool -u 1000 -d /
       1000 / 4022884 33554432 33423360 0 140959 0 0 0

apache webdav

on debian squeeze は省略。ユーザディレクトリ配下に方法変えつつ色々と
https アクセス。いわゆる$HOME/public_html はそのまま。その下の private は
mod_authz_owner でRequire file-owner。.webdav は文字通り webdav で。


1. apache などのインストール
       # aptitude install apache2 libapache2-mod-auth-pam \
       > libpam-radius-auth libapache2-mod-encoding
   

2. https:443 のみ有効として、ソレナリのモジュール準備
   サイトファイル? と言うのかしら?

       # a2dissite
       Your choices are: default
       Which site(s) do you want to disable (wildcards ok)?
       default
       Site default disabled.
       Run '/etc/init.d/apache2 reload' to activate new configuration!

       # a2ensite
       Your choices are: default default-ssl
       Which site(s) do you want to enable (wildcards ok)?
       default-ssl
       Enabling site default-ssl.
       Run '/etc/init.d/apache2 reload' to activate new configuration!

   次にモジュール

       # a2enmod
       Your choices are: actions alias ...
       Which module(s) do you want to enable (wildcards ok)?
       auth_pam authz_owner dav* ssl userdir
       Module auth_pam already enabled
       Enabling module authz_owner.
       ...
       Enabling module ssl.
       See /usr/share/doc/apache2.2-common/README.Debian.gz on how to
           configure SSL and create self-signed certificates.
       Enabling module userdir.
       Run '/etc/init.d/apache2 restart' to activate new configuration!

   オレオレ証明書の説明はまぁデフォルトでも動くので割愛、ごめんなさい。
   こちらリスンポートのファイルでも無効に

       # cd /etc/apache2/
       # cp ports.conf ports.conf.dpkg-dist
       # emacs ports.conf
       # diff -uw ports.conf.dpkg-dist ports.conf
       --- ports.conf.dpkg-dist 2011-04-30 20:48:43.000000000 +0900
       +++ ports.conf 2011-04-30 20:49:11.000000000 +0900
       @@ -5,8 +5,8 @@
        # Debian etch). See /usr/share/doc/apache2.2-common/NEWS.Debian.gz and
        # README.Debian.gz
 
       -NameVirtualHost *:80
       -Listen 80
       +# NameVirtualHost *:80
       +# Listen 80
 
        <IfModule mod_ssl.c>
            # If you add NameVirtualHost *:443 here, you will also have to change

   一応再起動 /etc/init.d/apache2 restart して確認。http://servername や
   https://servername にアクセスしたり、その他として

       # netstat -aptn | grep apache
       # lsof -i | grep apache

   で TCP 80 番で聞き耳たてていないか


3. libapache2-mod-auth-pam の設定
   /usr/share/doc/libpam-radius-auth/examples/pam_example などを眺めつつ

       # cd /etc/pam.d/
       # cp apache2 apache2.dpkg-dist
       # emacs apache2
       # diff -uw apache2.dpkg-dist apache2
       --- apache2.dpkg-dist 2011-04-30 20:56:02.000000000 +0900
       +++ apache2 2011-04-30 20:56:52.000000000 +0900
       @@ -1,2 +1,4 @@
       +auth    sufficient      pam_radius_auth.so
       +account sufficient      pam_radius_auth.so
        @include common-auth
        @include common-account

   apache 〜 PAM 〜 freeradius 〜 PAM と、とっても遠回りだけど。


4. libpam-radius-auth の設定
   前回の FreeRADIUS を使うとして

       # cd /etc
       # cp pam_radius_auth.conf pam_radius_auth.conf.dpkg-dist
       # emacs pam_radius_auth.conf
       # diff -uw pam_radius_auth.conf.dpkg-dist pam_radius_auth.conf
       --- pam_radius_auth.conf.dpkg-dist 2011-04-30 20:54:40.000000000 +0900
       +++ pam_radius_auth.conf 2011-04-30 20:54:48.000000000 +0900
       @@ -23,8 +23,7 @@
        #  deciding that the server has failed to respond.
        #
        # server[:port] shared_secret      timeout (s)
       -127.0.0.1 secret             1
       -other-server    other-secret       3
       +127.0.0.1 ZkPbwZ17bCDEx7Kx 2
 
        #
        # having localhost in your radius configuration is a Good Thing.

   apache が、この pam_radius_auth.conf を読む必要があるので

       # ls -l pam_radius_auth.conf
       -rw------- 1 root root 1257 Apr 30 20:54 pam_radius_auth.conf
       # chgrp www-data pam_radius_auth.conf
       # chmod 0640 pam_radius_auth.conf
       # ls -l pam_radius_auth.conf
       -rw-r----- 1 root www-data 1257 Apr 30 20:54 pam_radius_auth.conf

   /etc/shadow を www-data グループにして読み取らせるよりは、少し安心で
   きる気がしてる

5. ユーザディレクトリ作成
   一般ユーザで

       $ cd
       $ mkdir -p public_html/private
       $ ls -ld public_html
       drwxr-xr-x 3 chamaken chamaken 4096 Apr 30 21:02 public_html
       $ ls -ld public_html/private/
       drwxr-xr-x 2 chamaken chamaken 4096 Apr 30 21:02 public_html/private/
       $ echo 'My private content works!' \
       > > public_html/private/index.html
   
   最後の一行が Require file-owner で必要になるのか、ならないのかはっき
   りせず。Options Indexes を指定しても...


6. public_html アクセスの設定 - mod_authz_owner だけ
   バックアップ取りつつ 

       # ls -l userdir.*
       lrwxrwxrwx 1 root root  30 Apr 30 20:47 userdir.conf -> ../mods-available/userdir.conf
       -rw-r--r-- 1 root root 604 Apr 30 21:06 userdir.conf.dpkg-dist
       lrwxrwxrwx 1 root root  30 Apr 30 20:47 userdir.load -> ../mods-available/userdir.load
       # mv userdir.conf userdir.conf.dpkg-dist
       # cp userdir.conf.dpkg-dist userdir.conf
       # ls -l userdir.*
       -rw-r--r-- 1 root root 604 Apr 30 21:07 userdir.conf
       lrwxrwxrwx 1 root root  30 Apr 30 20:47 userdir.conf.dpkg-dist -> ../mods-available/userdir.conf
       lrwxrwxrwx 1 root root  30 Apr 30 20:47 userdir.load -> ../mods-available/userdir.load

   設定ファイル編集。private はディレクトリインデックスせず、PAM 認証で
   ファイルオーナーが同じ場合のみアクセス可

      # emacs userdir.conf
      ...
      # diff -uw userdir.conf.dpkg-dist userdir.conf
      --- userdir.conf.dpkg-dist 2011-03-23 06:13:14.000000000 +0900
      +++ userdir.conf 2011-04-30 21:10:29.000000000 +0900
      @@ -5,6 +5,9 @@
               <Directory /home/*/public_html>
                       AllowOverride FileInfo AuthConfig Limit Indexes
                       Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
      +
      +               IndexIgnore private
      +
                       <Limit GET POST OPTIONS>
                               Order allow,deny
                               Allow from all
      @@ -14,5 +17,20 @@
                               Deny from all
                       </LimitExcept>
               </Directory>
      -</IfModule>
 
      +       <Directory /home/*/public_html/private>
      +               AllowOverride FileInfo AuthConfig Limit Indexes
      +               Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
      +
      +               AuthPAM_Enabled On
      +               AuthPAM_FallThrough Off
      +               AuthBasicAuthoritative Off
      +               AuthUserFile /dev/null
      +
      +               AuthType Basic
      +               AuthName "Your Private Contets"
      +
      +               Require file-owner
      +               Satisfy All
      +       </Directory>
      +</IfModule>

   AuthBasicAuthoritative Off が結構ハマった。AuthUserFile /dev/null は
   ログがうるさいので

7. ちょっと確認
   また再起動 /etc/init.d/apache2 restart してから、ブラウザ何でも良いので

       https://servername/~chamaken
       Index of /~chamaken
       [ICO]   Name    Last modified   Size    Description
       [DIR]   Parent Directory                -        
       Apache/2.2.16 (Debian) Server at decoh4 Port 443/

   うん。private がインデックスされず

       https://servername/~chamaken/private
       My private content works! 

   うん、ちょーさみしーコンテンツ


8. webdav 設定
   なかなか悲しいかな、どうしたって apache 稼動ユーザ権限が必要な模様。
   
   mod_dav がファイルを操作できるようにするためには、 管理下のディレクト
   リとファイルとに Apache が実行されている User と Group で書き込み可能
   である必要があります。 新しく作成されるファイルもこの User と Group に
   所有される ことになります。この理由から、そのアカウントへのアクセスを
   制御することは 重要です。DAV リポジトリは Apache 専用のものだとみなさ
   れています。 Apache 以外の方法でファイルを修正すること (例えば FTP や
   ファイルシステム 用のツールなどを使って) は許可されていません。

   suexec じゃないけど sudir とかないのかしら。これができれば quota とか
   ローカルアカウントのユーザが気にせず読み書き... と思ったけど webdav
   プロトコルでのロックとか考えると、ローカルファイルとして操作するので
   はなく webdav としてマウントして使うべきか。

   ローカルユーザのホームディレクトリ配下なんだけど root になって

       # mkdir /home/chamaken/public_html/.webdav
       # chown www-data.www-data /home/chamaken/public_html/.webdav
       # ls -ld !$
       ls -ld /home/chamaken/public_html/.webdav
       drwxr-xr-x 2 www-data www-data 4096 Apr 30 21:04 /home/chamaken/public_html/.webdav

   userdir 設定の更新

       # cp userdir.conf userdir.conf.private
       # emacs userdir.conf
       ...
       # diff -uw userdir.conf.private userdir.conf
       --- userdir.conf.private        2011-04-30 21:45:04.000000000 +0900
       +++ userdir.conf        2011-04-30 21:45:15.000000000 +0900
       @@ -6,7 +6,7 @@
                       AllowOverride FileInfo AuthConfig Limit Indexes
                       Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
 
       -               IndexIgnore private
       +               IndexIgnore private .webdav
 
                       <Limit GET POST OPTIONS>
                               Order allow,deny
       @@ -33,4 +33,31 @@
                       Require file-owner
                       Satisfy All
               </Directory>
       +
       +        <Directory /home/*/public_html/.webdav>
       +                AllowOverride FileInfo AuthConfig Limit Indexes
       +                Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
       +
       +                AuthPAM_Enabled On
       +                AuthPAM_FallThrough Off
       +                AuthBasicAuthoritative Off
       +                AuthUserFile /dev/null
       +
       +                AuthType Basic
       +                AuthName "Your WEBDAV Authentication"
       +
       +                DAV On
       +
       +                <LimitExcept GET POST OPTIONS>
       +                        Order allow,deny
       +                        Allow from all
       +                </LimitExcept>
       +                Satisfy All
       +
       +                ForceType text/plain
       +        </Directory>
       +
       +       <Directory /home/chamaken/public_html/.webdav>
       +               Require user chamaken
       +       </Directory>
        </IfModule>

   最後の方の Require user を個々ディレクトリ毎に指定するのが少々切ない。


9. webdav アクセス
   手元の環境なら nautilus webdav。Windows からならば

       # a2enmod encoding
       Enabling module encoding.
       Run '/etc/init.d/apache2 restart' to activate new configuration!
       # emacs /etc/apache2/mods-enabled/encoding.conf適切に設定した後の方が良いのかしら。~/chamaken/.webdav はちょっと見
   栄えが悪かったりするので、その他 Tips は次回に

2011年4月30日土曜日

freeradius rlm_pap on debian squeeze

HTML がわかっていず面倒なので <pre> と FireFox extension の It's All Text!
emacsclient & auto-fill-mode & set-fill-column 72 あたりで (C-x f)

0. インストールの前に
   直に /etc/passwd を触らせるのではなく PAM 経由。一応インストール前の
   状態を確認

       # cd /etc
       # ls -l passwd group shadow gshadow
       -rw-r--r-- 1 root root    820 Apr 30 14:03 group
       -rw-r----- 1 root shadow  679 Apr 30 14:03 gshadow
       -rw-r--r-- 1 root root   1584 Apr 30 14:03 passwd
       -rw-r----- 1 root shadow 1348 Apr 30 14:03 shadow
       # grep freerad passwd group shadow gshadowN
       # ls -l /etc/pam.d/radiusd
       ls: cannot access /etc/pam.d/radiusd: No such file or directory


1. インストール
   そのまま

       # aptitude install freeradius

   何も問われず。で、何されたか? を確認

       # ls -l passwd group shadow gshadow
       -rw-r--r-- 1 root root    849 Apr 30 15:26 group
       -rw-r----- 1 root shadow  705 Apr 30 15:26 gshadow
       -rw-r--r-- 1 root root   1630 Apr 30 15:26 passwd
       -rw-r----- 1 root shadow 1377 Apr 30 15:26 shadow
       # grep freerad passwd group shadow gshadow
       passwd:freerad:x:114:120::/etc/freeradius:/bin/false
       group:shadow:x:42:freerad
       group:ssl-cert:x:111:freerad
       group:freerad:x:120:
       shadow:freerad:*:15094:0:99999:7:::
       gshadow:shadow:*::freerad
       gshadow:ssl-cert:!::freerad
       gshadow:freerad:!::
       # ls -l /etc/pam.d/radiusd
       -rw-r--r-- 1 root root 227 Sep 28  2010 /etc/pam.d/radiusd

   グループ shadow に freerad が加えられた。イコール freerad ユーザアカ
   ウントで /etc/shadow を読むことができる。/etc/pam.d/radiusd の中身は、
   うん。特に...


3. 設定ファイル変更
   How do I use PAM with FreeRADIUS?rlm_pam の説明眺めながらファイル
三つ更新。どこかで見付けたパスワード生成ワンライナー

       # cat /dev/urandom | tr -dc '0-9A-Za-z' | fold -b16 | head -n1
       ZkPbwZ17bCDEx7Kx

   を多用しつつ。余裕があるなら? もちろん /dev/random の方が良いらしい

   
  • /etc/freeradius/users
  • # diff -uw users.dpkg-dist users --- users.dpkg-dist 2011-04-30 15:59:45.000000000 +0900 +++ users 2011-04-30 15:41:02.000000000 +0900 @@ -163,6 +163,8 @@ # Service-Type = Framed-User, # Fall-Through = Yes +DEFAULT Auth-Type = Pam + # # Default for PPP: dynamic IP address, PPP mode, VJ-compression. # NOTE: we do not use Hint = "PPP", since PPP might also be auto-detected #
  • /etc/freeradius/clients.conf
  • # diff -uw clients.conf.dpkg-dist clients.conf --- clients.conf.dpkg-dist 2011-04-30 16:03:19.000000000 +0900 +++ clients.conf 2011-04-30 15:40:26.000000000 +0900 @@ -98,7 +98,7 @@ # The default secret below is only for testing, and should # not be used in any real environment. # - secret = testing123 + secret = ZkPbwZ17bCDEx7Kx # # Old-style clients do not send a Message-Authenticator @@ -232,3 +232,14 @@ # secret = testing123 # } #} + +client 172.27.0.0/17 { + shortname = primary_site + secret = jf5O7D0FD2v4KJqH +} + +client 172.27.129.0/17 { + shortname = secondary_site + secret = wvlo17pzXHzOnLfL +} +
  • /etc/freeradius/sites-enabled/default
  • # diff -uw sites-enabled/default.dpkg-dist sites-enabled/default --- sites-enabled/default.dpkg-dist 2011-04-30 16:00:37.000000000 +0900 +++ sites-enabled/default 2011-04-30 16:00:42.000000000 +0900 @@ -263,7 +263,7 @@ # # Pluggable Authentication Modules. -# pam + pam # # See 'man getpwent' for information on how the 'unix' # 3. 再起動 # /etc/init.d/freeradius restart 4. テスト # radtest chamaken 'bl0gSP010' localhost 10 ZkPbwZ17bCDEx7Kx Sending Access-Request of id 65 to 127.0.0.1 port 1812 User-Name = "chamaken" User-Password = "bl0gSP010" NAS-IP-Address = 127.0.1.1 NAS-Port = 10 rad_recv: Access-Accept packet from host 127.0.0.1 port 1812, id=65, length=20 # radtest chamaken 'invalid_passwd' localhost 10 ZkPbwZ17bCDEx7Kx Sending Access-Request of id 32 to 127.0.0.1 port 1812 User-Name = "chamaken" User-Password = "invalid_passwd" NAS-IP-Address = 127.0.1.1 NAS-Port = 10 rad_recv: Access-Reject packet from host 127.0.0.1 port 1812, id=32, length=20 5. その他 freeradius とは /etc/init.d/freeradius stop した後に # freeradius -X で戦うべし。/etc/freeradius/users の DEFAULT Auth-Type = Pam の位置に気をつけて。PPP の前、先頭行でも良いくらい

    2011年4月26日火曜日

    TIPS: KVM (qemu) for debian squeeze - その 1

    小さいネタをいくつか。
    netboot
    qemu pxe をキーワードに Google 先生に尋ねたところ最初のページ日本語の
    最初のページ
    眺めると ROM-o-matic.net でブートイメージ作って。とあったの
    で早速。 1.0.1 の Image Generator で NIC type の選択に virtio-net なんて
    あったものだから、おぉと選択。フロッピーはないでしょ。もしかしたら今後
    使うカモとか思いつつ output format に USB Keychain disk image を選んで
    あとはシリアルコンソールとか。さて kvm を起動しようと、マニュアルでブー
    トデバイスの指 定を眺めると...
    -boot [order=drives][,once=drives][,menu=on|off]
    Specify boot order drives as a string of drive letters.
    Valid drive letters depend on the target achitecture. The x86 PC uses:
    a, b (floppy 1 and 2), c (first hard disk),d(first CD-ROM),
    n-p (Etherboot from network adapter 1-4),
    hard disk boot is the default.
    To apply a particular boot order only on the first startup, specify it via once.
    へっ? とお試し。

    1. tftpd のインストールと netboot イメージ
      # aptitude install tftpd-hpa
      (TFTP root directory: /srv/tftp)
      # cd /srv/tftp
      # wget http://ftp.jp.debian.org/debian/dists/stable/main/installer-amd64/current/images/netboot/netboot.tar.gz
      # tar xzf netboot.tar.gz
      # ls -1
      debian-installer
      netboot.tar.gz
      pxelinux.0
      pxelinux.cfg
      version.info
    2. dhcpd.conf の編集
      filename に /pxelinux.0。next-server に tftpd サーバのアドレス
      subnet 172.27.201.0 netmask 255.255.255.0 {
          option routers 172.27.201.1;
          option broadcast-address 172.27.201.255;
      
          pool {
              # ignore unknown-clients;
              # deny dynamic bootp clients;
              failover peer "poolish";
              option domain-name-servers 172.27.129.1, 172.27.1.1;
              option domain-name "siesta.or.jp";
      
              filename "pxelinux.0";
              next-server 172.27.129.1;
      
              range 172.27.201.65 172.27.201.190;
          }
      }
      こんな感じ。
    3. サーバ群再起動 & kvm 起動
      # /etc/init.d/tftpd-hpa restart
      # /etc/init.d/isc-dhcp-server restart
      # cd ほにゃほにゃ
      # kvm-img create netboot.img 8G
      # kvm -net tap -net nic,model=virtio -boot n -curses netboot.img
    で例のまっ黒画面に 640x480 表示されるので、目を閉じてスペース & linux text

    ルーティング
    むやみやたらに kvm-qemu や lxc でゲスト作りまくっているとワケワカになって
    えーいままよ。と大元のホスト筆頭に
    iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
    ってやっちゃったりしない? うーん、それもどうかと思うけど、コレもどうかと。
    でコレは OSPFv2 / IPv4 適当に動かしちゃう。

    1. quagga のインストール
      # aptitude install quagga
    2. /etc/quagga/daemonsの編集
      コメント除けば
      zebra=yes
      bgpd=no
      ospfd=2
      ospf6d=no
      ripd=no
      ripngd=no
      isisd=no
    3. /etc/quagga/zebra.conf/etc/quagga/ospfd.conf
      • zebra.conf
      • hostname zebra@<適当なホスト名>
        password zebra
        enable password zebra
        log file /var/log/quagga/zebra.log
        !service password-encryption
        !
        ip forwarding
        ipv6 forwarding
        !
        line vty
      • ospfd.conf
      • こんなんでも動いているらしい
        hostname ospfd@<適当なホスト名>
        password zebra
        enable password zebra
        log file /var/log/quagga/ospfd.log
        !service password-encryption
        !
        router ospf
         ospf router-id <(自分の主たる) IP アドレス - 例えば 192.168.10.1 とか>
         redistribute kernel
         redistribute static
         redistribute connected
         network 0.0.0.0/0 area 0.0.0.0
        !
        line vty
    4. パーミッション
      ちょっとウルサイらしく debian.confdaemons の他は

      quagga 所有で 0640
      # cd /etc/quagga
      # chown quagga.quagga zebra.conf ospfd.conf
      # chmod 0640 *.conf
    5. 再起動と確認
      # /etc/init.d/quagga restart
      # # (しばらく待って...)
      # ip route ls
      10.6.36.0/24 via 172.27.193.1 dev wlan0  proto zebra  metric 20 
      172.27.202.0/24 dev br2  proto kernel  scope link  src 172.27.202.1 
      172.27.129.0/24 via 172.27.193.1 dev wlan0  proto zebra  metric 20 
      172.27.68.0/24 via 172.27.193.1 dev wlan0  proto zebra  metric 30 
      172.27.193.0/24 dev wlan0  proto kernel  scope link  src 172.27.193.17 
      172.27.201.0/24 dev br1  proto kernel  scope link  src 172.27.201.1 
      192.168.27.0/24 via 172.27.193.1 dev wlan0  proto zebra  metric 20 
      172.27.1.0/24 via 172.27.193.1 dev wlan0  proto zebra  metric 30 
      111.22.3.0/22 via 172.27.193.1 dev wlan0  proto zebra  metric 20 
      default via 172.27.193.1 dev wlan0 
      この proto zebra が quagga 経由。あるいは (なっがいけど)
      # telnet localhost ospfd
      Trying 127.0.0.1...
      Connected to localhost.
      Escape character is '^]'.
      
      Hello, this is Quagga (version 0.99.17).
      Copyright 1996-2005 Kunihiro Ishiguro, et al.
      
      
      User Access Verification
      
      Password: 
      ospfd@myhost> show ip ospf route
      ============ OSPF network routing table ============
      N    10.6.36.0/24          [20] area: 0.0.0.0
                                 via 172.27.193.1, wlan0
      N    172.27.129.0/24       [20] area: 0.0.0.0
                                 via 172.27.193.1, wlan0
      N    172.27.193.0/24       [10] area: 0.0.0.0
                                 directly attached to wlan0
      N    172.27.201.0/24       [10] area: 0.0.0.0
                                 directly attached to br1
      N    172.27.202.0/24       [10] area: 0.0.0.0
                                 directly attached to br2
      N    192.168.27.0/24       [20] area: 0.0.0.0
                                 via 172.27.193.1, wlan0
      N    111.22.3.0/22         [20] area: 0.0.0.0
                                 via 172.27.193.1, wlan0
      
      ============ OSPF router routing table =============
      R    172.27.129.1          [10] area: 0.0.0.0, ASBR
                                 via 172.27.193.1, wlan0
      
      ============ OSPF external routing table ===========
      N E1 172.27.1.0/24         [40] tag: 0
                                 via 172.27.193.1, wlan0
      N E1 172.27.68.0/24        [40] tag: 0
                                 via 172.27.193.1, wlan0
      ospfd@myhost> exit
      Connection closed by foreign host.
      とか
    いくつか。なんて最初に書いたけど遅くなっちゃったので、ここまで...