2012-09-18 3 views
0

에 setgid를하고 setuid를 호출 한 후 그룹에 속하는 파일에 액세스 할 수있는 것은 새 그룹 및 사용자를 추가하고 video나는 리눅스

$ sudo addgroup --system mydaemon 
$ sudo adduser --system --no-create-home --ingroup mydaemon mydaemon 
$ sudo adduser mydaemon video 

파일을 생성하고 루트 소유자를 변경 시스템 그룹에 추가하고 있습니다

$ touch video0 
$ sudo chown root:video video0 
$ sudo chmod 0660 video0 

video에 그룹 지금 setgid()setuid()

/* perms.c */ 
#include <stdio.h> 
#include <stdlib.h> 
#include <errno.h> 
#include <fcntl.h> 
#include <pwd.h> 
#include <grp.h> 


int main(int argc, char const *argv[]) 
{ 
    int ret; 
    int gid; 
    int uid; 
    struct passwd *pw; 
    struct group *gr; 

    pw = getpwnam("mydaemon"); 
    if (pw) { 
     ret = setgid(pw->pw_gid); 
     if (ret < 0) { 
      printf("error with setgid\n"); 
      exit(1); 
     } 

     ret = setuid(pw->pw_uid);  
     if (ret < 0) { 
      printf("error with setuid\n"); 
      exit(1); 
     } 
    } 

    pw = getpwuid(getuid()); 
    gr = getgrgid(getgid()); 

    printf("gid: %d gr_name: %s\n", gr->gr_gid, gr->gr_name); 
    printf("uid: %d user_name: %s\n", pw->pw_uid, pw->pw_name); 

    ret = open("video0", O_RDWR); 

    printf("open status: %d (errno %d)\n", ret, errno); 

    return 0; 
} 
0을 사용하여 C로 작성된 간단한 응용 프로그램을 고려 컴파일 후

우리는 일반 사용자로 실행할 수 있습니다 :

$ sudo -u mydaemon ./perms 
gid: 126 gr_name: mydaemon 
uid: 116 user_name: mydaemon 
open status: 3 (errno 0) 

좋아, 내가 할 수있는 : 우리는 그래서 mydaemon로 직접 실행 setgid를 할 수있는 권한이 없기 때문에

$ ./perms 
error with setgid 

그것은 실패 setgidsetuid (나는 동일한 사용자 임) 예상대로 파일을 열 수 있습니다.

이제 루트로 실행하십시오.

내가 setgidsetuid, getgidgetuid을 할 수
$ sudo ./perms 
gid: 126 gr_name: mydaemon 
uid: 116 user_name: mydaemon 
open status: -1 (errno 13) 

내가 mydaemon 로 실행 해요하지만 난 파일을 열 질수 있다고 말한다. (errno 13은 EACCES : 허가가 거부되었습니다)

어디에 문제가 있습니까?

+0

데몬에서 장치 노드를 통계하고 struct stat의 st_mode 필드에 액세스하여 읽기/쓰기 권한이 있는지 확인할 수 있습니까? (자세한 내용은 man 2 stat를 참조하십시오.) – shinymetal

+0

* "나는 지금 내가 접근 할 수 있어야한다고 생각했다."* - 아마 잘못된 가정 일 것입니다. * setuid() *의 리턴 코드는 성공 또는 실패 여부를 확인해야합니다. – sawdust

+0

질문을 약간 편집했습니다. 아마도 더 많은 정보가있을 것입니다. – Honza

답변

2

그룹 데이터베이스에 따라 그룹을 초기화하려면 initgroups() 호출을 사용해야합니다.