프로세스 드 이관을 통해 권한 setuid()및 setgid()uid가 / GID가 설정의 그룹 구성원을 상속하지 않는 것.
권한있는 포트를 열려면 루트로 실행해야하는 서버 프로세스가 있습니다. 특정 행 그것은 그 역 이관 후에 비 privilleged UID / GID, 1 - 예를 들어, 사용자의 fooUID (73). 사용자 foo는 그룹의 구성원입니다 bar.
> cat /etc/group | grep bar
bar:x:54:foo
따라서로 로그인하면 다음 특성을 가진 foo파일 /test.txt을 읽을 수 있습니다 .
> ls -l /test.txt
-rw-r----- 1 root bar 10 Mar 8 16:22 /test.txt
그러나 std=gnu99루트를 실행할 때 다음 C 프로그램 (compile ) :
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
int main (void) {
setgid(73);
setuid(73);
int fd = open("/test.txt", O_RDONLY);
fprintf(stderr,"%d\n", fd);
return 0;
}
항상 권한 거부가보고 됩니다. 나는 이것이 비 로그인 프로세스와 관련이 있다고 생각하지만 권한이 작동하는 방식과 같은 종류의 햄스트링입니다.
1. 서버에 자주 사용되는 SOP인데, 아파치와 함께하는 누군가 의 보고서 를 찾았을 때이 문제를 해결할 방법이 있어야한다고 생각합니다. 아파치가 오디오 그룹에 추가되어 사운드 시스템을 사용할 수 있습니다. 물론 이것은 원래 프로세스가 아닌 포크에서 발생할 수 있지만 실제로는 내 상황에서 동일합니다 (setuid 호출 후 포크되는 하위 프로세스입니다).
setgid(54)대신 setgid(73)(에서 /etc/groups와 같이 그룹 bar에 gid 54가 있음) 대신 사용 하면 작동합니까?
setuid()흠 ... 난 당신이 할 수있는 생각, 당신이 그것을 다시 후 ...하지만 seteuid()...
setuid()/setgid()통화를 전환하십시오 .