setuid(2)

#include <sys/types.h>
#include <unistd.h>

int setuid(uid_t uid);

setuid(2)함수는 실행중인 프로세스 내에서 effective user id를 변경하는 함수입니다

.

root 계정으로 실행하는 프로그램이 setuid(2)함수를 호출하여 다른 user id로 설정하면 프로세스의 real user id와 effective user id 모두 변경이 됩니다.

 

일반 계정으로 프로그램을 실행시에 내부에서 setuid(2)로 다른 계정으로 effective user id를 변경하려고 하면 일반적으로 변경되지 않습니다. 이유는 다른 계정의 권한을 획득할 수 있으면 권한 관리 체계에 문제가 발생하기 때문입니다.

다만 명령어에 set-user-id bit가 설정된 경우 즉, 명령어에 rwsr-xr-x와 같이 s권한으로 설정된 명령어를 owner 아닌 계정으로 실행을 하면 effective user id와 read user id가 다른 경우가 발생합니다. 이 때, effective user id를 real user id나 set-user-id로 설정된 user로 변경하는 것만 가능합니다. (참고: LINUX real user vs. effective user의 차이점 )

 

 

파라미터

uid
    - 변경하고자 하는 effective user id
    - root 계정은 어떤 user id든 설정할 수 있습니다.
    - 일반 계정은 effective user id와 real user id로만 변경 가능합니다.

 

RETURN

0
    - 정상적으로 처리 완료되었습니다.


-1
    - 오류가 발생하였으며, 오류내용은 errno에 설정됩니다.
   
  EAGAIN : 현재 user id와 uid가 일치하지 않거나 실행가능하는 process 수 제한에 걸린 경우
  EPERM  : 권한이 없거나 uid와 real user id 또는 set-user-id 계정가 일치하지 않습니다.

 


활용 예제

 

Sample). effective user id를 변경했다가 다시 원복하는 예제

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>

int main(int argc, char **argv)
{
    uid_t ruid;
    uid_t euid;
    
    ruid = getuid();
    euid = geteuid();
    
    setuid(ruid);
    //......
    
    setuid(euid);
    //......
    
    return 0;
}

위의 Sample의 경우 컴파일된 프로그램에 chmod u+s 권한을 부여 후에 프로그램의 소유자와 다른 계정으로 실행했을 때에 적용됩니다.

 


see also :  사용자 및 그룹 관련 Library  

 

블로그 이미지

사용자 자연&사람

행복한 개발자 programmer since 1995.

댓글을 달아 주세요