OpenSSH에 대한 2단계 인증을 구현하려고 합니다. 환경은 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 구성에서 비밀번호 인증 하위 스택을 완전히 제거하면 Kerberos 계정은 계속 작동합니다. 로컬 계정이 계속 작동하지 않습니다. 나에게는 UsePAM yes도 존재하기 때문에 KerberosOrLocalPasswd 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
그래서 제가 생각하는 제 시나리오는 어떤 면에서 너무 복잡하거나 야심적이지는 않지만, 며칠 동안 연구하고 실험했음에도 불구하고 이를 구현할 명확한 방법을 찾지 못했습니다. 해결책을 찾도록 도와주실 수 있나요?
미리 감사드립니다!
답변1
나는 새로운 pam 모듈을 작성하지 않고 PAM으로 원하는 것을 수행할 수 있는 방법을 모릅니다. PAM은 상대적으로 복잡하며 sshd가 PAM 및 kerberos와 상호 작용하는 방식이 내 경험상 항상 작동하지 않는 극단적인 경우가 있었습니다.
당신이 원하는 것이 가능할 수도 있지만 어떻게 해야 할지 모르겠습니다. SSH 보안만 필요하다면 내가 제안하는 것은 다음을 사용하는 것입니다.
ForceCommand /path/to/2fa_executable
sshd_config에서. 이를 통해 원하는 논리를 구현할 수 있지만 단점은 2fa 비밀을 읽으려면 2fa_executable을 setuid로 설정해야 한다는 것입니다.
Duo Security 웹사이트에 예제와 코드가 있습니다. 듀오 setuid 래퍼와 사용 중인 2fa 코드를 사용할 수 있습니다.
답변2
- 기존의 유효한 Kerberos 티켓을 보유한 사용자에게는 두 번째 요소만 요청해야 합니다.
이는 PAM을 통해서는 달성할 수 없습니다.
sshd에 대해 수행된 성공적인 키 기반 인증은 auth
PAM 스택을 우회합니다. 여기에는 티켓 기반 Kerberos 인증의 요구 사항인 GSSAPI가 포함됩니다. PAM은 이러한 유형의 인증을 염두에 두고 설계되지 않았기 때문에 이를 수행할 수밖에 없습니다.
설정은 UsePAM yes
다음을 수행합니다.
ChallengeResponseAuthentication
비밀번호를 확인하기 위해 PAM 스택을PasswordAuthentication
연결합니다 .auth
이 두 가지 방법 이외의 모든 형태의 인증은~ 아니다스택 을 터치하세요auth
.- 인증이 성공하면
account
PAM 스택이 호출되어 인증된 사용자에게 액세스가 허용되는지 확인합니다. (언제나) - 세션 설정 작업을 처리하기 위해 PAM 스택
session
이 호출됩니다.
auth
요약: GSSAPI 또는 SSH 키로 인증한 사람에 대해 스택 내에 있는 2단계 인증 프롬프트를 실행하는 방법은 전혀 없습니다 . 이러한 인증 방법과 함께 account
및 스택을 사용할 수 있지만 session
이는 PAM의 한계입니다.
답변3
어떻게 하는지 설명이 나와있어요https://cern-cert.github.io/pam_2fa/
- 기본: pam을 사용한 2단계 인증
SSH 인증 방법에 대해 더 많이 이해하는 pam 모듈:
auth [성공=2 무시=무시 기본값=다이] pam_ssh_user_auth.so
이를 pam에 노출하기 위한 최신 또는 패치된 OpenSSH
인증 방법 gssapi-with-mic,keyboard-interactive:pam 공개 키,keyboard-interactive:pam 키보드-interactive:pam