Expor portas públicas apenas ao usuário sshed

2

Temos um VPS em execução na AWS, embora seja esperada uma solução genérica, independentemente do fornecedor de hospedagem.

Este VPS está atuando como um Jump Box (rodando o CentOS 6) para vários outros servidores internos, como o acesso SSH a várias outras caixas (que são conectadas ao Jump Box através de SSH reverso). O Jump Box expõe a porta superior aleatória para cada serviço.

Existe a possibilidade de expor essas portas superiores apenas ao endereço IP que atualmente está conectado ao SSH na Jump Box?

Eu estava pensando em verificar a saída de who -a para filtrar o endereço IP e atualizar o IPTABLES usando um cronjob ou talvez atualizar o grupo de segurança da AWS usando a API. Mas essa abordagem parece incompleta. Alguma sugestão?

    
por user1263746 10.11.2017 / 04:27

2 respostas

1

Você pode criar o sistema descrito usando iptables , ipset e pam_exec .

A idéia é a seguinte: Há uma cadeia separada contendo regras para permitir o tráfego de entrada para essas portas mais altas. A cadeia Iptables INPUT contém uma regra ipset que corresponde aos seus hosts logados, pulando para a cadeia separada. No log-in bem-sucedido, um pam_exec executa um script (na sessão do PAM aberta), adicionando o endereço IP do host remoto ao conjunto do ipset e, da mesma forma, o remove quando a sessão do PAM é fechada.

Configurando IPTABLES e IPSET

Crie um conjunto para os endereços IP do usuário. Como os ipsets não são persistentes, você precisa configurar o conjunto a ser criado na inicialização antes que o iptables seja restaurado.

ipset -N users hash:ip

Configure o iptables. Uma nova INPUT-users chain, que conterá as regras para permitir o tráfego de usuários logados.

iptables -N INPUT-users

Se o endereço de origem estiver em users set, salte para INPUT-users chain.

iptables -A INPUT -m set --match-set users src -j INPUT-users

Adicione regras relevantes a INPUT-users chain. Essas regras serão usadas para tráfego com endereço de origem correspondente ao seu usuário. Por exemplo, para permitir tcp port 16384 :

iptables -A INPUT-users -p tcp --dport 16384

Configurando o PAM

Crie os seguintes scripts para serem executados na sessão pam abrir / fechar. O endereço IP estará em PAM_RHOST variável ambiental definida por pam_exec .

/etc/security/pam_exec-session_open :

#!/bin/sh
ipset --exist --add users "$PAM_RHOST"

/etc/security/pam_exec-session_close :

#!/bin/sh
ipset --del users "$PAM_RHOST"

Em seguida, configure o pam para usá-los em sessões ssh. Anexar a /etc/pam.d/sshd :

session optional    pam_exec.so type=open_session /etc/security/pam_exec-session_open
session optional    pam_exec.so type=close_session /etc/security/pam_exec-session_close

Armadilhas

  • Se o seu usuário tiver várias sessões ssh abertas, o fechamento de qualquer uma delas removerá o endereço IP do ipset. Para evitar isso, você precisa escrever uma verificação do script session_close para remover o endereço IP apenas se esta for a última sessão restante do usuário.

  • O seu usuário deve se conectar ao NAT, depois de conectar qualquer pessoa por trás do mesmo NAT irá corresponder à regra do ipset (acesso permitido).

por 19.11.2017 / 13:38
6

Se você conhece seu destino / porta quando está iniciando a conexão ssh

Eu sugeriria, idealmente, que você se conectasse ao JumpBox com algo como ssh -L 8080:10.0.0.1:80 <JumpBox address> , onde você está procurando 10.0.0.1 que está por trás do firewall / NAT mas é acessível ao JumpBox .

Isso cria uma conexão e se liga a 127.0.0.1 (localhost) de tal forma que se você abrir um navegador ( ou algum outro software ) em seu cliente e se conectar a link seus pacotes serão roteados para 10.0.0.1:80 como se você estivesse acessando diretamente do seu JumpBox.

Se os números / destinos das portas não puderem ser conhecidos no tempo de conexão [ssh]

Com a ressalva de que o cliente está configurado para usar um proxy SOCKS / SOCKS5, você pode fornecer acesso para clientes conectados a qualquer recurso acessível ao servidor:

Conecte-se ao seu VPS usando o "Dynamic Forwarding"

  1. ssh -D 1080 <JumpBox address>
  2. Configure o software do cliente para usar o servidor proxy SOCKS localhost:1080
  3. As conexões via software configurado serão encapsuladas de tal forma que é como se você estivesse se conectando a qualquer destino da própria JumpBox.
por 15.11.2017 / 02:56