
Linux 커널은 UID와 GID를 어떻게 처리합니까?
시스템에 사용자를 추가하려고 할 때 커널은 해당 사용자에 대해 일종의 "등록"(시스템 호출?)을 요구합니까? 커널은 /etc/passwd에서 어떤 사용자가 사용 가능한지 신경 쓰나요, 아니면 파일 내용과 관계없이 값만 알고 처리하나요?
답변1
커널에서 사용자 또는 그룹은 프로세스가 파일(UID/GID 및 권한 비트가 있는 파일)을 읽을 수 있는지(실제로 열기(2)) 확인하기 위해 프로세스에 첨부된 숫자(UID 및 GID)일 뿐입니다. 이 목적) 및 기타 작업(예: 프로세스가 동일한 UID에 속한 프로세스를 조작할 수 있음). 호출 프로세스의 UID/GID를 변경하는 시스템 호출이 있습니다(setuid(2)/setgid(2) 등). 분명히 누가 사용할 수 있는지에 대한 엄격한 제한이 있습니다.
시스템은 이 번호를 사용하여 /etc/passwd, /etc/group 또는 기타 여러 메커니즘(LDAP, NIS 등)에서 이름을 조회할 수 있지만 이는 엄격하게 사람이 사용하는 것입니다.
로그인하고 사용자 이름을 제공하면 프로그램(루트로 실행되므로 일반 사용자가 수행할 수 없는 많은 작업을 수행할 수 있음)이 사용자 이름을 가져와 UID를 조회합니다(해당 사용자가 먼저) 비밀번호(또는 기타 인증)를 입력하고 확인하세요. 모든 것이 순조롭게 진행되면 프로그램은 해당 UID/GID로 변경되고 사용자 쉘은 exec(2)됩니다(다시 말하지만 이는 일반 프로그램일 뿐이며 시작할 특정 프로그램은 사용자 계정 설명의 일부입니다).
답변2
커널은 상관하지 않습니다 /etc/passwd
. 모든 인증이 /etc/passwd
파일을 사용하여 수행되는 것은 아닙니다. 예를 들어 사용자 정보는 NIS 또는 LDAP에서 가져올 수 있습니다.
답변3
당신이 찾고 있는 수표는 acl_permission_check()
다음 위치에 있습니다.fs/namei.c
. 단순히 파일에 있는 값과 시스템 호출을 하는 사용자의 원래 사용자 및 그룹 ID 값을 확인합니다.인덱스 노드.
일반 POSIX 파일 시스템의 경우 전체 호출 경로는 다음과 같습니다.
open(2)
→sys_open()
→do_sys_open()
→do_filp_open()
→finish_open()
→may_open()
→inode_permission()
→generic_permission()
→acl_permission_check()
다른 파일 시스템 유형(예: FAT)의 경우 inode 누락, 권한 비트 등으로 인해 호출 체인이 다를 수 있습니다.
커널은 사용자 ID와 그룹 ID가 어디서 왔는지, 실제 값이 무엇인지 신경 쓰지 않습니다.