로그인 데몬을 작성하는 방법은 무엇입니까?

로그인 데몬을 작성하는 방법은 무엇입니까?

Stevens의 장과 같이 데몬을 올바르게 시작하는 단계에 대한 많은 가이드가 있습니다.UNIX 환경의 고급 프로그래밍. 데몬화 후에 어떤 단계를 수행해야 하는지에 대한 합의는 없지만 루트 프로세스에서 사용자 프로세스를 시작하는 또 다른 접근 방식이 취해집니다.

역사적으로 로그인 또는 telnetd 호출에 대한 세부 사항은 플랫폼마다 다릅니다. SSH 서버는 로그인 데몬의 현대적인 예입니다. 그러나 SSH 서버의 구현에 따라 올바른 단계에 대한 해석이 다르며, 이는 종종 각 플랫폼의 단계에 크게 의존합니다.

로그인을 제공하고 사용자 명령을 실행하기 위한 권한 및 컨텍스트를 설정하기 위해(아마도 원격 입력을 기반으로) 최신 데몬을 어떻게 작성해야 합니까?

답변1

소개하다

로그인을 제공하는 데몬의 기본 작업은 해당 시스템 사용자에 대한 올바른 컨텍스트에서 하나 이상의 명령을 실행하는 것입니다. 터미널 로그인에 대한 역사적 요구 사항과 플랫폼 간 프로세스 속성 및 자격 증명의 차이를 고려하면 이는 생각보다 어렵습니다. 올바른 설정을 보장하려면 다양한 단계의 순서를 정확하게 지정해야 합니다.

실제 사례

이것github 프로젝트netlogind이러한 데몬의 작동을 보여주는 간단한 테스트 애플리케이션입니다. 아래 나열된 단계를 설명합니다.

특정 사용자로 실행되는 프로세스를 만드는 기본 단계

struct passwd pw; //< the user
setgid(pw.pw_gid);
initgroups(pw.pw_name, pw.pw_gid);
setuid(pw.pw_uid);

(오류 검사를 수행해야 합니다.) 또한 보안에 매우 중요한 호출(예: setuid)의 경우 호출한 getuidgeteuid올바른 자격 증명이 설정되었는지 확인합니다. 잘못된 uid로 코드를 계속 실행하는 것은 최악의 재앙입니다. setuid이 기능을 지원하는 모든 플랫폼에서 저장된 설정 사용자 ID를 재설정합니다.

폴리아크릴아미드

PAM은 시스템 관리자가 애플리케이션이 인증을 수행하고 사용자 프로세스를 시작하는 방법을 구성할 수 있는 API입니다. PAM은 널리 배포됩니다.

pam_setcredPAM은 및 기능을 통해 세션 환경을 구축하는 데 사용됩니다 pam_open_session. 이러한 함수를 이식성 있게 호출하는 데에는 문제가 많으며 순서에 제한이 있습니다.

  • 인증을 수행하는 데 사용된 것과 동일한 실행 스레드에서 호출되어야 합니다 pam_authenticate. 일부 모듈은 인증 세션 중에 자격 증명을 수집하고 이를 사용하여 세션 단계에서 작업을 수행하는 방식으로 작동합니다(예: pam_mount). 특히, 내부적으로 사용되는 PAM 모듈은 다른 프로세스(예: 특정 버전 또는 "pam_krb5")에서 호출되는 경우 pam_set_data작동하지 않습니다 .pam_setcred/open_sessionpam_authenticatepam_afs
  • 루트라고 불러야 합니다.
  • initgroups추가 그룹 멤버십을 설정하는 데 사용될 수 있으므로 나중에 호출해야 합니다 .
  • pam_setcredpam_open_session어떤 명령을 호출해야 하는지 에 대한 논란이 있습니다. 대부분의 최신 플랫폼에서는 일부 모듈에서 이를 합리적으로 요구하므로 pam_setcred먼저 호출하는 것이 더 나은 것 같습니다 .pam_open_session[*]그러나 다르게 주문하고 싶은 이유가 있습니다.[*]어쨌든 가장 심각한 제한은 pam_setcred두 번째 모듈이 아닌 한 일부 모듈에서 Solaris 및 HP-UX PAM이 실패하므로 해당 플랫폼에서는 선택의 여지가 많지 않다는 것입니다(즉, 실제로 위에 기록된 순서를 따라야 합니다). LinuxPAM의 문서에는 OpenPAM의 문서와 달리 "pam_setcred가 먼저 와야 합니다"라고 나와 있습니다.
  • 분기에 따른 순서 pam_open_session/setcred: 두 PAM 함수 호출 사이에서 분기하지 마십시오 setuid. pam_limits호출 프로세스에 리소스 제한을 적용하면 루트는 대상 사용자가 실행할 수 있는 것보다 더 많은 프로세스를 실행할 가능성이 높으며, 이 경우 포크는 항상 실패합니다.
  • 주의해야 할 PAM 버그: 일부 공급업체 제공 모듈(예: HP-UX)은 appdata 매개변수를 대화 상자 기능에 전달하지 않습니다. 이식성을 위해 appdata 매개변수에 의존하지 않도록 정적 변수를 사용하세요. 기타 주목할만한 실제 호환성 문제:레드햇 #126985,레드햇 #127054, PAM_TTYSun 관련 문제(예:오픈SSH #687), ruid 제한 사항 pam_chauthtok(AIX에서는 ruid가 0이어야 하고 Solaris에서는 ruid가 0이 아니어야 함).

사용자 프로세스의 실행 환경 설정

closefrom

사용자 명령을 실행하기 전에 모든 fd를 닫으십시오. 이를 수행해야 하는지 여부는 논쟁의 여지가 있습니다. posix_trace예를 들어 다음과 같은 많은 구현이 종료되기 때문입니다. 때때로 악마화 단계 중 하나로 나열되지만 이는 매우 편집증적인 작업입니다. 그러나 사용자 세션을 생성할 때 이렇게 하는 것이 더 합리적입니다.

플랫폼:이 시스템은 Solaris와 FreeBSD에서 실행됩니다. 그렇지 않으면, 가능한 경우 나열된 fd를 사용하여 proc시뮬레이션하십시오 . getrlimit(RLIMIT_NOFILE)숫자가 너무 커서 반복할 수 없으므로 순진하게 가까이 접근하거나 유사하게 접근하려고 하지 마십시오 .

전화해 주세요:언제든지

또한보십시오: Austin Group Defect Tracker, "fdwalk 시스템 인터페이스 추가"

setlogin

setlogin(pw.pw_name)세션에 연결된 이름이 올바른지 확인하기 위해 호출됩니다 .

부르다:; 바로 뒤에는 setsid확실히 데몬이 실행 중인 동일한 세션이 아닙니다. 루트로 호출됩니다.

플랫폼:FreeBSD, 맥 OSX. uid에는 비밀번호 데이터베이스에 서로 다른 이름을 가진 여러 항목이 있을 수 있으므로 getpwuid(getuid())로그인에 사용된 사용자 이름을 알려주는 것이 불가능할 수 있으므로 getlogin이를 수행하려면 다른 기능을 제공해야 합니다. 구현은 utmp(신뢰할 수 없음) 또는 $LOGNAME(안전하지 않음) 측면에서 수행될 수 있습니다 . BSD 파생 시스템은 세션별 커널 데이터 구조에 사용자 이름을 저장하여 이상적인 방식으로 이 문제를 해결합니다. AIX는 usrinfo(아래)를 사용하여 이 문제를 해결했습니다.

usrinfo,setpcred

AIX에서는 usrinfo(SETUINFO, "LOGIN=<name>\0LOGNAME=<name>\0NAME=name\0", ...)기능적으로 setloginBSD 파생물과 유사합니다. 루트로 호출됩니다.

setpcred(pw.pw_name, NULL)사용자 데이터베이스의 자격 증명을 기반으로 프로세스 제한을 올바르게 설정하는 데 사용됩니다 .

환경 변수

$USER, $HOME, $PATH, $LOGNAME, $LOGIN(이전 버전, AIX)

선택과목: $MAIL,$TZ

기본값은 에 있을 수 있습니다 /etc/environment.

환경 변수에 대한 자세한 내용이 필요합니다! 편집해 주세요!

SELinux

Linux 시스템에서 하위 프로세스의 실행 컨텍스트를 설정하는 것은 PAM을 통해 수행하는 것이 가장 좋습니다. 그러나 PAM 구성에 관계없이 데몬의 권한이 사용자 프로세스에 적용되지 않도록 수동으로 설정할 수 있습니다. 이 경우에는 다음과 같이 설정됩니다.앞으로전화하세요 initgroups.

사용자 ID 검토

일부 Linux 커널에서 프로세스는 사용자가 사용자 ID를 전환할 때 유지되는 추가 사용자 ID인 auid를 유지 관리합니다 su(1). 이를 통해 수행된 작업을 기록하고 해당 작업을 수행한 사용자를 추적할 수 있습니다.

auid는 일반적으로 를 사용하여 설정됩니다 pam_loginid. PAM이 올바르게 구성되지 않은 경우에도 설정할 수 있도록 하려면 사용자의 uid 를 작성하십시오 /proc/self/loginuid.

추가 보기: "Linux 감사 시스템, 아니면 누가 파일을 변경했나요?", 라이너 비히만

솔라리스contract(4)

데몬에서 시작된 프로세스에 대한 새 계약을 만듭니다.

예를 참조하세요: "Solaris 10의 새 계약에서 하위 프로세스 생성", 플로리스 브루노그

setusercontext

login(1)이러한 작업 중 다수는 BSD 시스템의 libutil 로 구분됩니다 . 설명서를 참조하세요 setusercontext.

관련 정보