Conectando-se a um recurso protegido contra invasão de portas

2

Considerando as excelentes respostas sobre a questão do SF " Prevenindo ataques de força bruta contra o SSH ", estou pensando em configurar a porta batendo em um servidor de teste. Eu estou debatendo como vou me conectar a este servidor e a outros servidores portando ataques facilmente.

Eu geralmente configuro autenticação, endereços e nomes de usuário rsa em /.ssh/config da seguinte forma:

Host msUpdate
    User bgates
    Hostname updates.microsoft.com
    IdentityFile ~/.ssh/id_rsa.bgates.pub

Assim, posso simplesmente digitar ssh msUpdate para efetuar login no servidor. Tanto quanto eu sei /.ssh/config não tem facilidade para configurar a porta batendo. Assim, estou considerando um script de wrapper para ssh que manipulará automaticamente a ocorrência de:

$ cat login
#!/bin/bash

msUpdate=( 2000 3000 4000 )
otherServer=( 1024 2048 4096 )

for PORT in ${$@}; do
    ssh -p $PORT
    sleep 1
done

ssh $@

Minha pergunta é como escrever a linha for . Não consigo fazer com que o script reconheça o argumento como o nome de uma matriz a ser substituída. Embora aparentemente uma pergunta de Bash, eu pergunto sobre SF porque eu sinto que o script completo será mais útil para os usuários deste site, e também porque se houver uma maneira melhor do que provavelmente será aqui que alguém me informará sobre isso.

    
por dotancohen 30.08.2013 / 10:34

2 respostas

2

Você está tentando usar indireção , mas uma matriz associativa (AKA "hash") é a melhor abordagem. Você precisará usar uma linguagem que suporte esse recurso, como Bash 4, AWK, ksh93, Perl, Python, etc.

Se você tiver o Bash 4, poderá usar matrizes associativas da seguinte maneira. Os valores não podem ser matrizes, mas você pode usar listas de portas separadas por espaço, pois os membros da lista não incluirão espaços.

#!/bin/bash

declare -A servers
servers[msUpdate]='2000 3000 4000'
servers[otherServer]='1024 2048 4096'

for port in ${servers[$1]}
do
    ssh -p "$port" "$1"
    sleep 1
done

ssh "$1"

Chame o script com o nome do servidor no qual você deseja fazer login:

./scriptname otherServer

Use algo diferente de "login" para o seu nome de script, já que esse é o nome de um executável existente.

Sempre evite usar nomes de variáveis em maiúsculas para evitar possíveis colisões de nomes com variáveis do shell.

    
por 30.08.2013 / 15:17
2

Você precisa usar o nome da matriz em seu loop for

for PORT in "${msUpdate[@]}"
do
    ssh -p $PORT host.tld
done

Melhor é subjetivo, eu vi port knocking implementado com um script como este mas ele usou o nmap para fazer o knock não ssh

for PORT in "${msUpdate[@]}"
do
   nmap -Pn --host_timeout 100 --max-retries 0 -p $PORT host.tld
done
ssh -p someport host.tld

Você também pode considerar uma alternativa como a autenticação de dois fatores do Duo Security .

    
por 30.08.2013 / 11:12