수퍼유저 프로세스가 비밀번호 파일의 내용과 일치하지 않고 프로세스의 실제 사용자 ID와 그룹 ID를 변경할 수 있습니까?

수퍼유저 프로세스가 비밀번호 파일의 내용과 일치하지 않고 프로세스의 실제 사용자 ID와 그룹 ID를 변경할 수 있습니까?

APUE에서

프로세스의 실제 사용자 ID와 실제 그룹 ID는 우리의 진정한 신원을 식별합니다. 이 두 필드는 로그인할 때 비밀번호 파일에 작성한 항목에서 가져옵니다. 일반적으로 이러한 값은 로그인 세션 중에 변경되지 않지만 여러 가지 방법이 있습니다. 이를 변경하는 수퍼유저 프로세스

수퍼유저 프로세스가 실제 사용자 ID와 실제 그룹 ID 간의 관계가 비밀번호 파일의 관계와 일치하지 않도록 프로세스의 실제 사용자 ID와 실제 그룹 ID를 변경할 수 있습니까? 예를 들어, 사용자가 비밀번호 파일의 그룹 구성원이 Tim아닌 경우 ocean수퍼유저 프로세스가 프로세스의 실제 사용자 ID와 실제 그룹 ID를 Tim및 로 변경할 수 있습니까 ocean?

답변1

예, 수퍼유저 프로세스는 실제 사용자 ID와 실제 그룹 ID를 원하는 값으로 변경할 수 있습니다. /etc/passwd및 의 값은 /etc/shadow값을 설정해야 하는 구성이지만 가능한 값에 대한 제한은 아닙니다.

편집 #1

즉, 이와 같은 프로그램은 login파일에서 값을 읽으므로 이러한 파일은 구성 파일 또는 입력 파일입니다. 프로그램이 수행할 수 있는 작업을 제한하지 않습니다. 수퍼유저 프로세스는 어떤 값이든 커널에 전달할 수 있으며 커널은 어떤 파일도 확인하지 않습니다.

프로그램이 호출할 수 있음

setgid (54321);
setuid (12345);

이 두 ID가 어떤 문서에도 언급되지 않은 경우에도 작동합니다.

답변2

비밀번호 파일과 그룹 파일은 읽히지 않으며, 실제 사용자 ID와 실제 그룹 ID를 설정하기 위해 로그인 프로세스에서만 읽혀집니다.

커널에는 이러한 파일이 언급되어 있지 않습니다. 로그인은 파일을 열고 처리한 후 두 ID를 모두 설정해야 합니다. 이러한 ID는 다른 쓰기 방식으로 다른 곳에서 얻을 수 있습니다. 예를 들어 웹 데이터베이스에서.

CAP_SETUID 기능이 있는 모든 프로세스는 이러한 ID를 설정할 수 있으며 루트에는 이 기능이 있습니다.

Unix의 보안 모델은 부분적으로 커널에서 구현되고 부분적으로는 향상된 기능(예: 루트)으로 실행되는 프로세스에서 구현됩니다.


사용자/그룹 이름을 사용자/그룹 ID로 변환해야 하는 다른 프로그램에서 및 읽을 수도 /etc/passwd있습니다 . /etc/group(이러한 세부 정보를 저장하는 다른 방법을 모르더라도 라이브러리를 통해 이 작업을 수행할 수 있습니다.)lsps

답변3

그 목적은 무엇보다도 /etc/passwd사용자의이름사용자에게사용자 ID. bob의 UID가 무엇인지 관심이 없다면 이 파일은 필요하지 않습니다. UID/GID로 변경하려면 관련 시스템 호출을 사용하세요.

int setuid(uid_t uid);
int setgid(gid_t gid);

CAP_SETUIDCAP_SETGID 능력일반적으로 루트 프로세스에 있는 루트 프로세스는 자신의 UID 및 GID만 변경할 수 있으며 실행 중인 다른 프로세스의 UID 및 GID는 변경할 수 없습니다.

답변4

나는 최근에 이 작업을 수행하기 위해 Linux 커널 모듈을 만들었습니다(https://github.com/xuancong84/chown-pid). 지금까지 이 작업을 수행할 수 있는 사용자 수준 프로그램은 없습니다.

커널 모듈을 빌드하여 cd프로젝트 폴더에 넣고 실행해야 합니다 make. 성공하면 생성됩니다 chown-pid.ko.

그 다음에,

insmod chown-pid.ko arg_pid=<PID> arg_gid=<UID> arg_act='set_uid' && rmmod chown-pid
insmod chown-pid.ko arg_pid=<PID> arg_gid=<GID> arg_act='set_gid' && rmmod chown-pid

관련 정보