jailing を golang に移植した
なぜ golang に移植したかというとまあ以下のような理由です。
https://github.com/tokuhirom/jailingo/
- capabilities で制御したかった
- jailing は perl で記述されているために、setuid/setcap などで制御することが難しい
- 今時 suid-perl 使うのもなあ、という。
- C で書くと getopt の処理とかだるい
- C++ で書くと、ビルドとかで悩むのがめんどい
- golang は segv しにくくて楽
golang で記述することにより、良い面もあるが一方で、普通に golang で記述すると、clone() したあとに処理を挟むことができないので、CLONE_NEWPID | CLONE_NEWNS
とかしたあとに mount したいという要望が叶えられない。ので、いったん /proc/self/exec を実行しなおして、procfs をマウントしてから子プロセスを起動する、みたいな処理が必要になってしまう。ちょっと面倒。
と、一応書いてみたが、実際には proot を利用しているのだった。
↑↑ 結局、proot 遅すぎたので jailingo 使うようにした。