Como posso habilitar (e exigir)% de autenticaçãon-factor
para todas as conexões SSH com um servidor CentOS 7?
Eu li sobre o Google Authenticator, que fornece autenticação de fator dois . Mas isso é limitado a um pino fornecido por um aplicativo que você precisa instalar no dispositivo móvel de cada usuário.
Como posso adicionar números variáveis de fatores de autenticação? Alguns exemplos de fatores adicionais podem incluir:
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.) ...
Um programa em Java para enviar os e-mails e textos do pin seria bastante fácil de construir, e poderia ser chamado por um script de shell que substitui o script de autenticação ssh padrão, mas eu nunca escrevi um script antes.
Como seria o código shell para realizar isso, supondo que o Java já esteja escrito? E onde eu colocaria o script de shell? O pseudo-código para o script de shell pode incluir os seguintes passos:
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
Meu palpite quanto ao primeiro rascunho de um script de shell pode ser:
#!/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.
O que mais vai no script de shell? E como colocá-lo em prática?
As especificações para uma resposta são fornecidas acima. No entanto, comentários sugerindo ferramentas mais fáceis, em vez de rolar, também são bem-vindos como comentários .
EDITAR:
Com base em minhas pesquisas em andamento, adicionei mais detalhes explícitos ao rascunho do script de shell acima para documentar as etapas que o script deve seguir para autenticar o usuário. As etapas principais podem ser consideradas concluídas com sucesso por dois programas java "caixa preta" que são chamados pelo script de shell. As principais questões restantes que devem ser respondidas antes que isso possa ser concluído incluem:
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?
Nota: Se a implementação do script no CentOS 7 envolve o empacotamento do script como PAM module
as @steve sugere em seu comentário, então a resposta aceita precisa fornecer instruções explícitas não apenas para alterar o shell script, mas também para integrar o script de shell no PAM module
e quaisquer outros aspectos do processo de autenticação. A resposta precisa funcionar no CentOS 7.
SEGUNDA EDIT:
Por este link que foi postado em um comentário por @steve abaixo, o conteúdo de /etc/pam.d/sshd
é, por padrão, o seguinte:
#%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
Note que, no CentOS 7, /lib/security/
não existe e, portanto, não é a localização dos módulos PAM, como no link de @ steve, que é para o Debian. Assim, sem os módulos PAM, não podemos armazenar o script de shell no meu OP como /lib/security/2ndfactor.so
. O tutorial no link do @ steve sugere o seguinte código para atribuir o script a /lib/security/2ndfactor.so
. Como podemos mudar o seguinte código?
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
O link de @ steve também sugere que editemos /etc/pam.d/sshd
para adicionar uma referência ao 2ndfactor.o
após @common-auth
da seguinte forma:
# 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
Mas, como você pode ver acima, o /etc/pam.d/sshd
que vem por padrão no CentOS 7 não contém @include common-auth
. Além disso, o link do @ steve usa uma URL da web para um script php, mas estou tentando chamar um programa java a partir de um script de shell. Deve haver uma maneira de fazer isso sem expor um URL da web.
Por fim, o link de @ steve diz para definir ChallengeResponseAuthentication = yes
em /etc/ssd/sshd_config
, mas no CentOS 7 não há diretório /etc/ssd/
.
Alguém pode, por favor, mostrar como adaptar tudo isso para trabalhar com o CentOS 7 e o Java?