autenticação SSH n-factor para o CentOS 7

2

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?

    
por CodeMed 18.08.2015 / 22:34

1 resposta

3

A pilha de autenticação padrão * nix usa o PAM. Você vai querer olhar para a construção de um módulo para o PAM: link

Normalmente, os fornecedores de autenticação com vários fatores fornecem um. Por exemplo, aqui está um guia prático para implementar o google authenticator como um segundo fator para o login do SSH: link

Você pode configurar o PAM para suportar diversos fatores diferentes como suficientes ou obrigatórios.

EDITAR: Não estou tentando ser difícil - estou tentando redirecionar sua pesquisa. A partir da sua segunda edição, você pede ajuda para adaptar um conjunto de linhas que inclui: gcc -fPIC -lcurl -c 2ndfactor.c Esta é a oferta. Você não pode compilar um script de shell. Módulos PAM são escritos em C e compilados (neste exemplo) com o gcc. Você pode chamar um aplicativo java de dentro de um módulo PAM, mas isso está fora do escopo deste site e fora do escopo de meu conhecimento.

Outras notas:

  • Os módulos PAM para uma versão moderna do CentOS estarão em / lib64 / security /, caso você precise de bibliotecas de 32 e 64 bits
  • Lastly, @steve's link says to set ChallengeResponseAuthentication = yes in /etc/ssd/sshd_config, but in CentOS 7 there is no /etc/ssd/ directory. Este é provavelmente apenas um erro de digitação e deve ser / etc / sshd

Alternativa: Como administrador de sistemas, desestimulo o uso de configurações "estranhas". O PAM é o método bem conhecido e aceito de autenticação, e muitas aplicações além do sshd podem e irão usá-lo.

No entanto, se você está preocupado apenas com a implementação do 2FA para sessões sshd in tty, você pode observar a opção ForceCommand em sua configuração sshd: link

Você deve notar que é relativamente fácil para um usuário autenticado contornar futuras tentativas de impor 2FA através do ForceCommand, então essa não é realmente uma boa solução: link

    
por 18.08.2015 / 22:48