Linux에서 사용자 권한이 어떻게 작동하는지 이해하려고합니다. 커널이 부팅되고 init
루트로 시작 됩니다. 그런 다음 Init은 시작 스크립트를 실행 하고 다시 루트로 getty
( agetty
)를 실행 합니다. Agetty는 단지 사용자 이름을 읽고 login
여전히 루트로 실행 한다고 생각합니다. 아직 흥미로운 것은 없습니다. 그러나 로그인 은 무엇을합니까? “로그인 시도”보다 더 나은 것을 찾을 수 없었습니다. 로그인에서 비밀번호가 일치하고 일반 사용자로 로그인하려고한다고 가정하면 사용자 ID는 어떻게 변경됩니까? 시스템 호출이 필요하다고 생각했지만 찾을 수 없었습니다.
또한 약 su
. su
‘setuid’비트가 설정되어 있으므로 실행할 때 항상 루트로 실행됩니다. 그러나 일반적인 사용자로 로그인하라는 메시지가 표시되면 다시 사용자 ID를 변경해야합니다. 동일한 “마법”이 발생 su
하거나 login
사용자를 변경해야 할 때 올바르게 이해하고 있습니까? 그렇다면 왜 두 개의 다른 프로그램이 있습니까? 로그인을 실행할 때 추가로 심각한 비즈니스가 발생합니까?
답변
로그인 프로그램의 기능에는 여러 부분이 있습니다. 로그인 프로그램은 로그인하려는 사용자와 상호 작용하는 방식이 다릅니다. 다음은 몇 가지 예입니다.
login
: 텍스트 터미널에서 입력을 읽습니다.su
: 이미 로그인 한 사용자가 호출하고 명령 줄 인수에서 대부분의 데이터와 터미널에서 인증 데이터 (암호)를 얻습니다.gksu
:와 비슷su
하지만 X에서 인증 데이터를 읽습니다.rlogind
: rlogin 프로토콜을 통해 TCP 연결을 통해 입력을 얻습니다.sshd
: SSH 프로토콜을 통해 TCP 연결을 통해 입력을 얻습니다.- X 디스플레이 관리자 (xdm, gdm, kdm,…) :와 비슷
login
하지만 X 디스플레이에서 입력 읽기
이 프로그램들은 비슷한 방식으로 작동합니다.
-
첫 번째 부분은 인증입니다 . 프로그램은 사용자의 입력을 읽고 사용자에게 로그인 권한이 있는지 여부를 결정합니다. 기존의 방법은 사용자 이름과 암호를 읽고 사용자가 시스템의 사용자 데이터베이스에 언급되어 있는지 확인합니다. 사용자가 입력 한 비밀번호는 데이터베이스의 비밀번호입니다. 그러나 다른 많은 가능성이 있습니다 (일회성 비밀번호, 생체 인증, 인증 전송 등).
-
사용자에게 로그인 권한과 계정이 설정되면 로그인 프로그램은 사용자의 권한을 설정합니다 (예 :이 세션에서 사용자가 속한 그룹).
-
로그인 프로그램은 계정 제한을 확인할 수도 있습니다. 예를 들어, 로그인 시간 또는 최대 로그인 사용자 수를 강제하거나 특정 연결에서 특정 사용자를 거부 할 수 있습니다.
-
마지막으로 로그인 프로그램은 사용자 세션을 설정합니다. 몇 가지 하위 단계가 있습니다.
- 프로세스 권한을 권한 부여에서 결정된 사용자, 그룹, 한계 등으로 설정 하십시오. 여기에서이 하위 단계의 간단한 예를 볼 수 있습니다 (사용자 및 그룹 만 처리 함). 기본적으로 로그인 프로그램은 여전히 루트로 실행 중이므로 최대 권한을 갖습니다. 먼저 루트 사용자 이외의 모든 권한을 제거하고 마지막으로
setuid
최소 권한을 삭제하도록 호출 합니다. - 사용자의 홈 디렉토리를 마운트하고 “메일이 있습니다”메시지 등을 표시합니다.
- 사용자로서 일부 프로그램을 호출하십시오 (일반적으로 사용자의 쉘 (
login
및 명령su
또는sshd
명령이 지정되지 않은 경우 X 디스플레이 관리자가 X 세션 관리자 또는 창 관리자를 호출 함)).
- 프로세스 권한을 권한 부여에서 결정된 사용자, 그룹, 한계 등으로 설정 하십시오. 여기에서이 하위 단계의 간단한 예를 볼 수 있습니다 (사용자 및 그룹 만 처리 함). 기본적으로 로그인 프로그램은 여전히 루트로 실행 중이므로 최대 권한을 갖습니다. 먼저 루트 사용자 이외의 모든 권한을 제거하고 마지막으로
오늘날 대부분의 유니스는 PAM (Pluggable Authentication Modules) 을 사용하여 로그인 서비스를 균일하게 관리합니다. PAM은 기능을 4 가지 부분 으로 나눕니다 . “auth”는 인증 (위의 1)과 인증 (위의 2)을 모두 포함합니다. “계정”과 “세션”은 위의 3과 4와 같습니다. 로그인에는 사용되지 않고 인증 토큰 (예 : 비밀번호)을 업데이트하는 데 사용되는“비밀번호”도 있습니다.
답변
찾고자하는 시스템 호출을 비슷한 것으로 setuid
하고, seteuid
실제로 변경하려는 사용자 ID의 변형에 따라 전체 헴 패밀리가 있지만.
setgid
프로세스가 실행되는 그룹을 변경하는 것과 같은 병렬 호출도 있습니다 .
답변
login
필요한 경우 루트 권한을 삭제합니다. 처음에 루트 권한이 필요한 많은 프로그램은 루트로 시작하여 필요한 작업을 수행 한 다음 일반 사용자 계정으로 드롭하여 누군가 바이너리에 버그를 사용하여 액세스 할 수 있다는 걱정을하지 않아도됩니다. 루트 쉘. login
당연히 특권을 더 오래 보유하지만 원칙은 같습니다.
실제로 루트 권한을 삭제하는 것은 매우 간단합니다. POSIX는 사용자 및 그룹 ID를 각각 변경하는 정의 setuid()
및 setgid()
기능을 제공합니다 (루트로 시작하는 경우 실제적이고 효과적 임). login
이 두뿐만 아니라, 호출 initgroups()
(이후 당신이 가질 수있는 추가 그룹 설정에 setgid
단지 기본 그룹 ID를 설정)
물론 프로세스의 UID / GID 변경을 실제로 처리하는 것은 커널입니다. Linux 커널 시스템 호출 구현을 어떻게 찾을 수 있습니까? syscall에 대해 많이 설명합니다. 내 커널 소스에는 다음이 있습니다.
#define __NR_setgid 144
__SYSCALL(__NR_setgid, sys_setgid)
#define __NR_setuid 146
__SYSCALL(__NR_setuid, sys_setuid)
144와 146은 내 컴퓨터의 해당 기능에 대한 시스템 호출 번호입니다
su
소스를 검사하여 그 기능 을 확인하지는 않았지만 exec()
동일한 방법을 사용하여 쉘을 호출 하기 직전에 루트 권한도 삭제한다고 생각합니다.