루트가 아닌 사용자가 TUN/TAP 인터페이스를 생성하도록 허용해야 하는 상황에 직면했습니다. CAP_NET_ADMIN 기능이 필요하다는 것을 알고 있습니다.
가 있었다다른 문제이에 대한 답변은 CAP_NET_ADMIN 기능을문서/프로그램, 사용자가 아닌. 제 경우에는 다음에 기능을 할당해야 합니다.사용자, 인터페이스를 생성하는 데 적합하다고 판단되는 모든 도구를 사용할 수 있습니다(즉, 인터페이스를 생성하는 데 사용된 특정 파일/프로그램에 국한되지 않음).
리눅스에서 이것이 가능합니까? 특히 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
프로그램을 디버깅하는 것이 여전히 어렵다는 것을 알 수 있습니다. 이는 함수를 사용하여 실행되는 프로그램은 해당 기능도 포함하는 프로그램에서만 디버깅할 수 있기 때문입니다.