2011-07-04 3 views
3

setregid(real_gid, effective_gid)으로 루트 권한을 삭제하려고합니다. 둘 다 1000으로 설정되어 있지만 id 명령을 실행하면 그룹 목록에 루트가 있습니다! 어떻게 제거합니까? root (0)에서 해당 목록을 제거 -C/Linux : setgid는 그룹 목록에 루트를 남깁니다

+2

이것은 그룹 목록으로 프로그래밍하는 방법에 대한 정당한 질문입니다. 그것은 StackOverflow에 대한 오프 주제가 아닙니다. –

답변

6

root가 만드는 여러 그룹 중 하나 인 경우에는 번의 보조 그룹 목록을 조정 getgroups()setgroups()를 사용해야합니다. POSIX는 getgroups()을 지정하지만 setgroups()을 지정하지 않습니다.

당신은 아마이 유사한 코드를 사용하십시오 root 그룹은 리눅스에 0이지만, 그룹 0의 이름은 항상 root 아니라고

enum { MAX_AUX_GROUPS = 16 }; // Reasonable number 
enum { ROOT_GROUP  = 0 }; // Platform specific 

gid_t aux_groups[MAX_AUX_GROUPS]; 
int ngroups = getgroups(MAX_AUX_GROUPS, aux_groups); 
if (ngroups > 0) 
{ 
    int dst = 0; 
    for (int i = 0; i < ngroups; i++) 
    { 
     if (aux_groups[i] != ROOT_GROUP) 
      aux_groups[dst++] = aux_groups[i]; 
    } 
    ngroups = dst; 
} 
if (ngroups > 0) 
{ 
    if (setgroups(ngroups, aux_groups) != 0) 
     ...report error... 
} 

주 (예는 AIX에 systemwheel에있다 MacOS X), 모든 시스템이 그룹 root (AIX 나 MacOS X가 아닌)을 가지고있는 것은 아닙니다. 커널은 그룹 0이기 때문에 그룹 0에 특별한 권한을 부여하지 않습니다 (사용자 0에게는 특별한 권한을 부여하는 반면).

생략하려는 그룹을 찾아 코드를 일반화 할 수 있습니다. POSIX는 NGROUPS_MAX도 제공한다. MAX_AUX_GROUPS 대신이 값을 사용할 수 있습니다. 표준 페이지에서도 다음을 제안합니다 :

long ngroups_max = sysconf(_SC_NGROUPS_MAX) + 1; 
gid_t *group = (gid_t *)malloc(ngroups_max *sizeof(gid_t)); 
+0

덕분에 도와 줬습니다. :) – Daniel

+0

루트를 버리는 경우 거의 모든 ** 루트의 보충 그룹을 없애고 싶을뿐입니다. 단지'0 '이 아니라'getgroups'을 건너 뛰고 빈리스트를 'setgroups'. 또는 그룹 파일에서 대상 사용자의 보충 그룹을 설정하려면 정확하게 수행 할 수있는 (비표준이지만 전통적으로 사용 가능한)'initgroups' 함수가 있습니다. –

+0

@R .. : 좋은 지적. 일반 사용자가 6 개의 그룹에 속해 있고 setuid/setgid 프로그램이 상승 된 권한을 삭제하려는 경우 사용자의 6 개 그룹 만 남겨 두어야한다고 주장 할 수 있습니다. 물론, 사용자의 그룹 목록에는 처음에는 '루트'가 포함되어서는 안됩니다. 그래서 상황은 조금 불분명합니다. 'setgroups()'를 0 또는 1 그룹 (유효 그룹 ID,'getgroups()'이 유효 그룹 ID를 반환하는지 여부를 정의하는 구현)을 사용할 수있다. initgroups() 함수는 사용자 이름과 그룹 ID를 취하여 그룹 목록이 올바르게 설정되었는지 확인합니다. –

관련 문제