Script Bash para limitar o número de logins

12

Minha empresa exige que eu tenha um aplicativo de servidor em execução, que todos os usuários acessem através do terminal putty. Eu quero escrever um script de shell que apenas 20 putty terminal devem estar abertos. Se o 21º terminal estiver aberto, quero fechar esse terminal imediatamente.

Como posso conseguir isso?

Por favor me ajude.

vijay12289
fonte
3
Defina o número máximo de conexões permitidas no ssh para 20 no servidor em MaxSessionscampo
George Udosen
2
Se sua empresa possui uma política de 20 sessões no máximo e o padrão é 10 (como diz a resposta mais votada), por que sua empresa aumentou o número de sessões permitidas> 20 pol /etc/sshd_configou isso é um bug do Ubuntu?
WinEunuuchs2Unix 30/08/19
Se o 21º terminal estiver aberto, quero fechar esse terminal imediatamente. Assim, as 20 primeiras conexões podem sobrecarregar o servidor indefinidamente?
Xenoid

Respostas:

24

Edite seu /etc/sshd_configno lado do servidor e altere a linha:

#MaxSessions 10

para

MaxSessions 20

Veja man sshd_config:

 MaxSessions
         Specifies the maximum number of open shell, login or subsystem
         (e.g. sftp) sessions permitted per network connection.  Multiple
         sessions may be established by clients that support connection
         multiplexing.  Setting MaxSessions to 1 will effectively disable
         session multiplexing, whereas setting it to 0 will prevent all
         shell, login and subsystem sessions while still permitting for-
         warding.  The default is 10.
George Udosen
fonte
sim suas obras, um pouco tarde para adicioná-lo como resposta.
rɑːdʒɑ
2
Estou pensando em instalar o SSSH em um dos meus laptops antigos há algum tempo. A página de manual está dizendo que, por padrão, apenas 10 usuários podem entrar no servidor? Mesmo nos anos 80, poderíamos ter uma centena de usuários conectados a um minicomputador IBM S / 36 com 2 MB de RAM.
WinEunuuchs2Unix 30/08/19
2
Você está confundindo sessões como em terminais abertos (consulte OP) com sessões dentro de uma conexão SSH. A configuração mencionada é sobre quantas "subconexões" são permitidas por uma única conexão ssh. Portanto, executar 30 comandos "ssh" não é problema, mesmo com MaxSessions 20. As sessões mencionadas são sobre encaminhamento de porta (e até mesmo com mais de um shell aberto) usando a mesma conexão, não sobre o número de logins no sistema.
allo
@ todas essas informações que você recebeu da OP?
George Udosen
1
@allo está correto aqui, MaxSessions refere-se à multiplexação de sessão em uma única conexão TCP. A menos que todos os usuários do OP estejam fazendo coisas estranhas para compartilhar uma única conexão TCP com o servidor, esse limite não os afetará. Acabei de verificar isso definindo um limite baixo de MaxSessions em um servidor e abrindo mais do que muitas conexões com ele.
Joe Lee-Moyet
5

A solução de George funciona bem, mas você pediu um script do bash ...

Por isso, considero este um para outras situações em que não há nenhuma opção, como MaxSessionsde sshd, em seguida, você pode usar algo como isto:

if [ "$(pgrep -cx processName)" -gt 20 ]; then pkill -xn processName; fi; 

O pkill -nque matará a instância mais recente do processName.

A solução correta para essa situação especial é a resposta de George.

Ravexina
fonte
Isso também não impediria subprocessos?
RonJohn
Sim, faz com que o subprocesso seja morto também.
Ravexina
2
Então - dado que o bash bifurca muitos subprocessos e eles querem limitar usuários, não processos - isso não parece ser uma resposta útil.
RonJohn
1
@RonJohn Foi uma resposta útil, correspondente aos requisitos do usuário (um script que fecha um processo imediatamente) e para outros usuários provenientes de mecanismos de pesquisa (uma resposta geral ao título) até você editar a pergunta.
Ravexina 29/08/19
Deixe-me entrar aqui. Sei também que este local direciona os usuários para o caminho certo, com base nas perguntas feitas. Se o OP faz uma pergunta e a resposta certa (com base na pergunta do OP) não é necessariamente a melhor prática ou a abordagem correta, acho que alguém tem o direito de declarar isso ou fornecer respostas alinhadas com essa observação. Eu realmente não acho que devemos tomar a opção de decidir qual resposta é a melhor, deixe o OP decidir e eu adoro ver muitas opções de membros bem informados do site. Por favor, vamos sempre ter um debate construtivo que me ajuda, se não qualquer outra pessoa!
George Udosen
4

Eu decidi elaborar e testar o Ravexina 's idéia . Funciona e é eficaz se você deseja restringir o número de conexões ssh estabelecidas.

Primeiro, descobri que quando o daemon ssh está sendo executado sem conexão, há um sshdprocesso. Para cada nova conexão, dois novos sshdprocessos são criados. Portanto, se você deseja um limite de 20 conexões, o limite deve ser 41 (1 + 2x20) em vez de 20.

Então eu criei um arquivo executável, chamado , com a seguinte aparência:/usr/local/bin/limit-sshd

#!/bin/sh
if [ "$(pgrep -cx sshd)" -gt 7 ]
then
    echo '\nThe limit was reached!\n'
    pkill -xn sshd
fi
  • O limite aqui é 7, respectivamente, apenas 3 conexões podem ser estabelecidas e o restante será descartado.

Finalmente, adicionei a seguinte diretiva a /etc/ssh/sshd_config:

ForceCommand /usr/local/bin/limit-sshd; $SHELL
  • A variável $SHELLexecutará o shell do usuário padrão.
  • Um efeito indesejado é que a mensagem de saudação não está mais disponível.
  • Não esqueça de reiniciar o daemon ssh: sudo systemctl restart sshd.service

Aqui está como isso funciona ( clique na imagem para ver uma demonstração animada ):

insira a descrição da imagem aqui

Além disso, percebi que não precisamos matar nada, se modificarmos o script desta maneira:

#!/bin/sh
if [ "$(pgrep -cx sshd)" -gt 7 ]
then
    echo '\nThe limit was reached!\n'
    exit # This line is not mandatory
else
    eval "$SHELL"
fi

E respectivamente /etc/ssh/sshd_configdesta maneira:

ForceCommand /usr/local/bin/limit-sshd
pa4080
fonte
2

A questão não está clara. Deixe-me contar primeiro como eu o entendo e de que maneira, na OMI, deve-se perguntar:

Temos uma rede local onde um servidor fornece um aplicativo específico. Nossa equipe acessa esse aplicativo via conexão ssh de seus computadores com o servidor usando o PuTTY. Cada membro da equipe tem sua própria conta de usuário usada para estabelecer as conexões ssh ( ou talvez: todos os membros da equipe usem uma conta de usuário comum).

Os membros da equipe não usam o servidor para outros fins e queremos limitar o número de suas conexões ssh para 20, independentemente de quantas conexões ainda sejam estabelecidas por um usuário específico ( ou talvez: 20 conexões por usuário).

Se essa interpretação estiver correta, provavelmente uma maneira correta de atender aos requisitos é criar um grupo de usuários , adicione todas as contas de usuário a esse grupo e limite o número de maxlogins via /etc/security/limits.conf.

  1. Crie um grupo, chamado, por exemplo the-app-maxlogins, com o ID do grupo 10 000:

    sudo groupadd -g 10000 the-app-maxlogins
  2. Adicione os usuários a esse grupo - sudo adduser <user> <group>:

    for user in "user1" "user2" "user3"; do sudo adduser "$user" the-app-maxlogins; done
  3. Adicione a próxima linha a /etc/security/limits.confpara limitar o maxlogins de todo o grupo :

    %the-app-maxlogins      -       maxlogins       20

    Ou adicione a seguinte linha para limitar o número máximo de logins por usuário do grupo :

    @the-app-maxlogins      -       maxlogins       20
  4. Edite /etc/ssh/sshd_confige adicione as seguintes linhas na parte inferior (!) Do arquivo para desativar a multiplexação de sessão para esse grupo (provavelmente isso não é obrigatório nesse caso):

    Match Group the-app-maxlogins
        MaxSessions 1

Essa solução limitará o número de logins dos usuários afetados, independentemente do ssh ou tty. Se você deseja aplicá-lo a um determinado usuário e não a um grupo, adicione uma linha como a seguir limits.confou coloque-a em um .confarquivo separado dentro do diretório /etc/security/limits.d/:

username      -       maxlogins       20

Uma explicação simples do real significado da diretiva MaxSessionsé fornecida nesta resposta . A principal fonte da resposta atual é outra resposta sob a mesma pergunta de pesquisa e desenvolvimento.

A outra resposta minha poderia fornecer uma solução alternativa de alguma forma, mas é um tipo de solução divertida e não verdadeira.

pa4080
fonte