사용자 정의 PAM 세션에서 사용자를 올바르게 인증하는 방법이 있습니까?
나는 현재 사용자가 외부 토큰을 통해 로그인할 수 있도록 하는 자체 PAM 인증 모듈을 작성 중입니다. 이 토큰은 사용자가 내 모듈을 사용하여 로그인하기 전에 생성되어야 합니다. 따라서 토큰이 없으면 기본 PAM 인증으로 돌아가서 사용자가 인증되는 즉시 내 코드를 계속 사용하고 싶습니다.
이것이 가능한가? 의사코드에서 내 모듈은 다음과 같습니다.
pam_sm_authenticate() {
if (first_login) {
code_copied_from_pam_unix_to_authenticate_user();
// do something else here?
} else {
custom_auth();
}
}
빠른 수정으로 Linux pam_unix 모듈의 코드를 내 모듈에 복사했고 제대로 작동했습니다. 그러나 이는 추가 라이브러리가 많이 필요하고 pam_unix가 변경되지 않는 경우에만 작동하므로 그다지 만족스럽지 않습니다. 내 세션 내에서 다른 PAM 세션을 열고 싶지만 아직 작동하지 않았습니다.
답변1
코드가 모든 논리를 수행하도록 두지 마세요. 먼저 PAM과 해당 구성을 사용하여 모듈이 최적의 조건에서 실행되는지 확인하세요(즉, pam_unix
코드를 복제할 필요가 없음).
먼저, 귀하의 모듈에 대한 또 다른 의사 코드를 제안하겠습니다:
pam_sm_authenticate() {
if (first_login) return PAM_CRED_INSUFFICIENT;
else custom_auth();
}
여기 내 생각엔처음 로그인자격 증명이 부족한 경우입니다. 나는 PAM에게 사용자를 완전히 인증하는 데 필요한 모든 것이 없기 때문에 모듈이 실패했다고 말했습니다. 이제 모듈이 호출된다고 가정하면 my_module
가능한 구성은 다음과 같습니다.
auth [cred_insufficient=ok success=done default=2] my_module.so
auth [success=ok default=1] pam_unix.so
auth sufficient my_module.so
auth requisite pam_deny.so
세부사항은 다음과 같습니다:
먼저 요청이
my_module
. 여기에는 몇 가지 가능성이 있습니다.- 첫 번째 로그인: 모듈이 을 반환합니다
PAM_CRED_INSUFFICIENT
. 이 사건은포착PAM(pass)을 통해 , 이 경우 체인을 성공( )cred_insufficient
으로 표시하도록 구성되지만 ,ok
계속 가. - 이것은 첫 번째 로그인이 아닙니다. 귀하가 로그인했고
custom_auth()
성공했습니다(반환됨PAM_SUCCESS
). 이 경우 체인(done
)을 종료합니다.액세스 권한 부여. - 이번이 처음 로그인하는 것이 아니고,
custom_auth()
좋은 결과를 얻지 못하고 있습니다(PAM_AUTH_ERR
또는 다른 종류의 내부 오류). 이 경우 다음 2줄(default=2
)을 건너뛰세요. 체인은 직접 진행되지만pam_deny
항상 실패합니다.접근 불가.
- 첫 번째 로그인: 모듈이 을 반환합니다
첫 번째 장면에서 체인은 계속됩니다
pam_unix
. 여기에는 두 가지 가능성이 있습니다.- UNIX 인증에 성공했습니다. 이는 체인의 성공을 표시합니다(
ok
).다음 모듈로 이동. - UNIX 인증에 실패했습니다. 다음 모듈(
default=1
)을 건너뛰면 체인은 다음으로 끝납니다pam_deny
.접근 불가.
- UNIX 인증에 성공했습니다. 이는 체인의 성공을 표시합니다(
세 번째 줄에 도달하면 첫 번째가
my_module
끝났고 성공한 것입니다. 귀하의 모듈은 again() 으로 호출됩니다. 다시 두 가지 가능성이 있습니다.PAM_CRED_INSUFFICIENT
pam_unix
// do something else here?
sufficient
- 이번에는 모듈이 성공합니다.액세스 권한 부여.
- 모듈이 다시 실패했지만 자격 증명 부족 이외의 다른 이유로 인해:접근 불가.
사용자 정의 코드를 실행할 수도 있습니다.UNIX 인증 후, 실패하더라도. 이렇게 하려면 두 번째 줄을 다음과 같이 변경하세요.
auth [success=ok default=bad] pam_unix.so
my_module
그럼에도 불구하고 이로 인해 체인이 한 번 더 통과하게 되지만 체인은 다음과 같이 표시됩니다.실패. 모듈이 결국 여기에서 성공하더라도 체인은 실패할 것입니다.
체인에서 호출한 횟수를 모듈이 알기를 원할 수도 있습니다. 즉, 첫 번째 호출 my_module
과 두 번째 호출을 구별합니다. 이는 매개변수를 통해 쉽게 수행할 수 있습니다.
auth [cred_insufficient=ok success=done default=2] my_module.so
auth [success=ok default=1] pam_unix.so
auth sufficient my_module.so second_time
auth requisite pam_deny.so
여기서 두 번째 호출에는 ( 및 를 통해 ) 도움이 되는 pam_sm_authenticate
인수가 전달됩니다.argv
argc
위치런타임 체인의 모듈. 물론 firstLogin
그러한 구별을 하려면 조건이 충분해야 합니다.