SELinuxと共に生きるためのTips。
(SFTPがよかったんじゃが諸事情)
要望
・GCP Cloud StoreageをGCEインスタンスにマウントして、指定ユーザー("ftp-user"とする)にFTP操作可能にさせたい
・ユーザーには /home 直下の情報をみせたくない
・ユーザーには /home/ftp-user/csv(マウント先)以下のみファイル操作可能にさせたい
結論
・FTPサーバ(vsftp)を立てて、Chrootするだけでは、GCSマウント先のデータ転送に失敗する
・SELinuxをDisableにすると、/home 直下が見れてしまう
・SELinuxを有効のまま、要件を満たすには、SELinuxのアクセス制御が必要
環境
OS
CentOS Linux release 7.8.2003 (Core) on GCP
Tools
gcsfuse version 0.28.1 (Go version go1.9.7)
vsftpd: version 3.0.2
手順
FTPサーバ構築
GCPにGCEインスタンスを立てて、FTPサーバを用意する
GCEちょい技 – FTPサーバを構築する
https://www.apps-gcp.com/gce-casual-knowhow-02/
※pasv_address=..**.**にGloacIPの追記が必要な点に注意
chroot環境設定
FTPユーザーのホーム以下をchroot環境に設定する
centos7のvsftpdでchroot環境を作る
https://qiita.com/mugi-tea/items/b6ee5d9127409667bc7c
GCSをマウント
gcsfuseインストール。
マウント設定をfstabに仕込んで、mount
で確認。
問題なければ、mount -a
。
vi /etc/fstab
[YOUR_STORAGE_NAME] [YOUR_MOUNT_DIR] gcsfuse implicit_dirs,user,rw,_netdev,allow_other,uid=100X,gid=100Y,dir_mode=0755,file_mode=0644,only_dir=[YOUR_STORAGE_PATH] 0 0
以下のように設定すると、hogeバケットの foo/bar パスのコンテンツを /home/ftp-user/bar にマウントできます。
Key | Value | 例 |
---|---|---|
[YOUR_STORAGE_NAME] | GCSバケット名 | hoge |
[YOUR_MOUNT_DIR] | GCE側マウントディレクトリ | /home/ftp-user/bar |
[YOUR_STORAGE_PATH] | GCSバケットのマウント対象パス | foo/bar |
gcsfuseコマンドのパラメータに迷ったら公式を参照。
GoogleCloudPlatform gcsfuse
https://github.com/GoogleCloudPlatform/gcsfuse/blob/master/docs/mounting.md
Mounting google storage bucket folder using gcsfuse
https://stackoverflow.com/questions/34390730/mounting-google-storage-bucket-folder-using-gcsfuse
SELinux 設定
課題
この時点でSELinuxが有効だと、FTPユーザーはマウントディレクトリが空に見える(データ転送に失敗している)
LinuxユーザーのパーミッションがFTPユーザーにひも付き、仮にマウントディレクトリを777にしても現象は解消しない。
SELinuxを無効にすると、マウントディレクトリの実体が見える…が 上位ディレクトリ /home の内容も見えてしまう。
対策
ポリシーの検索用にツールを入れる
yum install selinux-policy-devel selinux-policy-doc
sepolicy booleans -a | grep fuse
SELinuxは有効にした状態で、アクセス制御を変更する(再起動不要)
setsebool -P ssh_chroot_rw_homedirs on
setsebool -P ftpd_use_fusefs on
以上。
Many thanks (;
「SELinuxのせいで動かない」撲滅ガイド
https://qiita.com/yunano/items/857ab36faa0d695573dd
SELINUXが有効になっているサーバではvsftpdのデータ転送が使用できない
https://pentan.info/server/linux/selinux_vsftpd.html
CentOSとchrootの設定
http://nothing-titile.hatenablog.jp/entry/2014/08/24/005436
【SELinux】Boolean の仕組みと getsebool / setsebool コマンドの使い方
https://milestone-of-se.nesuke.com/sv-advanced/selinux/boolean-getsebool-setsebool/
gcs-fuseでマウントしたディレクトリをWebDAVで公開しようとしてハマった話
https://consulting.blog.rakumo.com/entry/20180426/gcsfuse-webdav