rakumoコンサルティング部 Tech Blog

GCPの構築ノウハウをそろりと公開 コンサル部によるテックブログ

gcs-fuseでマウントしたディレクトリをWebDAVで公開しようとしてハマった話

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

これで SELinux が有効なまま、WebDAV で無事にアクセスできるようになりました。