SETUID(2)

이름
setuid - 사용자 identity를 설정한다.

사용법
#include <unistd.h>

int setuid(uid_t uid)

설명
setuid는 현재 프로세스의 유효 사용자 ID를 설정한다. 호출한 프로세스의 유효 사용자 ID가 루트라면, 실제 사용자 ID와 저장된(saved) 사용자 ID 또한 설정된다.

리눅스에서, setuid는 _POSIX_SAVED_IDS 특징를 갖는 POSIX 버전에 맞게 구현된다. 이는 (루트 이외) setuid 프로그램이 해당 사용자의 권한 모두를 버리고, 특권없는 작업을 수행한 뒤, 안전한 방법으로 다시 원래의 유효 사용자 ID로 돌아오도록한다.

만일 사용자가 루트이거나 프로그램이 setuid 루트라면, 각별한 주의가 필요하다. setuid 함수는 호출한 프로세스의 유효 uid를 검사하여 만일 슈퍼유저라면 해당 사용자 ID의 모든 프로세스를 uid로 설정한다. 이후 프로그램은 다시 루트 권한을 얻는 것은 불가능하다.

그래서, 일시적으로 루트 권한을 버리고, 루트가 아닌 사용자의 권한을 갖고 수행된 후 다시 루트 권한을 회복하려하는 setuid-root 프로그램은 setuid를 사용할 수 없다. 이렇게 하기 위해서는 (non-POSIX, BSD) seteuid를 사용할 수 있다.

반환값
성공시, 0이 리턴된다. 에러이면, -1이 리턴되며, errno 는 적당한 값으로 설정된다.

에러

EPERM
    사용자가 슈퍼 유저가 아니며, uid가 호출한 프로세스의 유효 또는 저장된 사용자 ID와 일치하지 않는다.

호환
SVr4, SVID, POSIX.1. 실제사용자 ID, 저장된 사용자 ID, 유효 사용자 ID 모두를 설정하는 4.4BSD 함수와 전혀 호환되지 않는다. SVr4에서는 EINVAL 에러 조건을 추가적으로 기술하고 있다.

리눅스-특징적인 사항
리눅스에는 파일시스템 사용자 ID의 개념이 있으며, 이는 대개 유효 사용자 ID와 같다. setuid 시스템 콜은 또한 현재 프로세스의 파일 시스템 사용자 ID를 설정한다. setfsuid(2)를 보아라.

만일 uid가 이전 유효 uid와 다르다면, 프로세스는 코어 덤프를 하지 못한다.

관련 항목
getuid(2), setreuid(2), seteuid(2), setfsuid(2)

역자
정강훈 <skyeyes@soback.kornet.net>, 2000년 4월 27일