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).