사용자 식별자

위키백과, 우리 모두의 백과사전.

유닉스 계열 운영체제의 커널은 사용자를 식별할 때 사용자 식별자(약자: UID, User ID)라 불리는 양의 정수를 사용한다. UID로 사용되는 정수의 범위는 시스템에 따라 상이하다. UID는 최소한 다음과 같은 제약하의 15비트 정수(0부터 32767)로 표현된다.

  • UID 0은 항상 슈퍼유저다.
  • 전통적으로 nobody 사용자에게는 가장 큰 UID가 할당된다(15비트 정수의 경우 32767).
  • 관례적으로 1에서 100까지는 시스템 용도로 예약되어있다. 레드헷 엔터프라이즈 리눅스의 경우 101에서 499까지, 데비안의 경우 999까지 시스템 용도로 예약하는 것을 권장한다.

어떤 UID에 해당하는 사용자는 /etc/password에서 찾을 수 있다. 쉐도우 페스워드 파일과 네트워크 정보 서비스 또한 사용자를 UID로 참조한다. UID는 또한 유닉스 파일 시스템프로세스에서도 사용된다. 일부 운영체제들은 16비트 UID를 지원해 65,536개의 숫자를 UID로 사용할 수 있게 해준다. 32비트 UID를 사용하는 현대 운영체제들에서는 232(= 4,294,967,296)개의 UID 값들을 지원한다.

POSIX 호환 환경에서는 id 명령줄 프로그램을 통해 사용자의 UID 및 사용자 이름, 주그룹, 그룹 식별자 등을 찾을 수 있다.

유효 사용자 식별자[편집]

어떤 프로세스가 생성한 파일의 소유자는 그 프로세스의 유효 사용자 식별자(effective user ID, euid)로 정해진다. 커널과 마운트 옵션에 따라 유효 GID(egid) 또한 파일 생성에 영향을 주기도 한다. BSD 유닉스에서는 새 파일의 소유 그룹은 무조건적으로 해당 파일이 소속된 디렉토리의 소유 그룹으로 정해진다. 이에 반해 AT&T 시스템 5 유닉스에서는 새 파일의 소유 그룹은 일반적으로 파일을 만든 프로세스의 유효 GID로 정해진다. 그리고 어떤 파일 시스템들은 마운트시에 BSD나 AT&T 방식 중 어떤 방식을 따를지 선택하게 해준다.

파일에 접근시 커널은 프로세스의 유효 UID와 GID를 통해 파일 접근을 허용할지 말지를 결정한다.

저장된 사용자 식별자[편집]

높은 권한을 가진 UID로 실행 중인 프로그램이 더 낮은 권한의 UID로 작업을 해야할 때는 저장된 사용자 식별자(saved user ID, suid) 기능을 사용한다. 어떤 프로세스가 유효 UID를 바꾸면, 바꾸기 전의 유효 UID는 해당 프로세스의 저장된 UID 슬롯에 복사된다. 바뀐 유효 UID로 작업을 완료하면, 프로세스는 다시 유효 UID를 저장된 UID값으로 교체해서 원래 권한으로 돌아갈 수 있다. 유효 UID의 권한이 낮은 경우 프로세스는 실제 사용자나 저장된 UID로 밖에 유효 UID를 바꿀 수 없기 때문에 다시 높은 권한의 UID로 돌아가기 위해선 저장된 UID 기능이 반드시 필요하다.

실제 사용자 식별자[편집]

프로세스의 실제 소유자는 실제 UID(real UID, ruid)와 실제 GID(real GID, rgid)로 정해지고, 프로세스간 시그널 전송에 영향을 준다. 슈퍼유저가 아닌 권한으로 실행중인 프로세스가 다른 프로세스에 시그널을 보내기 위해서는 시그널을 보내는 프로세스의 실제 혹은 유효 UID가 시그널을 받는 프로세스의 실제 혹은 저장된 UID와 같아야 한다.[1] 자식 프로세스는 부모 프로세스로부터 자격증명을 이어받기 때문에 상호간의 시그널 전송이 가능하다.

파일 시스템 사용자 식별자[편집]

리눅스에는 파일 시스템 접근 제어 용도로 사용되는 파일 시스템 사용자 ID(file system user ID, fsuid)가 있다. 프로세스가 특별히 바꾸지 않는한 euid와 동일하다. 또한 프로세스의 ruidsuid, euid가 루트(root)가 아닌 이상 루트의 UID를 가질 수 없다.

Fsuid는 프로그램의 시그널 권한에 영향을 주지 않으면서 다른 권한으로 파일 시스템을 접근할 수 있도록 허용하기 위해서 생겨났다. 예를 들어 NFS 서버 등에서 사용된다. 커널 2.0 이후 리눅스는 SUSv3 시그널 전송 규칙을 따르기 때문에 더이상 fsuid가 필요치 않지만 하위 호환성 유지를 위해 여전히 지원된다.[1]

같이 보기[편집]

참고자료[편집]

  1. Kerrisk, Michael. The Linux Programming Interface. No Starch Press, 2010, p. 171.