Faça com que o sshd substitua o shell de login de um grupo de usuários

1

Meus usuários são compartilhados em várias máquinas via LDAP.

Para um dessas máquinas (vamos chamá-lo de 'fileserf'), eu gostaria de restringir alguns usuários no que eles podem fazer (na verdade: impedir que eles façam logging em uma sessão interativa via ssh). Nas máquinas outras , esses usuários devem poder usar o ssh normalmente.

Então, minha ideia inicial era usar o subsistema internal-sftp , nos moldes de:

Match group sftponly
     ChrootDirectory %h
     X11Forwarding no
     AllowTcpForwarding no
     ForceCommand internal-sftp

Isso funciona bem, pois restringe apenas os membros do grupo (local) sftponly em um único host fileserf , mas infelizmente o internal-sftp subsistema somente permite sftp e não scp (ou rsync ).

Então eu pesquisei mais e encontrei rssh , o que me permite fazer exatamente o que eu quero fazer (permissão-sábia).

Agora, o problema é que não consigo definir o login-shell desses usuários para /usr/bin/rssh em meu LDAP, porque isso significaria que eles seriam restritos em todas máquinas, não apenas em fileserf .

Então, minha ideia é substituir o shell de login por meio de alguma configuração no sshd_config :

do fileserf
Match group sftponly
     X11Forwarding no
     AllowTcpForwarding no
     ForceCommand /usr/bin/rssh

Infelizmente, isso parece não funcionar, já que agora os usuários recebem um Connection closed sempre que tentam sftp na máquina:

$ ssh user@fileserf 

This account is restricted by rssh.
Allowed commands: scp sftp 

If you believe this is in error, please contact your system administrator.

Connection to fileserf closed.

$ sftp user@fileserf
Connection closed
$

Como posso fazer o ForceCommand funcionar com rssh ?

Como alternativa, posso configurar o sshd para substituir o login-shell de um grupo de usuários?

    
por umläute 04.02.2016 / 11:44

2 respostas

2

A rssh manpage indica que esta deve ser a shell de login do esses usuários:

The  system  administrator  should  install the shell on the restricted
system.  Then the password file entry  of  any  user  for  whom  it  is
desireable  to  provide  restricted  access should be edited, such that
their shell is rssh. For example:

      luser:x:666:666::/home/luser:/usr/bin/rssh

Com o ForceCommand , apenas esse comando é executado. Quando você executa scp ou sftp , os comandos são executados pelo SSH ( scp , /usr/lib/openssh/sftp-server , respectivamente) e, é claro, eles não podem ser executados, a menos que o programa executado por ForceCommand use SSH_ORIGINAL_COMMAND para faça isso. Então, para rssh fazer o seu trabalho, tem que ser o shell de login, não um ForceCommand .

Relacionados:

Você pode, em vez disso, usar um script de wrapper que usará rssh em vez do shell de login para executar comandos. Por exemplo:

/usr/local/bin/wrapper-shell :

#! /bin/sh
rssh -c "$SSH_ORIGINAL_COMMAND"

E em /etc/ssh/sshd_config :

Match group sftponly
     X11Forwarding no
     AllowTcpForwarding no
     ForceCommand /usr/local/bin/wrapper-shell

Com /usr/local/bin/wrapper-shell sendo executável, deve funcionar.

    
por 04.02.2016 / 12:05
2

Tivemos o mesmo problema: um servidor deve permitir scp sftp e rsync para todos os usuários, mas nenhuma conexão com a linha de comando. O banco de dados do usuário está no ldap e não podemos modificar o / etc / passwd localmente. O rssh não era, portanto, uma opção.

Uma solução que encontrei é usando ForceCommand e um script de shell. Em / etc / ssh / sshd_config adicionando estas linhas:

Match user *
    X11Forwarding no
    AllowTcpForwarding no
    ForceCommand /usr/local/bin/wrapper-shell user1 user2 user3

Em que userX são usuários especiais com permissão para efetuar login via ssh. O script wrapper-shell, que faz a filtragem real, é:

#!/bin/sh
SSHCMD='echo "$SSH_ORIGINAL_COMMAND" | awk '{ print $1 }''
ME='id -u -n'
DOIT=Maybe
# Root is always allowed in order to not being locked out
for n in root $*
do
  if [ "$ME" = "$n" ]
  then
    DOIT=YES
    break
  fi
done
if [ "$DOIT" = YES -o "$SSHCMD" = "scp" -o "$SSHCMD" = "rsync" -o "$SSHCMD" = /usr/lib/openssh/sftp-server ]
then
    sh -c "$SSH_ORIGINAL_COMMAND"
else
    cat <<EOF 1>&2

This account is restricted and the command is not allowed.

User $ME is locked out.

If you believe this is in error, please contact your system administrator.
EOF
    exit 1
fi
    
por 06.03.2017 / 19:03