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(pass)을 통해 , 이 경우 체인을 성공( ) 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.접근 불가.
  • 세 번째 줄에 도달하면 첫 번째가 my_module끝났고 성공한 것입니다. 귀하의 모듈은 again() 으로 호출됩니다. 다시 두 가지 가능성이 있습니다.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그러한 구별을 하려면 조건이 충분해야 합니다.

관련 정보