Linux: interceptando o estabelecimento da conexão

1

Eu quero poder interceptar o estabelecimento da conexão, por exemplo, quer saber quando algum processo (qualquer processo) estabelece uma conexão. Existe uma maneira de conseguir isso?

A única coisa em que consigo pensar é interceptar connect() syscall. Mas pode haver outro jeito? Pode ser quando o contexto de rede é criado em um kernel?

O objetivo é filtrar processos com base em alguns requisitos e ativar / desativar o estabelecimento de conexões em tempo real.

Obrigado antecipadamente.

P.S. Eu estou fazendo isso para fins absolutamente legais.

P.P.S. Eu procurei no google, mas só encontrei como interceptar a conexão já estabelecida (não exatamente o que eu quero). Estou pedindo uma ideia, uma direção de pesquisa, não para um código.

    
por maverik 28.08.2017 / 20:56

2 respostas

6

Para o aspecto de apenas extrair informações, é possível fazer isso com iptables usando correspondências AUDIT (ou possivelmente correspondências LOG se você não precisar de grandes quantidades de informação).

Para o caso de permitir ou não conexões em tempo real com base em algumas regras complexas, não tenho certeza se você pode fazer isso de forma confiável no Linux. As opções incluem:

  • Seccomp-BPF, mas não tenho certeza se ele pode fazer isso (e o filtro seria estático, uma vez instanciado em um determinado processo).
  • Substituindo várias chamadas de soquete usando LD_PRELOAD ou algum outro método. Isso não é confiável porque é fácil ignorar (fazer syscalls diretos é trivial e você também pode dlopen() de qualquer libc e fazer chamadas dessa maneira).
  • O grupo de controle net_cls . Isso requer uma configuração de firewall, pode afetar as conexões ativas e pode não funcionar exatamente como você deseja (será necessário um daemon que mova os processos para o grupo de controle apropriado à medida que eles são iniciados).
  • Se você pode tolerar que alguns dados entrem na rede, você pode usar o alvo NFLOG do iptables e observar conexões interessantes (se você quiser uma avaliação em tempo real, será necessário registrar todas as novas conexões e analisar as coisas no espaço do usuário) e feche de forma reativa as conexões que você não deseja.
  • Você pode executar cada aplicativo em seu próprio namespace de rede e forçar o tráfego de saída através do sistema host e, em seguida, usar o roteamento de políticas com base na origem para controlar o que sai da rede real.

Dito isso, você pode querer reavaliar por que precisa disso. A menos que você esteja alimentando sua tomada de decisão a partir de uma rede neural ou alguma outra abordagem heurística (ambos são opções problemáticas por várias razões), você estará quase sempre melhor codificando as coisas diretamente para o firewall (o iptables pode fazer algumas coisas seriamente complexas, como corresponder apenas conexões usando um protocolo IP específico a uma porta específica iniciada por um determinado UID a uma taxa aleatória distribuída uniformemente e enviar os pacotes não correspondentes a um destino diferente) ou usar ferramentas de agendamento ou outros ganchos para atualizar o firewall regras dinamicamente (por exemplo, alterar as regras de firewall quando o sistema deve estar sem uso ou apenas permitir novas conexões originadas de um determinado UID quando esse usuário estiver logado).

    
por 28.08.2017 / 21:31
0

The goal is to filter processes based on some requirements and enable/disable connection establishment in real-time

netstat -pant |grep -i ESTABLISHED

O comando acima lhe dará uma conexão estabelecida, id do processo / nome_do_aplicativo, usuário

Agora que você tem o que precisa, talvez queira escrever um script bash para continuar com o uso das informações que recebeu do primeiro comando.

Espero que esta ajuda

    
por 28.08.2017 / 21:08