web-dev-qa-db-ja.com

rootとしてではなく、sudoなしでchroot jailでコマンドを実行する方法は?

最小限のchrootを設定していて、その中にSudoやsuが含まれないようにしながら、プロセスを非rootとして実行したいと考えています。 chrootを実行するとrootが必要になるため、これは少しトリックです。これを行うプログラムは次のようになります。

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

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


私は自分で転がした ここ

22
BCS

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

ちなみに、オプション '--userspec'は、gitリポジトリgit://git.sv.gnu.org/coreutils

24
kamae

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

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

18

カスタム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にし、お気に入りのユーザーを追加するカスタムグループが所有するようにします(「他の」アクセスは不可)。

9
jthill

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

8
Corey Henderson

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

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

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

2
mike510a