Como proibir o usuário de ligar um soquete em outro endereço que não seja?

2

Eu quero que esse usuário não tenha permissão para vincular portas (efetivamente criando servidores acessíveis mundialmente, embora em portas > 1024) na interface da Internet, mas seja permitido fazer na interface de loopback em certas portas.

Existe algum truque mágico com o iptables ou algo do tipo para obter esse efeito?

Este servidor não executa o SELinux, e seria muito exagerado configurá-lo agora, então prefiro outras soluções, se houver.

    
por Alicia 05.05.2013 / 14:40

1 resposta

0

Eu não vejo a possibilidade de forçar soquetes para uma determinada porta, mas você pode impedir que outras portas sejam usadas com sucesso. Isso pode ser feito por iptables e seu módulo owner . Você pode eliminar todas as respostas de processos pertencentes a esse usuário de endereços não permitidos.

Se esta é uma opção para você e você não sabe como fazê-lo, deixe-me saber e vou entregar um código adicional.

Editar 1

A solução é bloquear todos os pacotes desse usuário que pertence

  1. nem para uma conexão que esse usuário tenha aberto (ou seja, ele não está escutando em nenhuma porta)
  2. nem envia de uma porta permitida.

Você está certo, owner não funciona no INPUT, mas precisamos apenas de OUTPUT. Para tornar as coisas mais fáceis (e mais rápidas) marcamos todos os pacotes permitidos (deste usuário) com 42, todos desaprovados com 41. Marcar os não permitidos seria suficiente.

Funciona assim:

  1. Todos os pacotes (conexões) desse usuário são selecionados para tratamento especial
  2. Todos os pacotes estão marcados com 41 (não permitidos). Para conexões permitidas, isso é sobregravado posteriormente.
  3. Todas as conexões com um primeiro pacote gerado localmente são permitidas
  4. Tudo o que resta não foi criado localmente. Largue tudo não de lo
  5. Agora, permita todas as conexões com uma porta de origem permitida (sorce da resposta, por exemplo, porta local)
  6. Última etapa: descartar todos os pacotes marcados com 41.

Editar 2

A abordagem com a tabela nat falhou (para conexões de entrada porque somente o primeiro pacote de uma conexão é verificado em nat e o primeiro é o que chega a -t nat INPUT somente onde o módulo owner é não disponível). Assim, toda a verificação e marcação é feita na tabela padrão ( filter ) agora.

O script:

#!/bin/bash

# MODIFY NEXT LINE
user=hl

# iptables -F
# iptables -t nat -F
# iptables -t mangle -F

iptables -N user_x &>/dev/null
iptables -N user_x_ports &>/dev/null
iptables -N user_x_allow &>/dev/null
iptables -N user_x_block &>/dev/null


# configure chain user_x_allow  
iptables -A user_x_allow -j CONNMARK --set-mark 42
iptables -A user_x_allow -j ACCEPT

# configure chain user_x_block
iptables -A user_x_block -j CONNMARK --set-mark 41
iptables -A user_x_block -j DROP

# configure chain user_x_ports
# one line for each allowed port  
iptables -A user_x_ports -p tcp --sport 1234 -j user_x_allow

# configure chain user_x
iptables -A user_x -m conntrack --ctstate NEW -j user_x_allow
iptables -A user_x \! -o lo -j user_x_block
iptables -A user_x -j user_x_ports
iptables -A user_x -j user_x_block

# the first two rules are just for checking what happens with "iptables -L -nv"
#       and can be commented out
index=1
iptables -I OUTPUT "$index" -m owner --uid-owner $user; ((index++)) # just count
iptables -I OUTPUT "$index" -m owner --uid-owner $user -m connmark --mark 0; ((index++)) # just count
iptables -I OUTPUT "$index" -m connmark --mark 41 -j DROP # or reset
((index++))
iptables -I OUTPUT "$index" -m connmark --mark 42 -j ACCEPT
((index++))
# this matches non-marked (new) connections only
iptables -I OUTPUT "$index" -m owner --uid-owner $user -j user_x
((index++))
    
por 05.05.2013 / 14:55