22

最小限のchrootを設定していて、sudoまたはsuが含まれないようにしたいのですが、それでもプロセスを非rootとして実行します。これは、chrootrequiersrootを実行するためのちょっとしたトリックです。これを行うプログラムを作成すると、次のようになります。

uid = LookupUser(args[username])  // no /etc/passwd in jail
chroot(args[newroot])
cd("/")
setuids(uid)
execve(args[exe:])

それが私の最善の策ですか、それとも私のためにそれを行う標準的なツールがありますか?


私はここで自分自身を転がしました:

4

6 に答える 6

26

ルートから呼び出す場合chrootchrootオプション--userspec=USER:GROUPは非ルートUID/GIDでコマンドを実行します。

ちなみに、オプション'--userspec'は、gitリポジトリによるとcoreutils-7.5で最初に導入されましたgit://git.sv.gnu.org/coreutils

于 2011-07-19T12:43:24.367 に答える
19

fakechrootは、 fakerootと組み合わせて、これを行うことができます。実行中のすべてのプログラムは、rootとしてchrootで実行されているかのように動作しますが、実際にはあなたと同じように実行されます。

fakechrootのmanページも参照してください。

于 2010-09-17T20:25:30.203 に答える
10

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を連続して呼び出すことは失敗します。

于 2011-07-20T14:40:18.423 に答える
9

カスタム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;
}

そのsetuidrootを作成し、お気に入りのユーザーを追加するカスタムグループが所有するようにします(「他の」アクセスは不可)。

于 2013-05-12T01:41:28.797 に答える
2

Linuxコンテナを使用して、まったく異なる名前空間(IPC、filesytem、さらにはネットワーク)にあるchroot環境を作成できます。

イメージベースのコンテナーの作成を管理し、非特権ユーザーとして実行するように構成できるLXDもあります。これにより、信頼できないコードが何らかの方法でコンテナーをエスケープできた場合、非特権ユーザーとしてのみコードを実行できます。システムのルートとしてではありません。

お気に入りの検索エンジンで「LinuxContainers」と「LXD」を検索します;)

于 2017-02-18T12:26:53.680 に答える
1
于 2021-03-26T10:53:45.690 に答える