Chrootなディレクトリの外へリンクしたシンボリックリンクを置いて使えない時の対処法

2019年12月11日

sshでログインさせるユーザにそのディレクトリより上のディレクトを見れないように、そこをrootとして定義するのにChrootを使うと思う。その状態でChrootで定義されたルートディレクトリより上にある一部のディレクトリを別のユーザと共有するために、シンボリックリンクで参照させてもChrootな環境でログインしてるユーザにとってはシンボリックリンクに記述されたリンクのパスは存在しないのでアクセスできない。わかりやすく例えるなら以下のような状態。

以下が"/Var/www/html/"というディレクトリへのシンボリックリンクへのリンクだとする
/home/ChrootUsr/Web-dir

Chrootの設定がされたsshでログインしてるユーザからみれば"/ChrootUsr/"がルートディレクトリに見えるのでリンクを参照しても"/home/ChrootUsr/"直下に"Var/www/html/"を作ったりしてない限り存在しないディレクトリである。なので/Var/www/html/というディレクトリをシンボリックリンク経由で参照することができない。

mount –bindを使う

mountコマンドに–bindというオプションをつければフォルダを外部ストレージのような振る舞いで別のディレクトリにマウントできるようになる。リンクさせるわけではなくマウントなので、Chrootな環境のユーザでも参照可能になる。上記の例の状態なら

#マウント先のディレクトリを作っておく
mkdir /home/ChrootUsr/
#/var/www/html/を/home/ChrootUsr/Web-dir/にマウントさせる
mount --bind /var/www/html/ /home/ChrootUsr/Web-dir/

マウントできたら"/Var/www/html/"の中はChrootな環境のユーザでも見れる状態になってるはずなので試しにsshでログインしてみて"Web-dir/"の中を実際に確認してみると良い。

fstabに書く場合

PC立ち上げた時毎回上記操作をしたくなければこっち。

/var/www/html/ /home/ChrootUsr/Web-dir none bind 0 2