Substituição de comando usando grep'ed e sed'ed tail -f output como fonte de argumento no comando 'at'

2

Isto é para um sistema de vigilância em casa, servidor headless rodando o Ubuntu 15.04, e eu quero que sua segurança seja exemplar. Eu imagino uma solução de linha de comando (com script opcional, se for absolutamente necessário) monitorando os testes IP de lookers / hackers registrados no meu ufw.log e colocando-os na lista negra em tempo real se eles não portarem corretamente. Até agora eu tenho:

tail -n+1 -F /var/log/ufw.log | 
  grep -v --line-buffered '0.0.0.0' | 
    sed -e 's/BLOCK/&/g' -e 's/.*SRC\=//g' -e 's/\ DST.*//g'

que gera para stdout uma transmissão ao vivo de sondas que atingem IPs. Estes são os IPs que eu quero colocar na lista negra de x (3?) Minutos de 'now'. Isso dá aos usuários legítimos tempo para serem colocados na lista de permissões primeiro por batidas de porta. Estou usando o comando ufw insert para black-e-whitelisting, o que significa que a listagem acontece primeiro.

A parte da lista de permissões está funcionando bem agora. Em seguida, quero desenvolver o comando 'at' que executa corretamente o comando ufw insert 1 deny from x.x.x.x , em que x.x.x.x vem do comando tail supracitado.

Minha primeira tentativa é algo como

ufw insert 1 deny from $(tail -n+1 -F /var/log/ufw.log | 
   grep -v --line-buffered '0.0.0.0' | 
   sed -e 's/BLOCK/&/g' -e 's/.*SRC\=//g' -e 's/\ DST.*//g');
ufw reload | 
   at now +3 minute'

mas nenhum comando at é gerado conforme mostrado por at -l . Alguém pode ver o que estou fazendo de errado com esse comando?

NOVOS PENSAMENTOS - Estou pensando que o comando tail -F deve ser o começo. Qualquer outra maneira parece apenas processar uma única linha do arquivo de log do ufw.

Para o seu curioso, as regras de batida de porta que eu tenho no lugar agora podem e fazem lista negra, mas muito limitadamente porque eu tenho que definir o comportamento de sondagem antecipadamente nas regras. Então, se eles vão para as portas 22 duas vezes ou 21 duas vezes ou 443 duas vezes, eles ficam na lista negra agora. Mas vejo as sondagens acontecendo para portas no intervalo de 55xxx, 4 ou 5 sondas para portas diferentes. Eu não vejo como estes podem ser razoavelmente caracterizados em regras de firewall, mas o que eu certamente posso fazer é logar com ufw todas as sondagens que passam pela whitelist e blacklist na seção final deny + log. Eu quero dar a eles x minutos para portar corretamente, então a parte 'ufw' deste comando agendada pela parte 'at' será executada.

Obrigado!

muru me pegou muito perto. Aqui está o estado atual do progresso, mas note que o ufw tem uma propensão para este erro: ERROR: initcaps
[Errno 2] iptables: Chain already exists.
Então eu não acho que ele funciona robustamente o suficiente com o iptables para lidar com essa integração muito bem. Eu acho que é melhor usar comandos iptable diretamente em vez de ter ufw interpretar.

tail -F /var/log/ufw.log | 
  grep -v --line-buffered '0.0.0.0' | 
  sed -e 's/BLOCK/&/g' -e 's/.*SRC\=//g' -e 's/\ DST.*//g' | 
  while read IP; do
    echo ufw insert 1 deny from "$IP" | 
      at now +3 minute;
    echo ufw reload | at now +3 minute; 
  done 

OBSERVE QUE AS POSIÇÕES NÃO EXIBIDAS NESTE TEXTO, MAS NECESSITA AS ADICIONAR, PENSAM. ELES PARTICIPARAM DE CADA COMANDO ECHO E APÓS CADA PALAVRA-CHAVE MINUTE.

A maneira como isso falha agora tem a ver com 'tail -F' inserido na construção 'while': com cada linha anexada ao arquivo ufw.log, o arquivo INTEIRO é realimentado no loop 'while' apenas daquela linha recém-anexada. Eu procurei meu coração e não consigo localizar o caminho em volta disso. Ajuda por favor.

    
por kenneth558 23.09.2015 / 23:56

2 respostas

1

A correção que eu precisava: stdbuf -o0 para sed e awk contidos na linha de comando, assim:

tail -F /var/log/ufw.log|grep --line-buffered ...... | stdbuf -o0 sed ..... | stdbuf - o0 awk ...... |

Pode usar stdbuf -o0 com o grep também, em vez de --line-buffered. Isso é o que stdbuf -o0 faz - buffers de linha, que é o que o comando precisava no meu caso. É claro que o resto do comando precisava ser montado e refletido em 'at', mas essa parte era direta o bastante para mim (usando o awk pesadamente) assim que obtive o aspecto de buffer de linha conquistado. Eu acabei precisando de um script para facilitar a entrada manual, bem como desses endereços IP para a lista negra, juntamente com uma tarefa adicional ou duas, conforme mencionado abaixo.

Eu inicio o processo @reboot com o comando acima descrito em crontab tail-ing /var/log/kern.log, onde o iptables registra os pacotes de sondagem. Esse comando envia cada endereço IP de prova com tempo e detalhes de pacote em um script bash. Esse script bash, ao criar o comando iptables blacklisting final, transforma o /var/log/knockd.log em uma seqüência de knock iniciada com sucesso ('Stage n'), neste caso, envia uma versão do comando blacklist-IP construído em script 'at' para entrada na lista negra 3 minutos depois. Caso contrário, o comando blacklist-IP construído por script é executado imediatamente. Se a batida de porta for bem-sucedida, o IP será colocado na lista branca [FUTURE - o que impede que o comando IP de Lista Negra programado seja bem-sucedido (a versão do comando planejada em 'at' começará checando a presença de IP na lista de permissões)].

Estou dando os toques finais, como a versão agendada 'at' para verificar a presença da lista de permissões. Parei de usar o ufw e simplifiquei minha vida controlando o iptables diretamente. Não fail2ban, porque era muito inchado para o meu gosto apenas para garantir um sistema privado, apenas whitelist. Agora, sempre que qualquer porta do meu sistema for sondada apenas uma única vez, esse endereço IP será colocado na lista negra. Aqui estão algumas linhas do meu iptables, lista negra segue a lista de desbloqueio, não são mostradas são as regras de LOG e DROP no final (DROP necessário apenas se política = ACEITAR). Mais tarde eu vou compactar em sub-redes quando me apetecer.

(Desculpe a formatação se perdeu) Chain INPUT (política ACCEPT 0 pacotes, 0 bytes) um destino de destino de pkts bytes opt in out destino de origem
1 0 0 ACEITAR tudo - eth0 * xxx.72.26.233 0.0.0.0/0
2 592 53357 ACEITAR todos - * * 0.0.0.0/0 0.0.0.0/0 ctstate RELACIONADO, ESTABELECIDO 3 98 5922 ACEITAR tudo - lo * 0.0.0.0/0 0.0.0.0/0
4 0 0 ACEITAR tudo - eth1 * 0.0.0.0/0 0.0.0.0/0
5 1 60 ACEITAR todos - eth0 * xx.179.31.188 0.0.0.0/0 / * knocked Sun Oct 25 16:33:53 CDT 2015 * / 6 0 0 ACEITAR tudo - eth0 * xxx.32.31.196 0.0.0.0/0 / * servidor isp Seg Oct 26 12:43:59 CDT 2015 * / 7 0 0 ACEITAR tudo - eth0 * xxx.142.225.5 0.0.0.0/0 / * servidor isp seg Out 26 12:43:45 CDT 2015 * / 8 0 0 ACEITAR tudo - eth0 * xxx.32.31.195 0.0.0.0/0 / * servidor isp seg Out 26 12:43:31 CDT 2015 * / 9 0 0 ACEITAR tudo - eth0 * xxx.72.26.254 0.0.0.0/0 / * servidor isp seg Out 26 12:43:11 CDT 2015 * / 10 1 118 DROP all - eth0 * 185.86.148.68 0.0.0.0/0 / * kern.log 27 de outubro 22:29:53 PROTO = UDP SPT = 56177 DPT = 1900 * / 11 0 0 DROP all - eth0 * 184.105.247.220 0.0.0.0/0 / * kern.log Out 27 22:22:30 PROTO = UDP SPT = 53700 DPT = 53413 * / 12 0 0 DROP all - eth0 * 195.211.154.179 0.0.0.0/0 / * kern.log 27 de outubro 22:21:49 PROTO = TCP SPT = 48465 DPT = 21320 * / 13 2 120 DROP all - eth0 * 75.111.59.88 0.0.0.0/0 / * kern.log 27 de outubro 22:21:37 PROTO = TCP SPT = 35727 DPT = 23 * / 14 0 0 DROP all - eth0 * 74.82.47.16 0.0.0.0/0 / * kern.log 27 de outubro 22:17:34 PROTO = TCP SPT = 38695 DPT = 27017 * / 15 0 0 DROP all - eth0 * 1.93.3.124 0.0.0.0/0 / * kern.log 27 de outubro 22:16:33 PROTO = TCP SPT = 1414 DPT = 1433 * / 16 0 0 DROP all - eth0 * 184.105.139.96 0.0.0.0/0 / * kern.log 27 de outubro 22:12:42 PROTO = UDP SPT = 51153 DPT = 123 * / 17 0 0 DROP all - eth0 * 121.230.163.125 0.0.0.0/0 / * kern.log 27 de outubro de 21:57:06 PROTO = ICMP * / 18 0 0 DROP all - eth0 * 120.132.50.66 0.0.0.0/0 / * kern.log 27 de outubro de 21:53:30 PROTO = TCP SPT = 51864 DPT = 1023 * /

    
por kenneth558 28.10.2015 / 04:58
2

A menos que ufw reload e ufw insert produzam um conjunto de comandos que recarregue o firewall, canalizá-lo para at não seria o que você deseja.

Você quis dizer:

echo ufw insert 1 deny from $(tail -n+1 -F /var/log/ufw.log | 
   grep -v --line-buffered '0.0.0.0' | 
   sed -e 's/BLOCK/&/g' -e 's/.*SRC\=//g' -e 's/\ DST.*//g') | at now +3 minute
echo ufw reload | at now +3 minute

Ou combinado:

at now +3 minute <<EOF
ufw insert 1 deny from $(tail -n+1 -F /var/log/ufw.log | grep -v --line-buffered '0.0.0.0' | sed -e 's/BLOCK/&/g' -e 's/.*SRC\=//g' -e 's/\ DST.*//g')
ufw reload
EOF
    
por muru 24.09.2015 / 00:06