CentOS 7용 n-Factor SSH 인증

CentOS 7용 n-Factor SSH 인증

n-factorCentOS 7 서버에 대한 모든 SSH 연결에 대해 인증을 활성화하고 요구하는 방법은 무엇입니까 ?

나는 다음을 제공하는 Google OTP에 대해 읽었습니다.요소 인증. 그러나 이는 각 사용자의 모바일 장치에 설치해야 하는 앱에서 제공하는 핀으로 제한됩니다.

가변 개수의 인증 요소를 추가하는 방법은 무엇입니까? 다른 요인의 몇 가지 예는 다음과 같습니다.

1.) a pin code emailed to the administrator's work email address
2.) a USB key
3.) a pin texted to the administrator using a tool like twilio
etc.) ...

핀 이메일과 텍스트를 보내는 Java 프로그램은 구축하기 쉽고 기본 SSH 인증 스크립트를 대체하는 쉘 스크립트에서 호출할 수 있지만 이전에 쉘 스크립트를 작성한 적이 없습니다.

Java가 이미 작성되었다고 가정하면 이를 수행하는 쉘 코드는 어떤 모습일까요? 쉘 스크립트를 어디에 넣어야 합니까? 쉘 스크립트의 의사 코드에는 다음 단계가 포함될 수 있습니다.

1.) Trigger the Java program to send email, text, etc. with custom pins 
        when administrator types ssh [email protected]
2.) Replace the login password prompt with a series of prompts to  
        get the pins/credentials from
2.) Possibly interact with a client program to get the usb signature
3.) Send the credentials to the java program, with time stamp to ensure  
        login was done within a minute after java sent the pins
4.) Compare the Boolean returned by the java program with the CentOS password check
5.) Either authenticate or reject the user

쉘 스크립트의 첫 번째 초안에 대한 내 추측은 다음과 같습니다.

#!/bin/bash
USER_NAME=#How do I populate this?
TEXT_PIN=shuf -i 1-10000 -n 1
EMAIL_PIN=shuf -i 1-10000 -n 1
CLASSPATH=/path/to/classes
java -cp $CLASSPATH my.package.SendPinsClass TEXT_PIN EMAIL_PIN
if [ $? -eq 0 ]
then
    echo -n "We were not able to send authentication credentials.  Please log the current time and report this to the chief administrator. "
else
    echo -n "Pin numbers have been sent to your email and phone number.  Please check your email and text messages now before continuing the authentication process. "
fi

echo -n "Enter Pin number from cell phone: "
read TEXT_PIN
echo -n "Enter Pin number from email: "
read EMAIL_PIN
java -cp $CLASSPATH my.package.AuthenticationClass USER_NAME TEXT_PIN EMAIL_PIN
if [ $? -eq 0 ]
then
    #DO NOT AUTHENTICATE
else
    #LOG THIS USER IN!
fi
#HOW DO WE CHECK THE USER'S CentOS 7 PASSWORD?
#THIS SCRIPT MUST INCLUDE A PASSWORD CHECK IN AUTHENTICATION PROCESS.

쉘 스크립트에는 또 무엇이 포함되어 있습니까? 어떻게 제자리에 놓나요?

사양은답변상술 한 바와 같이. 하지만,논평자신만의 도구를 개발하는 것보다 더 간단한 도구에 대한 제안도 환영합니다.논평.


편집하다:


진행 중인 연구를 바탕으로 위의 초안 셸 스크립트에 보다 명시적인 세부 정보를 추가하여 스크립트가 사용자를 인증하기 위해 수행해야 하는 단계를 문서화했습니다. 쉘 스크립트에 의해 호출되는 두 개의 "블랙 박스" Java 프로그램에 의해 중요한 단계가 성공적으로 완료되었다고 가정할 수 있습니다. 완료 전에 답변해야 할 나머지 주요 질문은 다음과 같습니다.

1.) How does the script receive and populate the value for the USER_NAME variable?
2.) How does the script check the user's CentOS 7 OS password, and 
        how should the password be integrated into the script's authentication 
        process?  Note the security of the password needs to be protected.
3.) How does the script process the approval or rejection of the  
        authentication request with the CentOS 7 operating system?
4.) How is the working shell script placed in the authentication  
        process to replace the default authentication script?  

참고: CentOS 7에서 스크립트 구현에 PAM module@steve가 의견에서 제안한 대로 스크립트 번들링이 포함된 경우 허용된 대답은 셸 스크립트 변경뿐만 아니라 셸 스크립트를 PAM module다른 측면에 통합하기 위한 명시적인 지침을 제공해야 합니다. 인증 과정 중. 대답은 CentOS 7에서 실행되어야 합니다.


두 번째 편집:


아래 댓글에 @steve가 게시한 링크에 따르면 기본 내용은 /etc/pam.d/sshd다음과 같습니다.

#%PAM-1.0
auth       required     pam_sepermit.so
auth       substack     password-auth
auth       include  postlogin
account    required     pam_nologin.so
account    include  password-auth
password   include  password-auth
# pam_selinux.so close should be the first session rule
session    required     pam_selinux.so close
session    required     pam_loginuid.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session    required     pam_selinux.so open env_params
session    optional     pam_keyinit.so force revoke
session    include  password-auth
session    include  postlogin

CentOS 7에는 /lib/security/그러한 위치가 없으므로 @steve의 링크(Debian의 경우)처럼 PAM 모듈의 위치가 아닙니다. 따라서 PAM 모듈이 없으면 OP에 쉘 스크립트를 저장할 수 없습니다 /lib/security/2ndfactor.so. @steve 링크의 튜토리얼에서는 다음 코드를 사용하여 스크립트를 /lib/security/2ndfactor.so.

apt-get update
apt-get install build-essential libpam0g-dev libcurl4-openssl-dev
gcc -fPIC -lcurl -c 2ndfactor.c
ld -lcurl -x --shared -o /lib/security/2ndfactor.so 2ndfactor.o

@steve의 링크에서는 다음과 같이 after 에 대한 참조를 추가하도록 편집할 것을 제안합니다 /etc/pam.d/sshd. 2ndfactor.o@common-auth

# PAM configuration for the Secure Shell service
# Read environment variables from /etc/environment and
# /etc/security/pam_env.conf.
auth       required     pam_env.so # [1]
# In Debian 4.0 (etch), locale-related environment variables were moved to
# /etc/default/locale, so read that as well.
auth       required     pam_env.so envfile=/etc/default/locale

# Standard Un*x authentication.
@include common-auth
auth       required     2ndfactor.so base_url=http://my.server.com/send_code.php code_size=5

하지만 위에서 볼 수 있듯이 /etc/pam.d/sshdCentOS 7에는 기본적으로 포함되어 있지 않습니다. @include common-auth또한 @steve 님의 링크는 php 스크립트의 웹 URL을 사용하고 있는데 쉘 스크립트에서 java 프로그램을 호출하려고 합니다. URL을 노출하지 않고 이를 수행할 수 있는 방법이 있어야 합니다.

ChallengeResponseAuthentication = yes마지막으로 @steve의 링크에는 in 디렉토리를 설정하라는 내용이 있지만 /etc/ssd/sshd_configCentOS 7에는 디렉토리가 없습니다 /etc/ssd/.

누군가 이것을 CentOS 7 및 Java에 적용하는 방법을 보여줄 수 있습니까?

답변1

표준 *nix 인증 스택은 PAM을 사용합니다. PAM용 모듈 구축을 고려해야 합니다. http://www.linux-pam.org/Linux-PAM-html/

일반적으로 다단계 인증 공급자가 이를 제공합니다. 예를 들어 다음은 SSH 로그인의 두 번째 요소로 Google Authenticator를 구현하는 방법에 대한 안내입니다. http://spod.cx/blog/two-factor-ssh-auth-with-pam_oath-google-authenticator.shtml

다양한 충분 요소 또는 필수 요소를 지원하도록 PAM을 구성할 수 있습니다.


편집: 저는 어렵게 말하려는 것이 아닙니다. 단지 연구 방향을 바꾸려는 것뿐입니다. 두 번째 편집부터 다음을 포함하는 일련의 줄을 조정하는 데 도움을 요청합니다. gcc -fPIC -lcurl -c 2ndfactor.c 이것은 경품입니다. 쉘 스크립트를 컴파일할 수 없습니다. PAM 모듈은 C로 작성되었으며 gcc를 사용하여 컴파일되었습니다(이 예에서는). PAM 모듈 내에서 Java 애플리케이션을 호출할 수 있지만 이는 이 사이트의 범위를 벗어나며 제가 아는 바도 아닙니다.

기타 참고사항:

  • 32비트 및 64비트 라이브러리가 필요한 경우 PAM 모듈의 최신 CentOS 버전은 /lib64/security/에 있습니다.
  • Lastly, @steve's link says to set ChallengeResponseAuthentication = yes in /etc/ssd/sshd_config, but in CentOS 7 there is no /etc/ssd/ directory.이것은 아마도 오타일 것입니다. /etc/sshd여야 합니다.

대안: 시스템 관리자로서 저는 "이상한" 구성을 사용하는 것을 권장하지 않습니다. PAM은 잘 알려져 있고 승인된 인증 방법이며 sshd 이외의 많은 응용 프로그램에서 이를 사용할 수 있고 사용할 것입니다.

그러나 tty 세션에서 sshd에 대한 2FA 구현에만 관심이 있는 경우 sshd 구성에서 ForceCommand 옵션을 사용하는 것을 고려할 수 있습니다. http://ben.akrin.com/?p=1290

인증된 사용자는 나중에 ForceCommand를 통해 2FA를 시행하려는 향후 시도를 비교적 쉽게 피할 수 있으므로 이는 그다지 좋은 해결책이 아닙니다. https://serverfault.com/questions/639771/how-secure-is-ssh-forcecommand-on-a-jump-host

관련 정보