리눅스 시스템에서는 사용자 계정에 따라 사용자 ID를 부여하여 관리합니다. 사용자 ID는 정수 값이며 사용자를 구분하기 위한 값입니다. 리눅스 시스템은 사용자가 로긴하면 해당 사용자 계정에 대응하는 사용자 ID를 실제 사용자 ID(Real User ID)라고 부르고 프로세스가 수행할 때 권한은 유효 사용자 ID(Effective User ID)에 따릅니다.
일반적으로 로긴한 사용자 계정의 권한은 프로세스 수행할 때의 권한과 일치합니다. 이는 대부분 실제 사용자 ID와 유효 사용자 ID는 같다는 거입니다. 그런데 set user id bit를 설정한 프로그램을 실행할 때는 실제 사용자 ID와 유효 사용자 ID가 일치하지 않을 수 있습니다. 이 때는 해당 프로그램 소유자 계정과 대응하는 사용자 ID가 유효 사용자 ID입니다.
이는 일부 프로그램을 동작할 때 수행 권한이 일반 사용자 권한이 아닌 관리자 권한으로 동작할 수 있게 하기 위해서입니다.
또한 리눅스 시스템에서는 프로그램이 동작 중에 유효 사용자 ID를 변경하는 기능을 제공하고 있습니다.
출처 - http://ehpub.co.kr/%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%8B%9C%EC%8A%A4%ED%85%9C-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-8-1-%EC%8B%A4%EC%A0%9C-%EC%82%AC%EC%9A%A9%EC%9E%90-idreal-user-id%EC%99%80-%EC%9C%A0%ED%9A%A8/
커널은 프로세스마다 네 가지 번호를 부여한다. 실제 UID(RUID)와 유효 UID(EUID), 실제 GID(RGID),유효 GID(EGID)의 네가지이다. “실제(Real)” 번호들은 계정 관리를 위해서 사용되고 “유효(Effective)” 번호들은 접근 권한을 결정할 목적으로 사용된다. 보통 경우에는 실제 번호와 유효 번호가 동일하다. 프로세스의 소유자는 프로세스에게 시그널을 보낼 수 도 있고 프로세스의 스케쥴링 우선권을 낮출 수도 있다.
정상적이라면 프로세스는 자신에게 부여된 네가지 소유권 신임장을 바꿀 수 없지만 유효 사용자 번호와 유효 그룹 번호를 바꿀 수 있는 특별한 상황이 존재한다. 다른 프로그램 파일을 실행하고 싶은 프로세스는 exec 시스템 콜 가족 중의 하나를 호출한다. 이런 상황이 발생했을 때 새로운 프로그램의 이미지를 담고 있는 파일의 "setuid"나 "setgid" 허가 비트가 설정되어 있다면 프로그램의 유효 UID와GID는 실행되는 파일의 UID와 GID로 설정된다. exec는 /bin/passwd와 같은 프로그램들이 수퍼유저의 특권을 잠시 빌리기 위해서 사용하는 방법이다(passwd는 /etc/passwd를 수정하기 위하여이런 특권이 필요하다).
출처 - http://blog.naver.com/wooya510/60010145231
파일의 실행 권한과 관련된 내용입니다.
리얼 유저 아이디, 즉 uid는 실제로 파일을 실행하는 유저의 아이디를 가리키며 이펙티브 유저 아이디, euid는 실행 될 때의 유저 아이디를 가리킵니다.
그리고 프로그램이 실행될 때 다른 파일에 접근 권한 같은 것은 euid에 따라 결정됩니다.
일반적으로는 uid와 euid가 동일합니다만 특수한 경우들이 있습니다.
예를 들어 패스워드 변경할 때 쓰는 프로그램인 passwd를 보겠습니다.
passwd 프로그램은 사용자의 패스워드를 받아서 /etc/passwd 혹은 /etc/shadow를 고치게 되는데 보시면 이 파일들은 root만이 접근 가능하게 되어 있습니다.
만약 passwd를 실행하여 일반 유저 계정의 패스워드를 새로 입력했는데 일반적인 경우라면 uid와 euid가 동일하므로 이 passwd 프로그램은 역시 일반 유저 권한으로 실행이 될 테고 /etc밑의 파일은 root 권한이 필요하므로 실행은 실패하게 될 것입니다.
하지만 passwd 프로그램은 setuid라는 설정이 되어 있어서(ls -l로 보았을 때 실행권한(x로 표시되는)이 s로 된 경우) 실행될 때의 euid는 늘 root가 되게 됩니다. 일반 유저가 실행해도 root가 실행하는 것처럼 되는 것입니다.
다른 예로 C를 아신다면 다음과 같은 프로그램을 짜서 테스트 해보시기 바랍니다.
main()
{
printf("getuid : %d\n", getuid());
printf("geteuid : %d\n", geteuid());
}
그리고 컴파일 한 후 실행파일에 chmod u+s a.out 을 해 줍니다.
그냥 실행하면 uid와 euid가 동일하게 나오지만 다른 유저로 실행하면 uid와 euid가 다르게 나올 것입니다.
이 때 uid가 리얼 유저 아이디, euid가 이펙티브 유저 아이디가 됩니다. 실제 실행시킨 유저와 실행시 어떤 유저의 영향력을 가지는가의 차이라고 보시면 되겠습니다.
:: 네이버 지식in 中
출처 - http://bupung.tistory.com/m/post/52
'System > Linux' 카테고리의 다른 글
clock, date, rdate, ntpdate (0) | 2011.08.22 |
---|---|
linux - grep, egrep, fgrep (0) | 2011.08.05 |
리눅스 환경에서 C 프로그래밍 (0) | 2011.02.10 |
[이만용의 Open Mind] 프로그래밍 지형도를 바꾸는「파이썬」 (0) | 2011.02.07 |
linux - 정규 표현식 (0) | 2011.02.06 |