Senha expirada e login baseado em chave SSH com UsePAM sim

12

Existe uma máquina SLES 11. Os usuários efetuam login via SSH e pubkey (misto, alguns usuários usam senha, outros usam chave ssh)

O sshd_config possui:

UsePAM yes
PasswordAuthentication yes
PubkeyAuthentication yes

O problema: se a senha expirar para um usuário que usa o login pubkey, o usuário será solicitado a alterar a senha.

A pergunta: como podemos definir a configuração do PAM ou sshd para permitir que os usuários efetuem login se eles têm uma chave SSH válida e sua senha expirou? - Sem aparecer "mude sua senha".

ATUALIZAÇÃO # 1: A solução não pode ser: "UsePAM no"

SERVER:~ # cat /etc/pam.d/sshd 
#%PAM-1.0
auth        requisite   pam_nologin.so
auth        include     common-auth
account     requisite   pam_nologin.so
account     include     common-account
password    include     common-password
session     required    pam_loginuid.so
session     include     common-session
SERVER:~ # 

ATUALIZAÇÃO # 2: A solução não pode ser: defina a senha do usuário para nunca expirar

ATUALIZAÇÃO # 3:

SERVER:/etc/pam.d # cat common-account
#%PAM-1.0
...
account required    pam_unix2.so    
account required    pam_tally.so
SERVER:/etc/pam.d # 
thequestionthequestion
fonte
Você pode conseguir fazer isso removendo pam_unix.soda sessionseção de /etc/pam.d/sshd(e substituindo-a por pam_lastlog.sose não estiver lá. Não tenho certeza se pam_unix.so/sessioné quem está fazendo isso ou não, mas parece o lugar certo.
Patrick
1
definir a conta de usuário para nunca mais ser expirado :)
Raza
@Raza: Obrigado :) ótima idéia, mas não pode ser uma solução :(
thequestionthequestion
tente ForcedPasswdChange Noisto é para SSH1
Raza
1
Eu percebi que ForcedPasswdChange Nonão funcionaria após o vencimento. você está procurando uma solução que permita que o usuário expirado efetue login
Raza

Respostas:

10

A ordem das operações que causam o prompt da senha expirada é a seguinte:

  • O SSH executa o accountestágio PAM , que verifica se a conta existe e é válida. O accountestágio percebe que a senha expirou e informa o SSH.
  • SSH executa autenticação baseada em chave. Ele não precisa de PAM para isso, portanto não corre o authpalco. Em seguida, configura a sessão de login SSH e executa o sessionestágio PAM .
  • Em seguida, o SSH lembra que o PAM informou que a senha expirou, imprime uma mensagem de aviso e solicita ao PAM que o usuário altere a senha. O SSH então se desconecta.

Tudo isso é feito pelo SSH e não vejo nenhuma opção SSH para configurar esse comportamento. Portanto, a menos que você queira criar uma versão personalizada do SSH e / ou PAM, a única opção que vejo é impedir o PAM de relatar a senha expirada ao SSH. Se você fizer isso, desabilitará completamente as verificações de senha expiradas no SSH , mesmo se o usuário estiver efetuando login no SSH com uma senha. Outros métodos (não SSH) de login ainda verificarão a expiração da senha.

Seu pam.d/sshdarquivo atual tem uma account include common-accountentrada. Presumo que exista um common-accountarquivo que contenha uma referência pam_unix.so. Esta é a linha que verifica uma senha expirada.

Você provavelmente não deseja tocar no common-accountarquivo em si, pois ele é usado para outros métodos de login. Em vez disso, você deseja remover a includepartir do seu pam.d/sshdarquivo. Se houver outras funções common-accountalém disso pam_unix.so, você provavelmente deseja colocá-las diretamente pam.d/sshd.

Por fim, lembre-se de que isso é uma modificação da segurança do seu sistema e você não deve confiar cegamente em mim para lhe dar bons conselhos. Leia como o PAM funciona se você não estiver familiarizado. Alguns lugares de partida pode ser man 7 PAM, man 5 pam.confe man 8 pam_unix.

Jander
fonte
Boa explicação da ordem das operações, obrigado.
M_dk 27/07
3

Uma opção foi adicionada ao pam_unix.so (por volta de fevereiro de 2016) chamada no_pass_expiry ( alteração do código-fonte aqui ou página de manual aqui ). Basicamente, ele diz ao pam_unix para ignorar uma senha expirada se algo diferente de pam_unix foi usado para autenticação, por exemplo, se o sshd executou a autenticação.

Como resultado, se você tiver uma versão do pam_unix.so que contenha essa opção, poderá configurar o PAM para:

  1. Ainda avise, mas não exija uma alteração em uma senha expirada se uma chave SSH foi usada para autenticar via ssh
  2. Exija uma alteração de senha expirada se um login / senha via pam_unix.so foi usado para autenticar via ssh
  3. Não afeta nenhuma outra sequência de autenticação (por exemplo, através do serviço de login).

Por exemplo, configurei um servidor RHEL 7 para fazer isso acima, simplesmente atualizando /etc/pam.d/sshd e adicionando pam_unix.so no_pass_expiry aos tipos de conta e senha, por exemplo

account    required    pam_nologin.so
account    sufficient  pam_unix.so no_pass_expiry
account    include     password-auth
password   sufficient  pam_unix.so no_pass_expiry
password   include     password-auth
Todd
fonte
1
Apenas tentei isso e funciona. Você pode verificar se o seu PAM suporta essa opção ou não, pesquisando "no_pass_expiry" existe ou não dentro da página do manual "man 8 pam_unix".
Tomofumi
Mudança de código a partir de 2016 ainda não está presente no Ubuntu 18.04 ... :(
ColinM 24/10
0
  • Você pode não querer alterar seu PAM ou sshd_config por motivos de conformidade.
  • Você pode estar usando PasswordAuthentication no em sshd_config
  • Você pode ter senhas aleatórias.
  • Você pode até ter implementado a conformidade com o CIS.
  • Seus usuários ainda recebem o prompt

Então o root pode ajustar a data da senha alterada:

for user in `grep ":x:[0-9]\{4\}" /etc/passwd|cut -d: -f1`; do chage -d today $user; done
bbaassssiiee
fonte