É possível executar o sshd como um usuário normal?

39

sshdMeu objetivo é iniciar uma segunda instância em uma porta não privilegiada (por exemplo, 2222) com meu próprio arquivo de configuração.

Obviamente, o sshdprocesso não pode fazer setuidlogin como usuários que não sejam o que está executando o sshddaemon, é claramente impossível.

No entanto, é possível ter um sshddaemon que funcione para o usuário em execução no momento? Para o meu caso de uso, isso seria bom.

Tentei inicializar uma sshdinstância com meu próprio arquivo de configuração e chave do host, e o sshdprocesso é iniciado (sem queixas sobre não ser root, como alguns comandos); no entanto, quando tento conectar-me a essa porta, o sshdprocesso morre.

$ /usr/sbin/sshd -dD -h .ssh/id_rsa -p 2222 
debug1: sshd version OpenSSH_5.6p1
debug1: read PEM private key done: type RSA
debug1: private host key: #0 type 1 RSA
debug1: setgroups() failed: Operation not permitted
debug1: rexec_argv[0]='/usr/sbin/sshd'
debug1: rexec_argv[1]='-dD'
debug1: rexec_argv[2]='-h'
debug1: rexec_argv[3]='.ssh/id_rsa'
debug1: rexec_argv[4]='-p'
debug1: rexec_argv[5]='2222'
debug1: Bind to port 2222 on 0.0.0.0.
Server listening on 0.0.0.0 port 2222.
debug1: Bind to port 2222 on ::.
Server listening on :: port 2222.
debug1: fd 6 clearing O_NONBLOCK
debug1: Server will not fork when running in debugging mode.
debug1: rexec start in 6 out 6 newsock 6 pipe -1 sock 9
debug1: inetd sockets after dupping: 5, 5
Connection from ::1 port 57670
debug1: Client protocol version 2.0; client software version OpenSSH_5.6
debug1: match: OpenSSH_5.6 pat OpenSSH*
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_5.6
debug1: list_hostkey_types: 
No supported key exchange algorithms
debug1: do_cleanup
debug1: do_cleanup
debug1: audit_event: unhandled event 12

A debug1: setgroups() failed: Operation not permittedlinha obviamente se destaca, mas não morre até tentar aceitar uma conexão.

Bo Jeanes
fonte

Respostas:

35

Depois de um pouco de pesquisa, descobri.

Inicie o processo com sshd -f ~/.ssh/sshd_configonde /.ssh/sshd_configestá um novo arquivo que você criou. Entre outras opções (como uma chave de host diferente, porta diferente etc.), você precisa adicionar a linha UsePrivilegeSeparation no. Isso impedirá que o sshdprocesso tente fazer algumas chamadas setuidou setgidpermita que ele continue sendo executado como usuário e aceite conexões como seu usuário.

EDIT: Alguns momentos depois de descobrir que outra pessoa tweetou este link para mim, o que confirma que esta é a maneira correta de fazer isso: http://cygwin.com/ml/cygwin/2008-04/msg00363.html

Bo Jeanes
fonte
1
Você também precisa desativar o PAM configurando UsePampara no.
precisa
@bjeanes isso funciona para você? você pode compartilhar seu arquivo sshd_config? queixa-se "Set" não é um comando válido para mim quando tento no ubuntu.
jojo
@jojo Não executo essa configuração, portanto não tenho arquivo para compartilhar. Você precisará começar com um arquivo de trabalho conhecido e se ajustar às suas necessidades.
precisa saber é
1
A coisa de desativar o PAM é apenas para casos específicos. Funciona para mim no Fedora sem mexer na configuração de pam. Veja a mensagem de e-mail vinculada na resposta para obter mais algumas idéias sobre o que mais precisa ser alterado para obter todas as coisas boas. Eu vou atualizar em breve minhas notas como eu fiz o trabalho para docker: hub.docker.com/r/aosqe/ssh-git-server (por favor, permitir que um par de dias antes de lê-lo)
akostadinov
6

Como uma atualização para esse encadeamento, o OpenSSH na versão 7.5 reprovou a opção UsePrivilegeSeparation, tornando impossível desativar a separação de privilégios. Parece que a execução do SSHD como usuário agora é impossível.

Consulte https://www.openssh.com/releasenotes.html

lanterna Mágica
fonte
Dependendo da configuração do servidor, este pode não ser o caso. Não tenho nenhum problema ao executar o sshd como usuário normal enquanto indica "UsePrivilegeSeparation yes" ou "UsePrivilegeSeparation sandbox" no meu arquivo de configuração sshd.
a3nm
Bem, eu ainda não tentei, mas acho que isso está "corrigido" agora: "sshd (8): quando iniciado sem privilégios de root, não exige a existência do usuário ou caminho da separação de privilégios. Torna mais fácil a execução dos testes de regressão sem tocar no sistema de arquivos ".
Daniel Santos
2

Eu verifiquei em detalhes a possibilidade de executar o serviço sshd como um usuário normal. Detalhe da versão do programa:

versão sshd OpenSSH_7.4, OpenSSL 1.0.2k

Finalmente, depois de resolver muitos erros, cheguei a um ponto em que o SSHD abortou com o seguinte erro:

Tentativa de gravar registros de login por usuário não root (abortando)

Verifiquei o código-fonte para ver se é possível resolver o problema sem alterar o código-fonte. Veja o código aqui . Alguma parte do código que causa o aborto do programa:

#ifndef HAVE_CYGWIN
    if (geteuid() != 0) {
        logit("Attempt to write login records by non-root user (aborting)");
        return (1);
    }
#endif

Ele verifica o privilégio do usuário (geteuid() != 0)e aqui causa o problema.

Mehrdad Nazmdar
fonte
1

Assumindo o que a @magiclantern observou acima e supondo que você não deseja corrigir sshd, algo como o Dropbear funciona para você? É usado em muitos dispositivos incorporados que desejam um servidor ssh com tamanho menor (e menos recursos / configurações).

nhed
fonte
1
dropbear -E -F -R -w -g -a -p 2222 -P ./dbearPID # faz o truque
dotbit 18/07
1

Aqui está um userland bash sript baseado na resposta de Jean Jean:

  • Criar diretório de trabalho em casa
  • gerar chaves de servidor no diretório de trabalho
  • gerar arquivo de configuração básica com o arquivo pid localizado no diretório de trabalho
  • iniciar o daemon SSH

mkdir ${HOME}/custom_ssh
ssh-keygen -f ${HOME}/custom_ssh/ssh_host_rsa_key -N '' -t rsa
ssh-keygen -f ${HOME}/custom_ssh/ssh_host_dsa_key -N '' -t dsa
echo "Port 2222
HostKey ${HOME}/custom_ssh/ssh_host_rsa_key
HostKey ${HOME}/custom_ssh/ssh_host_dsa_key
AuthorizedKeysFile  .ssh/authorized_keys
ChallengeResponseAuthentication no
UsePAM yes
Subsystem   sftp    /usr/lib/ssh/sftp-server
PidFile ${HOME}/custom_ssh/sshd.pid" > ${HOME}/custom_ssh/sshd_config
/usr/bin/sshd -f ${HOME}/custom_ssh/sshd_config
echo "
--------
Process ID : ${HOME}/custom_ssh/sshd.pid
-------"
  • OpenSSH_7.9p1, OpenSSL 1.1.1a 20 de novembro de 2018
  • autenticação pam (testada com o mesmo usuário local e remoto)
inattendu
fonte
Ainda vejo: "debug1: setgroups () falhou: operação não permitida"
dotbit
Boa solução, mas você deve fazer com que os comandos pareçam melhores. Feio.
MAChitgarha 24/07