PAM 없이 사용자를 인증하는 올바른 방법은 무엇입니까?

PAM 없이 사용자를 인증하는 올바른 방법은 무엇입니까?

내 관련 질문이 별로 사랑을 받지 못하는 것 같아서 여기에 또 다른 질문이 있습니다. 요즘 Linux에서 사용자 이름/비밀번호 프롬프트를 통해 사용자를 인증하는 적절한 방법은 무엇입니까?

원칙적으로는 사용자 이름과 비밀번호를 얻어야 하고, 에서 해당 사용자의 솔트와 해시를 읽어야 한다고 가정합니다 /etc/shadow. 그런 다음 주어진 비밀번호와 저장된 솔트의 해시를 계산하고 결과가 /etc/shadow.

일반적으로 이미 이 모든 작업을 수행하는 PAM(예: )을 통해 인증할 수 있지만 pam_unix내 애플리케이션은 사용자 정의 PAM 모듈이고 다른 PAM 모듈에서 하나의 PAM 모듈을 호출할 방법을 찾지 못했습니다. 이것이 가능하다면 기꺼이 이 솔루션을 선택하겠습니다.

현재로서는 정말 오래된 튜토리얼을 발견했습니다.http://www.tldp.org/HOWTO/Shadow-Password-HOWTO-8.html분명히 섀도우 지원이 아직 libc에 내장되지 않은 1996년부터였습니다. 인증을 위한 도우미 기능으로 pw_auth및 를 언급합니다 . 이것을 내 코드에 이식하고 섀도우 도구에 valid연결하려고 시도했지만 및 에 대해 '해결되지 않은 외부 참조' 오류가 발생합니다 . 코드는 다음과 같습니다.libshadow.apw_authvalid

if ((pw->pw_passwd && pw->pw_passwd[0] == '@'
     && pw_auth (pw->pw_passwd+1, pw->pw_name, PW_LOGIN, NULL))
    || !valid (passwd, pw)) {
    return (UPAP_AUTHNAK);
}

나는 이것을 더 자세히 확인하지 않았지만 어쨌든 이것은 Shadow-utils가 업데이트될 때마다 내 코드를 업데이트해야 하기 때문에 선호되는 솔루션이 아닙니다.

나는 오히려 인증을 제공하는 라이브러리(PAM이 아님)에 연결하고 싶습니다 /etc/shadow. 그런 게 있는데 제가 아직 못 찾았나요? 아니면 다른 해결책이 있나요?

답변1

Shadow-utils 업데이트에 대한 두려움은 IMO에 적합하지 않습니다. 해당 HOWTO에 설명된 루틴은 특별한 설치 없이 Ubuntu 12.04 및 Mint 17 시스템에서 사용할 수 있습니다.

/etc/shadowC 프로그램에서 정보를 읽는 구조는 에서 찾을 수 있으며 그 기능과 /usr/include/shadow.h함께 찾을 수 있습니다. 예 를 들어 에 정의된 이름으로 섀도우 비밀번호 항목을 찾으면 매뉴얼 페이지도 얻을 수 있습니다( ). 관련된 모든 기능.man 5 shadow/usr/include/shadow.hgetspnamman getspnam

이를 기반으로 특정 이름에 대한 해시된 비밀번호 항목을 얻을 수 있어야 합니다. 해시된 비밀번호에는 여러 개의 '$' 토큰이 있어야 하며, 해시된 비밀번호의 마지막 '$' 이후의 모든 항목을 잘라내고 이를 솔트로 제공 해야 합니다 crypt(). glibc 버전(에 따라 man 3 crypt)은 "확장된" 솔트를 처리할 수 있어야 합니다. 이는 요즘 더 일반적인 SHA512 항목을 나타냅니다.

관련 정보