rakumoコンサルティング部の小山(@koyhoge)です。
弊社のお客様で、WebDAV サーバのバックエンドとしてGoogle Cloud Storage(GCS)を検討したいという方がいて、こちらでもいろいろ調査を行ったのですが、その時にハマった事を書いておきます。
GCSをファイルシステムとしてマウントするgcs-fuse
GCSのバケット通常のファイルシステムとしてマウントするにはgcs-fuse というツールを使います。ユーザ空間で動作するファイルシステム FUSE の上で GCS APIを呼び出して、あたかも GCS バケットがローカルシステムにマウントされているかのように見せかけるわけですね。
Cloud Storage FUSE | Cloud Storage ドキュメント | Google Cloud
gcs-fuse のインストールは詳しく書きませんが、上記の記事を参照して下さい。
このブログでも以前に id:ksueki が解説とベンチマークの記事を書いています。
gcsfuse をインストールしたら、/etc/fstab に以下のようなエントリを追加して
gcs-backet /mnt/gcsfuse gcsfuse rw,allow_other,file_mode=777,dir_mode=777,key_file=/root/credentials/gcs-access-key.json
以下のコマンドを実行すれば、無事に /mnt/gcsfuse に目的のバケットがマウントされるわけです。
$ sudo mount /mnt/gcsfuse
SELinux の制限でハマる
さて上でマウントされた /mnt/gcsfuse を WebDAV で公開しようと Apache httpd の設定ファイルとして /etc/httpd/conf.d/gcsfuse.conf を追加しました。
Alias /dav/ "/mnt/gcsfuse/" <IfModule mod_dav.c> DAVMinTimeout 600 <Location /dav> DAV On EnableSendfile off AuthType Basic AuthName "Login WebDAV" AuthUserFile "/etc/httpd/conf/.htpasswd" Require valid-user </Location> </IfModule>
ところが httpd を再起動して WebDAV クライアントでつないでみてもアクセスできません。httpd は応答を返しているのでDAVの設定が間違っているように思われました。
結論から言えば、これは SELinux の制限によるものでした。fuse でマウントしたディレクトリをhttpd で公開するなんてことは通常あまり行われないので、標準状態では対応していないわけですね。
SELinux が有効なままなんとかする
そこで SELinux を Permissive モードにしたり Disable したりするのは簡単ですが、正しいやり方を探ってみたくなりました。
まずは httpd からアクセス制限かけられているファイルがどういう状態になっているか確認します。
$ cd /mnt/gcsfuse $ ls -Z drwxrwxrwx. root root system_u:object_r:fusefs_t:s0 coldline-folder drwxrwxrwx. root root system_u:object_r:fusefs_t:s0 nearline-folder drwxrwxrwx. root root system_u:object_r:fusefs_t:s0 tmp1 drwxrwxrwx. root root system_u:object_r:fusefs_t:s0 tmp2
fuse でマウントしたファイルは fusefs_t というタイプを持っているようです。
SELinux のポリシーを調べるには sepolicy コマンドを使います。環境にインストールされていなかったので yum でインストールします。
$ sudo yum install selinux-policy-devel selinux-policy-doc
httpd に関する設定がスイッチでまとめられているようなので、それをリストアップします。
$ sepolicy booleans -a | grep httpd <略> httpd_use_fusefs=_("Allow httpd to access FUSE file systems") <略>
httpd_use_fusefs というそのものズバリそうな設定が見つかりました。
現在値を確認すると案の定 off になっています。
$ getsebool httpd_use_fusefs
httpd_use_fusefs --> off
これを on にしてやればよさそうです。それには setsebool コマンドを使いますが -P をつけて再起動しても有効にしましょう。
$ sudo setsebool -P httpd_use_fusefs on
値を再度確認するときちんと on になっていました。
$ getsebool httpd_use_fusefs
httpd_use_fusefs --> on