로그인 및 su 내부


11

Linux에서 사용자 권한이 어떻게 작동하는지 이해하려고합니다. 커널이 부팅되고 init루트로 시작 됩니다. 그런 다음 Init은 시작 스크립트를 실행 하고 다시 루트로 getty( agetty)를 실행 합니다. Agetty는 단지 사용자 이름을 읽고 login여전히 루트로 실행 한다고 생각합니다. 아직 흥미로운 것은 없습니다. 그러나 로그인 은 무엇을합니까? "로그인 시도"보다 더 나은 것을 찾을 수 없었습니다. 로그인에서 비밀번호가 일치하고 일반 사용자로 로그인하려고한다고 가정하면 사용자 ID는 어떻게 변경됩니까? 시스템 호출이 필요하다고 생각했지만 찾을 수 없었습니다.


또한 약 su. su'setuid'비트가 설정되어 있으므로 실행할 때 항상 루트로 실행됩니다. 그러나 일반적인 사용자로 로그인하라는 메시지가 표시되면 다시 사용자 ID를 변경해야합니다. 동일한 "마법"이 발생 su하거나 login사용자를 변경해야 할 때 올바르게 이해하고 있습니까? 그렇다면 왜 두 개의 다른 프로그램이 있습니까? 로그인을 실행할 때 추가로 심각한 비즈니스가 발생합니까?

답변:


9

로그인 프로그램의 기능에는 여러 부분이 있습니다. 로그인 프로그램은 로그인하려는 사용자와 상호 작용하는 방식이 다릅니다. 다음은 몇 가지 예입니다.

  • login: 텍스트 터미널에서 입력을 읽습니다.
  • su: 이미 로그인 한 사용자가 호출하고 명령 줄 인수에서 대부분의 데이터와 터미널에서 인증 데이터 (암호)를 얻습니다.
  • gksu:와 비슷 su하지만 X에서 인증 데이터를 읽습니다.
  • rlogind: rlogin 프로토콜을 통해 TCP 연결을 통해 입력을 얻습니다.
  • sshd: SSH 프로토콜을 통해 TCP 연결을 통해 입력을 얻습니다.
  • X 디스플레이 관리자 (xdm, gdm, kdm,…) :와 비슷 login하지만 X 디스플레이에서 입력 읽기

이 프로그램들은 비슷한 방식으로 작동합니다.

  1. 첫 번째 부분은 인증입니다 . 프로그램은 사용자의 입력을 읽고 사용자에게 로그인 권한이 있는지 여부를 결정합니다. 기존의 방법은 사용자 이름과 암호를 읽고 사용자가 시스템의 사용자 데이터베이스에 언급되어 있는지 확인합니다. 사용자가 입력 한 비밀번호는 데이터베이스의 비밀번호입니다. 그러나 다른 많은 가능성이 있습니다 (일회성 비밀번호, 생체 인증, 인증 전송 등).

  2. 사용자에게 로그인 권한과 계정이 설정되면 로그인 프로그램은 사용자의 권한을 설정합니다 (예 :이 세션에서 사용자가 속한 그룹).

  3. 로그인 프로그램은 계정 제한을 확인할 수도 있습니다. 예를 들어, 로그인 시간 또는 최대 로그인 사용자 수를 강제하거나 특정 연결에서 특정 사용자를 거부 할 수 있습니다.

  4. 마지막으로 로그인 프로그램은 사용자 세션을 설정합니다. 몇 가지 하위 단계가 있습니다.

    1. 프로세스 권한을 권한 부여에서 결정된 사용자, 그룹, 한계 등으로 설정 하십시오. 여기에서이 하위 단계의 간단한 예를 볼 수 있습니다 (사용자 및 그룹 만 처리 함). 기본적으로 로그인 프로그램은 여전히 ​​루트로 실행 중이므로 최대 권한을 갖습니다. 먼저 루트 사용자 이외의 모든 권한을 제거하고 마지막으로 setuid최소 권한을 삭제하도록 호출 합니다.
    2. 사용자의 홈 디렉토리를 마운트하고 "메일이 있습니다"메시지 등을 표시합니다.
    3. 사용자로서 일부 프로그램을 호출하십시오 (일반적으로 사용자의 쉘 ​​( login및 명령 su또는 sshd명령이 지정되지 않은 경우 X 디스플레이 관리자가 X 세션 관리자 또는 창 관리자를 호출 함)).

오늘날 대부분의 유니스는 PAM (Pluggable Authentication Modules) 을 사용하여 로그인 서비스를 균일하게 관리합니다. PAM은 기능을 4 가지 부분 으로 나눕니다 . "auth"는 인증 (위의 1)과 인증 (위의 2)을 모두 포함합니다. "계정"과 "세션"은 위의 3과 4와 같습니다. 로그인에는 사용되지 않고 인증 토큰 (예 : 비밀번호)을 업데이트하는 데 사용되는“비밀번호”도 있습니다.


4

찾고자하는 시스템 호출을 비슷한 것으로 setuid하고, seteuid실제로 변경하려는 사용자 ID의 변형에 따라 전체 헴 패밀리가 있지만.

setgid프로세스가 실행되는 그룹을 변경하는 것과 같은 병렬 호출도 있습니다 .


4

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()동일한 방법을 사용하여 쉘을 호출 하기 직전에 루트 권한도 삭제한다고 생각합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.