Quais etapas o sistema executa ao lidar com uma conexão SSH?

9

Quais etapas o sistema executa ao lidar com uma conexão SSH?

  1. Tentamos fazer login via ssh
  2. sshd inicia o módulo pam e pam para nos autenticar
  3. Dependendo da configuração do pam, precisamos fornecer nome de usuário e senha (verificações passwde shadowarquivos do pam )
  4. cheques PAM para hosts.allow/deny, /etc/shellse outras coisas
  5. Se tudo correr bem, estamos logados
  6. ???
  7. Shell é iniciado

Portanto, minha pergunta é qual mecanismo é responsável por verificar qual shell é atribuído ao usuário em seu passwdarquivo (na etapa 6)? É o próprio pam, algum módulo pam específico sshdou qualquer outra coisa? Sei que posso substituir o passwdarquivo (para verificar nome de usuário e senha) escrevendo um módulo pam, mas como posso substituir o passwdarquivo pela entrada do shell?

pbm
fonte

Respostas:

8

Até onde eu sei, o PAM não determina o shell do usuário, isso é deixado para o aplicativo. Os módulos de sessão do PAM executam ações e verificações genéricas que devem ser feitas em cada login usando esse serviço específico. Se o aplicativo quiser iniciar um shell, é livre para fazê-lo e, normalmente, procurará o shell no banco de dados do usuário.

Supondo que sua pergunta seja sobre o OpenSSH , é exatamente isso que faz: depois que o usuário é autenticado e o material da sessão do PAM foi concluído (se configurado para usar o PAM¹), o servidor ssh consulta o shell no banco de dados do usuário (diretamente, não através da biblioteca PAM).

O banco de dados do usuário não está limitado a /usr/passwdamigos. No Linux (que eu suponho que você está usando desde que você menciona shadow), o que torna o banco de dados do usuário é determinada pela passwdconfiguração no /etc/nsswitch.conf. Nas configurações de vários computadores, as adições comuns ao banco de dados local são NIS e LDAP . Se você quiser usar um shell que não seja o único /etc/passwd, pode ser o que configurar (embora isso seja um pouco estranho, e talvez as pessoas possam oferecer sugestões melhores se você nos informar o que está tentando realizar).

Se você deseja ter usuários sem acesso total ao shell, a solução natural é mudar /etc/passwdpara colocar um shell restrito - talvez o rssh permita apenas alguns aplicativos do tipo cópia de arquivo, como scp, rsync e cvs. Você também pode usar comandos forçados no ~/.ssh/authorized_keysarquivo do usuário .

Se você deseja ver um rastro do que o servidor ssh está fazendo, inicie o daemon como ssh -ddd. Você também pode obter a visão do cliente ssh -vvv, embora aqui a visão do servidor seja o que mais lhe interessa.

¹ OpenSSH só usa PAM, se for configurado com suporte a PAM ea UsePAMdirectiva está definido para yesem sshd_config. Mesmo quando usa o PAM, ele oferece outros métodos de autenticação além do PAM; em particular, a autenticação de chave pública não passa pelo PAM.

Gilles 'SO- parar de ser mau'
fonte
Quero permitir que os usuários do meu aplicativo efetuem login no shell como usuário normal sem criar uma conta no sistema. Os dados dos usuários (nome de usuário, senha e shell) serão armazenados no sqlite db. O primeiro passo é o módulo sqlite pam que autentica os usuários contra o banco de dados. O segundo passo é fornecer o shell lido no banco de dados. Então eu acho que isso poderia ser conseguido escrevendo o módulo nis adequado. Obrigado pela resposta ...
pbm 14/11
@ PBM: Eu não acho que você quer nis, em vez db(ou talvez um módulo personalizado).
Gilles 'SO- stop be evil'
-lo do erro de digitação .. eu quis dizer "escrevendo adequada (personalizado) nss módulo" ...
PBM