最小限のchrootを設定していて、その中にSudoやsuが含まれないようにしながら、プロセスを非rootとして実行したいと考えています。 chrootを実行するとrootが必要になるため、これは少しトリックです。これを行うプログラムは次のようになります。
uid = LookupUser(args[username]) // no /etc/passwd in jail
chroot(args[newroot])
cd("/")
setuids(uid)
execve(args[exe:])
それは私の最善の策ですか、それともそれを行う標準的なツールはありますか?
私は自分で転がした ここ :
ルートからchroot
を呼び出す場合、chroot
オプション --userspec=USER:GROUP
は、非ルートUID/GIDでコマンドを実行します。
ちなみに、オプション '--userspec'は、gitリポジトリgit://git.sv.gnu.org/coreutils
。
fakechroot を fakeroot と組み合わせると、これを実行できます。これらは、実行中のすべてのプログラムを、まるでルートとしてchrootで実行されているかのように動作させますが、実際にはあなたと同じように実行されます。
fakechrootのmanページ も参照してください。
カスタムchrooterを書くのはそれほど難しくありません:
#define _BSD_SOURCE
#include <stdio.h>
#include <unistd.h>
const char newroot[]="/path/to/chroot";
int main(int c, char **v, char **e) {
int rc; const char *m;
if ( (m="chdir" ,rc=chdir(newroot)) == 0
&& (m="chroot",rc=chroot(newroot)) == 0
&& (m="setuid",rc=setuid(getuid())) == 0 )
m="execve", execve(v[1],v+2,e);
perror(m);
return 1;
}
そのsetuidをrootにし、お気に入りのユーザーを追加するカスタムグループが所有するようにします(「他の」アクセスは不可)。
Linuxの機能を利用して、rootでなくてもバイナリにchroot()を呼び出せるようにすることができます。例として、これをchroot
バイナリに対して実行できます。非ルートとして、通常はこれを取得します:
$ chroot /tmp/
chroot: cannot change root directory to /tmp/: Operation not permitted
しかし、setcap
コマンドを実行した後:
Sudo setcap cap_sys_chroot+ep /usr/sbin/chroot
これにより、chroot呼び出しを行うことができます。
これをシステムのchroot
に対して行うことはお勧めしません。代わりに独自のプログラムに対して行い、chrootを呼び出すことをお勧めします。こうすることで、何が起こっているかをより詳細に制御でき、呼び出し後にcap_sys_chroot特権を削除することもできるので、プログラムでchrootを連続して呼び出すと失敗します。
Linuxコンテナーを使用して、まったく異なる名前空間(IPC、ファイルシステム、さらにはネットワーク)にあるchroot環境を作成できます。
イメージベースのコンテナーの作成を管理し、非特権ユーザーとして実行するように構成できるLXDもあります。そのため、信頼できないコードがなんとかしてコンテナーをエスケープした場合、非特権ユーザーとしてのみコードを実行できます。システムのルートではありません。
お気に入りの検索エンジンで「Linuxコンテナ」と「LXD」を検索します;)