PAM 세션 내에서 외부적으로 사용자 인증/PAM 세션 내의 PAM 세션

PAM 세션 내에서 외부적으로 사용자 인증/PAM 세션 내의 PAM 세션

사용자 정의 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. 여기에는 여러 가지 가능성이 있습니다.

    1. 첫 번째 로그인: 모듈이 반환되었습니다 PAM_CRED_INSUFFICIENT. 이 사건은잡았다PAM에 의해( 을 통해 cred_insufficient), 이 경우 체인을 성공으로 표시하도록 구성되지만( ok)계속 가.
    2. 이번 로그인은 첫 번째 로그인이 아니며, 로그인 custom_auth()에 성공했습니다(반환됨 PAM_SUCCESS). 이 경우 체인( )을 끝냅니다 done.액세스 권한이 부여됨.
    3. 이번이 첫 번째 로그인이 아니어서 custom_auth()잘 끝나지 않았습니다( PAM_AUTH_ERR또는 다른 종류의 내부 오류). 이 경우 다음 2줄( default=2)을 건너뛰세요. 체인은 바로 로 들어가는데 pam_deny항상 실패합니다.접근 불가.
  • 첫 번째 시나리오에서는 체인이 pam_unix. 여기에는 두 가지 가능성이 있습니다.

    1. UNIX 인증이 성공했습니다. 이는 체인을 성공( ok) 으로 표시하고다음 모듈로 넘어갑니다.
    2. UNIX 인증이 실패합니다. 다음 모듈은 건너뛰고( default=1) 체인은 다음으로 끝납니다 pam_deny.접근 불가.
  • 세 번째 줄에 도달하면 1회차 my_module로 끝났고 , 성공했다는 의미입니다. 모듈이 다시 ( ) 호출됩니다 . 다시 두 가지 가능성:PAM_CRED_INSUFFICIENTpam_unix// do something else here?sufficient

    1. 이번에는 모듈이 성공합니다.액세스 권한이 부여됨.
    2. 모듈이 다시 실패하지만 자격 증명 부족 이외의 다른 이유로 인해:접근 불가.

사용자 정의 코드를 실행하고 싶을 수도 있습니다.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인수가 전달됩니다.argvargc위치하고 있다런타임에 체인의 모듈. 물론, firstLogin그러한 구별을 하기 위해서는 귀하의 상태가 충분해야 합니다.

관련 정보