APUE에서
프로세스의 실제 사용자 ID와 실제 그룹 ID는 우리가 실제로 누구인지 식별합니다. 이 두 필드는 로그인 할 때 비밀번호 파일에 입력 한 것에서 가져옵니다. 일반적으로 로그인 세션 중에는이 값이 변경되지 않지만 수퍼 유저 프로세스가이를 변경할 수있는 방법이 있습니다.
수퍼 유저 프로세스가 프로세스의 실제 사용자 ID와 실제 그룹 ID를 변경하여 실제 사용자 ID와 실제 그룹 ID 간의 관계가 비밀번호 파일의 관계와 일치하지 않습니까? 예를 들어, 사용자 Tim
가 ocean
비밀번호 파일 당 그룹의 구성원이 아닌 경우 수퍼 유저 프로세스가 프로세스의 실제 사용자 ID 및 실제 그룹 ID를 각각 Tim
및 로 변경할 수 ocean
있습니까?
답변
예, 수퍼 유저 프로세스는 실제 사용자 ID와 실제 그룹 ID를 원하는 값으로 변경할 수 있습니다. 의 값 /etc/passwd
과는 /etc/shadow
값이 설정되어야하는 것에 대해 구성 아니라 가능한 값을 제한한다.
편집 # 1
login
파일 과 같은 프로그램 이 파일에서 값을 읽으므로 파일은 구성 파일 또는 입력 파일입니다. 프로그램이 무엇을 할 수 있는지에 대한 제약은 아닙니다. 수퍼 유저 프로세스는 커널에 값을 전달할 수 있으며 커널은 파일을 확인하지 않습니다.
프로그램은
setgid (54321);
setuid (12345);
그리고 id 중 어느 것도 파일에 언급되어 있지 않아도 작동합니다.
답변
비밀번호 파일 및 그룹 파일은 읽지 않으며 실제 사용자 ID 및 실제 그룹 ID를 설정하기 위해 로그인 프로세스에서만 읽습니다.
커널에는 이러한 파일을 언급하는 것이 없습니다. 로그인은 파일을 열고 처리하고 두 개의 ID를 설정해야합니다. 다른 곳에서 이러한 ID를 얻기 위해 다르게 작성 될 수 있습니다. 예를 들어 네트워크 데이터베이스에서.
기능이 CAP_SETUID 인 프로세스는이 ID를 설정할 수 있으며 root는이 기능을 갖습니다.
Unix의 보안 모델은 커널에서 부분적으로 구현되고 일부는 높은 기능 (예 : 루트)으로 실행되는 프로세스에서 구현됩니다.
주의 /etc/passwd
와 /etc/group
도 읽습니다 ls
, ps
그리고 요구 사항이 사용자 / 그룹 ID에서 /에 사용자 / 그룹 이름을 번역하는 것을 다른 프로그램. (이러한 세부 정보를 저장하는 다른 방법에 대해 알고있는 것보다 라이브러리를 통해이 작업을 수행 할 수 있습니다.)
답변
무엇보다도 /etc/passwd
사용자의 이름 을 사용자의 UID 로 변환하는 것이 목적입니다 . bob의 UID가 무엇인지 상관하지 않으면 해당 파일이 필요하지 않습니다. 임의의 UID / GID로 변경하려면 관련 syscall을 사용하십시오.
int setuid(uid_t uid);
int setgid(gid_t gid);
CAP_SETUID
및 CAP_SETGID
기능 (일반적으로 루트 프로세스에 있음)을 가진 권한있는 프로세스 는 다른 실행중인 프로세스의 프로세스가 아니라 고유 한 UID 및 GID 만 변경할 수 있습니다.