Como posso desconectar usuários ssh ou limitar o número de logins ssh?

5

Eu tenho um aplicativo que está usando o ssh para autenticar. Devido a uma variedade de regulamentações (HIPAA, etc), os usuários só podem estar logados por um determinado período de tempo, e eles só podem ser registrados uma vez.

Eu gostaria que o sshd desconectasse automaticamente um usuário se outra, segunda conexão, fosse tentada. A ideia é: o usuário 1 está conectado. O usuário 2 usa as credenciais do usuário 1 para tentar efetuar login. ambos são chutados (não temos certeza se o usuário 1 ou o usuário 2 é legítimo).
Se isso acontecer mais de X vezes em Y minutos, a conta ficará congelada até que um administrador descongele (provavelmente devido a uma redefinição de senha).

Neste momento, os usuários são colocados em sandbox em seus próprios diretórios scponly ; Não tenho certeza se isso importa.

Tentar matar conexões sshd individuais é como jogar whackamole, e eu prefiro que isso seja algo que o sshd faz por si só, e não um script em nível de raiz.

EDITAR : está em

2.6.31-22-server #73-Ubuntu SMP

E meu arquivo limits.conf contém linhas como:

user1      hard   maxlogins    1
user2      hard   maxlogins    1

e meu arquivo sshd_config contém a linha:

UsePAM yes

No entanto, ainda posso fazer login como usuário1 em várias máquinas diferentes. O que estou fazendo errado aqui, para que eu possa pelo menos bloquear o user1 de ter vários logins?

    
por mmr 26.01.2011 / 20:48

5 respostas

5

Configurar o limite de maxlogins realmente funciona aqui. Apenas certifique-se de usar '-' limit type, não 'hard'.

user1          -       maxlogins       1

Se você quer chutar os usuários que fizeram login duplo usando scponly, aqui está um script rápido e sujo, que faz isso. Coloque-o no crontab, para que seja executado a cada minuto.

#!/bin/sh

for user in 'grep scponly /etc/passwd | gawk -F: '{print $1}''; do 

    echo "Checking user: $user"
    instances='ps -u $user| grep scponly | wc -l'
    echo "scponly instances  $instances"
    if [ $instances -gt 1 ] ; then
        echo "Too many connections detected, slaying scponly for user $user"
        if [ -e /tmp/$user ] ; then
            attempts='cat /tmp/$user'
            echo "Detected $attempts attempts"

            # increment attempts counter
            echo $(($attempts+1)) > /tmp/$user

            if [ $attempts -gt 3 ] ; then
                echo "Blocking $user"
                /usr/sbin/usermod -L $user
            fi

        else
            echo "1" > /tmp/$user
        fi
        killall -u $user scponly

    fi
done

Faça o download do script: link

    
por 09.03.2011 / 20:02
2

Você pode olhar para /etc/security/limits.conf para este tipo de limite. link

Existe um limite de 'maxlogins' que pode ser configurado por usuário ou por grupo de usuários. Isso não desconectará as sessões anteriores, mas restringirá as sessões simultâneas.

    
por 26.01.2011 / 20:58
1

Como você está usando um shell especial sem habilidades de execução remota, não é possível fazer um pequeno hack no shell de login. Seria muito fácil descobrir apenas se eles já estão conectados e, se não estiverem, registre-os.

Nós costumávamos ficar ociosos, o que fez exatamente isso. ( link ou link ), Não parece que está tudo bem mantido agora, desde que o PAM ganhou vida.

O PAM oferece a você um meio de fazer o que você quer, veja a lista de módulos do PAM aqui: link

Qualquer um provavelmente não faz todas as coisas que você quer, mas juntos você pode fazer o que quiser, ou até mesmo escrever seu próprio módulo. Como o @DerfK disse, você precisa configurar o SSH para usar o PAM.

    
por 09.03.2011 / 19:48
1

Os limites do PAM não capturam conexões scp ou sftp porque eles não são alocados nem escritos para o utmp.

    
por 09.03.2011 / 21:57
0

Se é por causa de razões contábeis, como mencionado nos comentários, você pode querer olhar para os Utilitários de Contabilidade do GNU . Isso permitirá que você faça tudo, inclusive ver quais usuários executaram o processo, por quanto tempo e quanto de CPU e RAM eles tiraram. Isso requer suporte ao kernel, mas a maioria das distribuições modernas já terá compilado.

    
por 27.01.2011 / 00:01

Tags