OpenSSH에 대한 이중 인증을 구현하려고 합니다. 환경은 2013년 2월 11일 OpenSSH_6.6.1p1, OpenSSL 1.0.1e-fips가 있는 Centos 7(커널: 3.10.0-229.1.2.el7.x86_64)입니다. Active Directory(LDAP) + Kerberos가 배포되어 있습니다. 사양은 다음과 같습니다.

  • 유효한 기존 Kerberos 티켓이 있는 사용자는 두 번째 요소에 대해서만 요청해야 합니다.
  • 유효한 기존 Kerberos 티켓이 없는 사용자는 암호와 두 번째 요소를 모두 입력해야 합니다.
  • 로컬 사용자(LDAP 계정 없음)는 로컬 암호로 인증할 수 있어야 합니다.
  • 두 번째 요소는 첫 번째 요소보다 먼저 제공되어서는 안 됩니다.
  • Kerberos 외에도 공개 키 인증이 가능한 경우 첫 번째 요소로 허용되어야 합니다.
  • 이 기능은 사용자 집합으로 제한될 수 있어야 합니다. 다른 사용자는 비밀번호만 입력하면 됩니다.

두 번째 요소의 인증 프로세스를 수행하기 위해 Kerberos에 대해 전혀 알지 못하는 타사 PAM 모듈이 있습니다. 그래서 여기 내가 한 일이 있습니다.

다음 줄을 /etc/ssh/sshd_config에 넣습니다.

# To enable PAM - this will make sshd use PAM with configuration /etc/pam.d/sshd
UsePam yes
ChallengeResponseAuthentication yes

# To enable Kerberos and public key authentication - it will let sshd use existing Kerberos tickets
GSSAPIAuthentication yes

# Enable public key authentication
PubkeyAuthentication yes

# Password validation should be done via the KDC
PasswordAuthentication yes
KerberosAuthentication yes
KerberosOrLocalPasswd yes

# Kerberos / Public Key + PAM
AuthenticationMethods gssapi-with-mic,keyboard-interactive:pam publickey,keyboard-interactive:pam password,keyboard-interactive:pam
# (only supported for OpenSSH 6.2 or higher)

sshd에 대한 PAM 구성의 인증 섹션(/etc/pam.d/sshd)

auth       [success=ignore default=1] pam_localuser.so
auth       substack     password-auth
auth       [success=1 default=ignore] pam_localuser.so
auth       required     pam_2fa.so [...some arguments...]
auth       include      postlogin

pam_2fa.so 모듈은 두 번째 요소를 확인하고 확인하는 역할을 합니다.

이제 Kerberos의 경우 이것은 내가 달성하고자 하는 거의 모든 것을 수행합니다. 그러나 로컬 계정의 경우 두 개의 후속 암호 프롬프트가 표시됩니다. 이것이 나의 주요 문제입니다. 이 경우 예상대로 "password,keyboard-interactive:pam" 경로가 사용되기 때문입니다. (Kerberos 계정이 있지만 유효한 티켓이 없는 사람이 암호를 입력하고 OTP를 입력하여 티켓을 얻을 수 있도록 이 인증 경로가 필요합니다.) PAM 구성에서 password-auth 하위 스택을 완전히 제거하면 Kerberos 계정이 계속 작동합니다. 로컬 계정은 계속 작동하지 않습니다. 내게는 KerberosOrLocalPasswd yes 문이 무시되는 것처럼 보입니다. UsePAM yes도 있기 때문입니다. 그러나 sshd는 실제로 비밀번호 유효성 검사를 위해 KDC를 계속 사용합니다. 그렇지 않으면 LDAP 계정에서도 작동하지 않기 때문입니다.

다시 한 번, 여기서 구현하고자 하는 것을 더 명확히 하기 위해 원하는 인증 논리를 설명하는 의사 코드가 있습니다.

if gssapi_auth_ok(principal) or pubkey_auth_ok(pubkey):
  return second_factor_auth(user, read_otp())
else:
  if is_local_account(user):
    if local_passwd_auth(user, read_password()):
      return second_factor_auth(user, read_otp())
    else:
      return AUTH_ERR
  else:
    if krb5_auth(principal, read_password()):
      return second_factor_auth(user, read_otp())
    return AUTH_ERR

그래서 내 시나리오는 어떤 식으로든 너무 복잡하거나 야심차지 않다고 생각하지만, 연구하고 실험하는 데 며칠을 보냈음에도 불구하고 여전히 구현하는 명확한 방법을 찾지 못했습니다. 해결책을 찾는 데 도움을 주시겠습니까?

미리 대단히 감사합니다!

answer

새로운 pam 모듈을 작성하지 않고 PAM으로 원하는 작업을 수행할 수 있는 방법이 없습니다. PAM은 상대적으로 복잡하고 sshd가 PAM 및 kerberos와 상호 작용하는 방식은 제 경험상 항상 작동하지 않는 극단적인 경우가 있습니다.

당신이 원하는 것이 가능할 수도 있지만, 나는 그것을 하는 방법을 모릅니다. ssh를 보호해야 하는 경우 내가 제안하는 것은 다음을 사용하는 것입니다.

ForceCommand  /path/to/2fa_executable 

sshd_config에서 이렇게 하면 원하는 논리를 구현할 수 있지만 2fa 비밀을 읽으려면 2fa_executable이 setuid가 되어야 한다는 단점이 있습니다.

Duo Security 웹사이트에 예제와 코드가 있습니다. duo setuid 래퍼와 사용 중인 2fa 코드를 사용할 수 있습니다.

듀오 유닉스 구성

  • A user with an existing, valid Kerberos ticket must be asked only for the second factor.

이것은 PAM을 통해 달성할 수 없습니다.

sshd에 대해 수행된 성공적인 키 기반 인증 auth은 PAM 스택을 우회합니다 . 여기에는 티켓 기반 Kerberos 인증에 대한 요구 사항인 GSSAPI가 포함됩니다. PAM은 단순히 이러한 유형의 인증을 염두에 두고 설계되지 않았기 때문에 이를 수행할 수 밖에 없습니다.

설정 UsePAM yes은 다음을 수행합니다.

  • ChallengeResponseAuthentication그리고 PasswordAuthentication후크 것이다 auth유효성을 암호로 PAM 스택을. 이 두 가지 방법 이외의 모든 형식의 인증 스택에 영향 미치지 않습니다auth .
  • 인증이 성공하면 accountPAM 스택이 호출되어 인증된 사용자에게 액세스가 허용되는지 확인합니다. (언제나)
  • sessionPAM의 스택은 세션 설정 작업을 처리하기 위해 호출됩니다.

요약: authGSSAPI 또는 ssh 키로 인증한 사람에 대해 실행하기 위해 스택 내에 있는 2단계 인증 프롬프트를 얻을 수 있는 방법은 전혀 없습니다 . 이러한 인증 방법과 함께 accountsession스택을 사용할 수 있지만 PAM은 여기까지입니다.

다음은 수행 방법에 대한 설명입니다. https://cern-cert.github.io/pam_2fa/

  • 기본: pam을 사용한 2단계 인증
  • ssh 인증 방법에 대해 더 많이 이해하는 pam 모듈:

    인증 [성공=2 무시=무시 기본값=다이] pam_ssh_user_auth.so

  • 이것을 pam에 노출하기 위해 최근 또는 패치된 OpenSSH

    인증 방법 gssapi-with-mic,keyboard-interactive:pam publickey,keyboard-interactive:pam keyboard-interactive:pam