
내 관련 질문이 별로 사랑을 받지 못하는 것 같아서 여기에 또 다른 질문이 있습니다. 요즘 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.a
pw_auth
valid
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/shadow
C 프로그램에서 정보를 읽는 구조는 에서 찾을 수 있으며 그 기능과 /usr/include/shadow.h
함께 찾을 수 있습니다. 예 를 들어 에 정의된 이름으로 섀도우 비밀번호 항목을 찾으면 매뉴얼 페이지도 얻을 수 있습니다( ). 관련된 모든 기능.man 5 shadow
/usr/include/shadow.h
getspnam
man getspnam
이를 기반으로 특정 이름에 대한 해시된 비밀번호 항목을 얻을 수 있어야 합니다. 해시된 비밀번호에는 여러 개의 '$' 토큰이 있어야 하며, 해시된 비밀번호의 마지막 '$' 이후의 모든 항목을 잘라내고 이를 솔트로 제공 해야 합니다 crypt()
. glibc 버전(에 따라 man 3 crypt
)은 "확장된" 솔트를 처리할 수 있어야 합니다. 이는 요즘 더 일반적인 SHA512 항목을 나타냅니다.