非 root ユーザーが TUN/TAP インターフェースを生成できるようにする

非 root ユーザーが TUN/TAP インターフェースを生成できるようにする

非rootユーザーがTUN / TAPインターフェースを生成できるようにする必要がある状況に直面しました。 CAP_NET_ADMIN機能が必要であることを知っています。

があったその他の問題これに対する答えはCAP_NET_ADMIN機能です文書/プログラム、ユーザーではありません。私の場合は、次に機能を割り当てる必要があります。ユーザー、インターフェイスを作成するのに適していると判断されたすべてのツールを使用できます(つまり、インターフェイスを生成するために使用される特定のファイル/プログラムに限定されません)。

Linuxでこれは可能ですか?特にUbuntu 22.04を使用しています。

コンテキストでは、その理由は、システムコールを実行するカスタムプログラムを介してTUNインターフェースを生成しており、デバッグ中に機能する必要があるためです。デバッガは実行されるたびに新しいバイナリを構築するため、ルートに切り替えてバイナリに機能を割り当ててからデバッグバイナリに戻すことはできません。

答え1

ラッパーの一部のファイル機能では、環境機能セット()を使用できますwrapper.c

#include <stdlib.h>
#include <stdio.h>
#include <sys/capability.h>
#include <unistd.h>

#define SHELL "/bin/bash"

char *const args[] = { SHELL, NULL };

int main(int argc, char **argv) {
  cap_iab_t iab = cap_iab_get_proc();
  if (cap_iab_set_vector(iab, CAP_IAB_AMB, CAP_SYS_ADMIN, CAP_SET)) {
    perror("not able to raise bit");
    exit(1);
  }
  if (cap_iab_set_proc(iab)) {
    perror("unable to set iab bit");
    exit(1);
  }
  execv(SHELL, args);
  perror("execv failed");
  exit(1);
}

$USERWANTEDこれを実行できるようにしたいユーザーのユーザー名の場合:

$ gcc -o wrapper wrapper.c -lcap
$ sudo chown $USERWANTED wrapper
$ sudo chmod go-wx wrapper
$ sudo setcap "cap_sys_admin,cap_setpcap=pe" wrapper

$USERWANTEDその行のため、対応するバイナリのみを実行できますchmod。これを行うと、wrapperプログラムは Ambient 機能を追加し、シェルを実行します。その子には次のCAP_SYS_ADMIN機能があります。

$ sudo -u $USERWANTED
$ exec ./wrapper
$ capsh --print|grep Current
Current: cap_sys_admin=eip
Current IAB: ^cap_sys_admin

プログラムをデバッグすることはまだ難しいことがわかります。これは、関数を使用して実行されるプログラムは、その機能も含むプログラムでのみデバッグできるためです。

関連情報