n-factor
CentOS 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/sshd
CentOS 7에는 기본적으로 포함되어 있지 않습니다. @include common-auth
또한 @steve 님의 링크는 php 스크립트의 웹 URL을 사용하고 있는데 쉘 스크립트에서 java 프로그램을 호출하려고 합니다. URL을 노출하지 않고 이를 수행할 수 있는 방법이 있어야 합니다.
ChallengeResponseAuthentication = yes
마지막으로 @steve의 링크에는 in 디렉토리를 설정하라는 내용이 있지만 /etc/ssd/sshd_config
CentOS 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