Fedora Core 3 で WebDAV/Subversion を使おう

動機

よし、Subversion を使ってみるか…と思い、Fedora Core 3 の評価もかねてインストールしてみました。

そもそもの目的は、Eclipse の Subclipse でのバージョン管理なのですが(move/rename がしたかったんです)、 Fedora Core 3 では FSFS レポジトリが利用できる Subversion 1.1 でパッケージが作ってあったので、ついでに Fedora Core 3 も試してみようと思った次第です。
が、SELinux が有効の状態では、レポジトリに対する書き込みができないため、すんなりと使うことができませんでした。 せっかくの SELinux を無効にするのももったいないと思い、SELinux のポリシーを作って使えるようにしてみました。
Subversion を使わなくても、WebDAV を利用しようと思ったら同じような作業が必要になると思いますので、参考にしてください。

SELinux の設定に関しては、 日本SELinuxユーザー会準備委員会 のメーリングリストで様々なアドバイスをいただきました。
また、 Fedora Project 内の Understanding and Customizing the Apache HTTP SELinux Policy も、まだβ版のドキュメントですが目を通しておいたほうが良いと思います。

WebDAV/Subversion の設定

前提として、比較的導入の容易な targeted ポリシーでの SELinux の運用を考えます。 また、カスタマイズはしていない状態での説明となります。

まずは WebDAV が動くようにしておかなければなりません。 基本的には、通常の WebDAV の設定と何ら変わりませんので詳しい設定方法に関しては省略して最低限の設定のみの説明になりますが、 日本語のファイル名を扱う場合には、mod_encoding を導入しておいたほうが良いと思います。 mod_encoding 等が必要な場合には Fedora Core 3 用のパッケージを 「和彦さんちの yum レポジトリ」 に置いていますのでご利用ください。

さて、WebDAV/Subversion を使うための最低限の設定ですが、 ここでは /home/svnroot をレポジトリ領域として Subversion を設定し、 http://SERVER_NAME/svn/repos で利用できるような設定とします。

導入の容易な targeted ポリシーとはいえ、 初期の状態では apache から WebDAV 領域へのアクセスができないため WebDAV を利用できません。 しかし、selinux-policy-targeted-1.17.30-2.34 からは apache に関する制限もゆるくなったため、 標準の状態でもポリシーの変更なしに利用できるようになりました。
そこで、まずは selinux-policy-targeted を最新の状態に更新します。yum コマンドを使って、

# yum -y update selinux-policy-targeted

として最新バージョンにバージョンアップします。
次に、WebDAV/Subversion 関連のパッケージですが、これに関しても yum コマンドを使って、

# yum -y install mod_dav_svn

のようにインストールします(必要なものも一括してインストールされます)。

Subversion のリポジトリの作成は、

# svnadmin create --fs-type=fsfs /home/svnroot
# htpasswd -cm /home/svnroot/.htpasswd test
# chown -R apache:apache /home/svnroot
# chcon -R system_u:object_r:httpd_sys_content_t /home/svnroot

とします(BDB リポジトリを利用したい場合には、オプションの指定を変更してください)。
この chcon コマンドにより、Subversion のレポジトリにラベル(SELinux の属性)を設定しますので、忘れずに実行してください。

最後に、WebDAV の設定を行います。設定ファイルは、/etc/httpd/conf.d/subversion.conf ですので、 コメントを消して設定を有効にします。

□ /etc/httpd/conf.d/subversion.conf
LoadModule dav_svn_module     modules/mod_dav_svn.so
LoadModule authz_svn_module   modules/mod_authz_svn.so

#
# Example configuration to enable HTTP access for a Subversion
# repository, "/home/svnroot".  This repository must be readable
# and writable by the 'apache' user.
#

<Location /svn/repos>
   DAV svn
   SVNPath /home/svnroot

   # Limit write permission to list of valid users.
   <LimitExcept GET PROPFIND OPTIONS REPORT>
      # Require SSL connection for password protection.
      # SSLRequireSSL

      AuthType Basic
      AuthName "Authorization Realm"
      AuthUserFile /home/svnroot/.htpasswd
      Require valid-user
   </LimitExcept>
</Location>

これで一通りの設定は完了です。httpd を再起動しましょう。

# service httpd restart

ブラウザから、http://SERVER_NAME/svn/repos にアクセスしたり、 TortoiseSVNEclipseSubclipse で実際に操作をしてみて、期待通りに動作するかテストをしてください。

より安全に使いたい場合

上記の方法は手軽に WebDAV を利用する方法ですが、逆にいうと httpd の制限がゆるくなったからできたことなので、 より安全に利用するには SELinux の設定を変更しなければなりません。

SELinux では、「 Conditional policy extension 」という仕組みがあり、 ポリシーを直接編集しなくても制限範囲をカスタマイズすることができます。
そこで、まずはコンテンツ周りへの書込みを禁止します。 下記の通り、setsebool コマンドを実行し /etc/selinux/targeted/booleans 中の赤字の部分を修正します。

# setsebool httpd_unified 0
□ /etc/selinux/targeted/booleans
httpd_enable_cgi=1
httpd_enable_homedirs=1
httpd_ssi_exec=1
named_write_master_zones=0
httpd_unified=0
httpd_tty_comm=0
詳しくは、 Understanding and Customizing the Apache HTTP SELinux Policy8.1. Simple Customization を参考にしてください。
また、この設定をすることによって「手軽さ」はなくなりますし、今まで動いていたものが動かなくなることもあります。

これで、コンテンツ周りの書込みができなくなりましたので、当然 WebDAV での書き込みもできません。 そこで、WebDAV 用にポリシーを追加します。

WebDAV 用のポリシーの追加

SELinux のポリシーはバイナリファイルなので直接変更することはできません。そこで「ポリシーソースパッケージ」をインストールすることになります。 以下のコマンドを実行してポリシーソースをインストールしてください。

# yum -y install selinux-policy-targeted-sources

これで、/etc/selinux/targeted/src というディレクトリにソースファイルがインストールされましたので、WebDAV 用のポリシーを追加します。

編集するファイルは、2つです。以下のとおり設定を追加してください。

□ /etc/selinux/targeted/src/policy/domains/program/apache.te の最後に追加
# for WebDAV
type httpd_dav_content_t, file_type, sysadmfile;
create_dir_file(httpd_t, httpd_dav_content_t)
□ /etc/selinux/targeted/src/policy/file_contexts/program/apache.fc の最後に追加
# for WebDAV
/home/svnroot(/.+)? system_u:object_r:httpd_dav_content_t

apache.fc については、赤字のパス名 の部分に WebDAV 用の領域(Subversion ではレポジトリ領域)を記述することになります。 この部分が違っていると正常に動作しませんので注意してください。

設定ファイルを書き換えたら、バイナリファイルに変換して設定を有効にするために、以下のコマンドを実行してください。

# cd /etc/selinux/targeted/src/policy
# make clean
# make reload
# restorecon -R /home/svnroot

ここまでの作業が完了したら、正常にアクセスできるかどうかテストに移ります。

動作のテスト

一通りのインストール&設定が済んだら、テストをする前に一時的に SELinux を無効にします。

# setenforce 0

として setenforce コマンドを実行すればOKです。
この状態では、SELinux としての動作はしませんのでアクセス自体はできますが、 ポリシー違反があった場合には /var/log/messages にログが残ります。 もし、ポリシー違反が記録されていた場合には、どこかに設定ミスがあったことが考えられますので、 作業内容を確認してください。
一通りのテストをして、ポリシー違反がないことが確認できたら、

# setenforce 1

として、実際に SELinux を有効にして最終確認をし、問題がなければ念のためにリブートしましょう。

ちなみに、今回はポリシー違反は記録されないと思いますが、 ポリシーのデバッグをする場合にはそのログを参考に apache.te の allow の設定を追加していきます。 具体的には、

# audit2allow -d -l

として表示される内容を元にポリシーを追加していくことになります。 なお、設定ファイルを変更したら、忘れずに、

# make reload
# restorecon -R /home/svnroot

を実行してラベルも更新するのを忘れないでください。

SELinux 関連のパッケージの更新について

今回のように、ポリシーを追加することによって様々なアプリケーションを利用できるようになりますが、 SELinux 関連のパッケージ(selinux-policy-targeted や selinux-policy-targeted-sources など)を更新すると設定がなくなってしまいます。
今回の場合、apache.te.rpmsave, apache.fc.rpmsave のように .rpmsave というファイルにバックアップが残っていますので、

# find /etc/selinux/targeted/src/policy/ -name '*.rpm*'

のように find コマンドを利用して変更されたファイルを確認して、再設定をしてください。


Presented by Kazuhiko Iwama.