Original em formato texto com marcações para conversão em HTML, processo automatizado com scripts e txt2tags
Minha colinha, linhas de comando para copiar e colar em algumas distribuições.
Cuidado com a segurança, knock é somente mais um item na lista de procedimentos.
Com knock seu servidor de ssh fica sempre fechado para o mundo, quando bater na porta certa ele executa a regra de firewall que abre a porta somente para seu IP. Mais uma forma de implementar segurança, o serviço fica fechado para o mundo, abrindo somente para você no momento desejado.
Tomemos como exemplo ssh que é muito utilizado em conexões remotas, muitos utilizam eventualmente mas deixa aberta o tempo todo, estas maquinas recebem milhares de ataques diários. Procure nos logs de sua instalação pelos registros de scanners para ssh, em uma maquina sem knock tenho notado mais de 1000 tentativas diárias.
Como exemplo, segue o resultado de login inválido em uma maquina do dia 1 a 16 de setembro de 2006.
cat /var/log/messages | grep Invalid | wc -l 13078
Parte deste log, observe o intevalo de tempo e nomes na tentativa de acertar um usuário, esta lista é grande, são varias listas rodando na net, um dia podem acertar o seu, o melhor é manter a porta fechada impedindo estas tentativas.
cat /var/log/messages | grep Invalid
--corta-- Sep 16 16:30:48 linux-speedy sshd[5895]: Invalid user Aaliyah from 200.35.163.41 Sep 16 16:30:50 linux-speedy sshd[5904]: Invalid user Aaron from 200.35.163.41 Sep 16 16:30:52 linux-speedy sshd[5934]: Invalid user Aba from 200.35.163.41 Sep 16 16:30:55 linux-speedy sshd[5936]: Invalid user Abel from 200.35.163.41 Sep 16 16:30:57 linux-speedy sshd[5938]: Invalid user Jewel from 200.35.163.41 Sep 16 16:31:02 linux-speedy sshd[5942]: Invalid user users from 200.35.163.41 Sep 16 16:31:04 linux-speedy sshd[5944]: Invalid user admins from 200.35.163.41 Sep 16 16:31:07 linux-speedy sshd[5946]: Invalid user admins from 200.35.163.41 Sep 16 16:31:11 linux-speedy sshd[5948]: Invalid user Zmeu from 200.35.163.41 Sep 16 16:31:19 linux-speedy sshd[5972]: Invalid user michi from 200.35.163.41 --corta--
Com knock a porta fica fechada, não permitindo nem tentativas de conexão, para abrir usamos um batedor, uma forma de cliente que vai bater em portas escolhidas por você, sem relação alguma com ssh e somente você sabe quais são. Quando o servidor receber esta seqüência de batidas na porta, ele executa a regra de iptables que abre a porta. Permitindo conexão exclusivamente para o IP do batedor. Vale lembrar que deve fechar a porta assim que entrar, a regra que fecha a porta mantém as conexões existentes, proíbe novas conexões e não aparece nos scanners de rede.
A regra de firewall padrão tem que fechar a porta 22, a abertura será feita no momento que receber as batidas na porta, quando aberta deve mostrar no resultado de iptables -L
que abriu a porta somente para o IP do batedor, algo como neste exemplo.
ACCEPT tcp -- 192.168.1.211 anywhere tcp dpt:ssh
Dica, tem comando próprio para fechar a porta, como pode ficar aberta por esquecer de fechar ou outro motivo. Rodar um script no crontab para fechar a porta pode ser muito interessante, não perde tempo como o comando para fechar, o intervalo de tempo e script fica a critério de cada um. Pode até rodar o script de firewall que zera as regras fechando a porta, é muito importante manter a porta fechada, use um escript para fazer isto por você.
#!/bin/sh /etc/rc.d/fireaula.sh
Nâo testei com outras portas como webmin, nem com regras de redirecionamento de VNC. Acho possível como também executar outros comandos em lugar da regra do iptables.
Tem o rpm da distro para servidor e cliente, é só instalar e alterar a porta para melhorar a segurança. Veja o resultado da pesquisa com smart.
smart search knoc knock - A Port-Knocking Client knock-debuginfo - A Port-Knocking Client knockd - A port-knocking server knock - A Port-Knocking Client knock-debuginfo - A Port-Knocking Client knockd - A Port-Knocking Client nc6 - A Port-Knocking Client nc6-debuginfo - A Port-Knocking Client
Depois de instalado consulte o manual
man knockd knockd -h man knock
Servidor com duas placas de rede, dependendo da rede pode liberar ssh para rede interna e aplicar knock somente na eth que está de cara para o mundo, tudo depende se seu ambiente e regras de firewall.
Instalar servidor " knockd "
smart install knockd chkconfig knockd on # Evite usar a configuração padrão. Edite e altere as portas no arquivo de configuração /etc/knockd.conf #vi /etc/knockd.conf
Depois de instalado precisa deixar rodando knockd, a seguir exemplo de linha de comando, escolha conforme a placa de rede (eth). A escolha da eth é na linha de comando, a configuração das portas e sequência fica em /etc/knockd.conf.
knockd -i eth0 -d -c /etc/knockd.conf knockd -i eth1 -d -c /etc/knockd.conf
Coloque esta linha no /etc/rc.d/boot.local para executar junto com o boot, ajuste a eth conforme sua instalação
echo "knockd -i eth0 -d -c /etc/knockd.conf" >> /etc/rc.d/boot.local
Neste exemplo controla somente a eth indicada na linha de comando acima, em micros com duas placas de rede, como exemplo micros que compartilha internet, pode aplicar as regras somente na interface de cara para o mundo e deixar a outra liberada. Portanto ajuste eth? na linha de comando dos exemplos acima, no firewall fica liberada a interface interna e fechada a interface externa, knockd fica responsável pela abertura da interface externa.
Lado servidor, micro rodando servidor ssh, micro de cara para o mundo que deseja proteção nas conexões via ssh. Neste micro instale o pacote servidor " knockd "
smart install knockd chkconfig knockd on # Evite usar a configuração padrão. Edite e altere as portas no arquivo de configuração /etc/knockd.conf #vi /etc/knockd.conf
Depois de instalado precisa deixar rodando knockd, a seguir exemplo de linha de comando para placa de rede eth0, abrir ou fechar a porta quando baterem nas portas definidas em /etc/knockd.conf
knockd -i eth0 -d -c /etc/knockd.conf
Coloque esta linha no /etc/rc.d/boot.local para executar junto com o boot
echo "knockd -i eth0 -d -c /etc/knockd.conf" >> /etc/rc.d/boot.local
Neste exemplo controla somente a eth0, em micros com duas placas de rede, como exemplo micros que compartilha internet, pode aplicar as regras somente na interface de cara para o mundo e deixar a outra liberada. Portanto no firewall fica liberada a interface interna e fechada a interface externa, knockd fica responsável pela abertura da interface externa.
O conf do suse 10.1 falhou, nem procurei pela solução. Usei a cópia do kubuntu e funcionou sem problemas, a seguir copia de /etc/knockd.conf
[options] logfile = /var/log/knockd.log [openSSH] sequence = 7000,8000,9000 seq_timeout = 5 command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT tcpflags = syn [closeSSH] sequence = 9000,8000,7000 seq_timeout = 5 command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT tcpflags = syn
Lado cliente, origem da conexão. Neste micro instale o batedor, pacote cliente " knock "
smart install knock
Para conectar via ssh, primeiro tem que bater nas portas, são aquelas que estão configuradas na maquina remota (servidor), ao bater nas portas será executada a regra de iptables que abre a porta 22 permitindo conexão remota via ssh, isto tudo está configurado no lado servidor, tudo isto pode e deve ser alterado para outros valores, fica por conta de sua criatividade.
Em resumo, tem que executar duas linhas de comando, uma para o batedor e outra para conexão, veja um exemplo.
knock 200.200.200.200 7000:tcp 8000:tcp 9000:tcp ou em um script, use sleep para os dois comandos não chegarem junto e falhar o ssh knock 192.168.1.203 7000:tcp 8000:tcp 9000:tcp sleep 3 ssh zago@192.168.1.203
Feche a porta assim que entrar, o comando tem o mesmo formato, muda as portas conforme o /etc/knockd.conf
knock 192.168.1.203 9000:tcp 8000:tcp 7000:tcp
Use script com a linha de comando do batedor mais a linha de comando ssh, algo como neste exemplo.
cat sshzago
#!/bin/sh knock 200.200.200.200 1100:tcp 8100:tcp 9800:tcp sleep 3 ssh zago@200.200.200.200
Faça testes, use duas estações da rede interna, caso não tenha um firewall, pode usar este como modelo.
http://www.zago.eti.br/modelos/fireknock.sh
Kubuntu 6.10 (Edgy Eft)
smart search knock
knockd - small port-knock daemon knocker - a simple and easy to use TCP security port scanner
smart install knockd
Arquivos de configuração
/etc/knockd.conf /etc/default/knockd
Não encontrei este pacote no CD de instalação.
Instalar a partir do fonte requer compilador "c" gcc
apt-get install gcc wget "http://www.zeroflux.org/knock/files/knock-0.5.tar.gz" #No diretório onde salvou tar -xvzf knock-0.5.tar.gz cd knock-0.5 ./configure make make install
Resultado:
make retornou varios erros, (ultimas linhas de erro) src/knockd.c:1189: error: `DLT_RAW' undeclared (first use in this function) src/knockd.c:1245: error: dereferencing pointer to incomplete type make: ** [src/knockd.o] Erro 1 make install retornou varios erros, (ultimas linhas de erro) src/knockd.c:1187: error: `DLT_LINUX_SLL' undeclared (first use in this function) src/knockd.c:1189: error: `DLT_RAW' undeclared (first use in this function) src/knockd.c:1245: error: dereferencing pointer to incomplete type make: ** [src/knockd.o] Erro 1
Precisa resolver este problema para continuar, nem procurei pela solução porque estou trocando as instalações do CL10.
A porta a ser aberta pelo knock precisa ficar fechada no firewall, quem usa politica padrão de fechar tudo, já está fechada e não precisa fazer mais nada. Uma sugestão de regras para ssh (porta 22)
#$iptables -A INPUT -p tcp --dport 22 -i $EXTERNA -j ACCEPT $iptables -A INPUT -p tcp --dport 22 -i $INTERNA -j ACCEPT
Observe a linha da interface externa com o comentário #, coloque aqui somente para mostrar as regras para liberar por interface de rede, sendo uma para rede interna e outra para rede externa, quando comentada não será executada. A regra padrão no meu firewall é fechar tudo e abrir depois, com esta linha comentada não abre a conexão na interface externa. A outra regra libera ssh somente para rede interna.
Algumas regras paleativas, quando não conseguir rodar o knock, pode incluir regras no firewall para liberar acesso especifico para um determinado IP, também pode alterar a porta de 22 para outra, algo como 2222
Exemplo de regra que permite conexão somente com origem no IP 200.204.198.164
/usr/sbin/iptables -A INPUT -s 200.204.198.164 -p tcp --dport 22 -j ACCEPT
Regras para fechar a porta por interface de rede
iptables -A INPUT -p tcp -i eth0 --dport 22 -j DROP iptables -A INPUT -p tcp -i eth0 --dport 22 -j REJECT fechar tudo. iptables -A INPUT -p tcp --dport 22 -j DROP Passar IP por variável iptables -A INPUT -p tcp -s $IP_PERMITIDO1 --dport 22 -j ACCEPT