Não é possível obter o módulo proprietário iptables (gid-owner) para funcionar

2

No meu laptop do Ubuntu 16.04, estou tentando configurar as regras iptables para que o acesso à Internet seja negado a todos os aplicativos por padrão e permitido somente a um grupo chamado internet . Não adicionarei esse grupo ao meu próprio login, mas use sudo -g ou sg para acessar a Internet sempre que quiser. Por exemplo:

sudo -g internet firefox

ou

sg internet -c "firefox"

No entanto, esta abordagem não está funcionando. A seguir está a regra iptables que adicionei:

/sbin/iptables -A OUTPUT -p tcp --dport 80  -m owner --gid-owner internet   -j ACCEPT
/sbin/iptables -A OUTPUT -p tcp --dport 443  -m owner --gid-owner internet   -j ACCEPT
/sbin/iptables -A OUTPUT -p udp --dport 53  -m owner --gid-owner internet   -j ACCEPT

Eu testei as regras acima, quando eu removo o módulo proprietário, ele funciona perfeitamente e a internet é permitida para todos os aplicativos. Mas quando eu adiciono o módulo proprietário e o filtro gid-owner , nenhum aplicativo é capaz de acessar a Internet (mesmo usando os comandos sg e sudo -g mencionados).

O que estou fazendo de errado?

    
por Prahlad Yeri 27.06.2017 / 18:24

3 respostas

2

Depois de muita tentativa e erro, consegui encontrar a resposta para a minha própria pergunta. O problema não era com o iptables ou com a versão do Ubuntu / Linux que eu estava usando, mas sim com a terceira regra:

/sbin/iptables -A OUTPUT -p udp --dport 53  -m owner --gid-owner internet   -j ACCEPT

Como udp/53 port é usado para a resolução de nomes DNS, os serviços de segundo plano como dnsmasq poderiam usá-los, portanto a resolução de nomes não estava acontecendo quando tentei executar um programa com o grupo internet como esses outros serviços não estava naquele grupo. No entanto, o ideal é que esses serviços ainda tenham acesso à porta, pois eles estão sendo executados na conta root ( e root podem fazer qualquer coisa! ), mas o design do módulo proprietário iptables parece não respeitar tais privilégios de root .

Assim que eu removi a verificação do módulo proprietário desta última regra, a internet começou a funcionar:

/sbin/iptables -A OUTPUT -p udp --dport 53 -j ACCEPT

Editar

Outro problema, não diretamente vinculado, mas relacionado, é usar o módulo proprietário para o grupo raiz. Estamos inclinados a atribuir o acesso do grupo raiz à Internet (além de ou em vez do grupo internet ) assim:

/sbin/iptables -A OUTPUT -p tcp --dport 80  -m owner --gid-owner root   -j ACCEPT

No entanto, isso não funciona na prática porque muitos aplicativos não usam o usuário root para se conectar à Internet por motivos de segurança. Por exemplo, o seguinte comando não funcionará mesmo depois de fazer o acima:

sudo apt-get update

Isso porque o programa apt usa internamente o usuário _apt para fazer download de pacotes por motivos de segurança.

    
por 28.06.2017 / 00:31
0

Já marcado como resolvido, mas para a sanidade de qualquer outra pessoa que esteja enfrentando esse problema, pensei em elaborar aqui e explicar a causa real do problema que você descobriu. O problema é com iptables . Especificamente, ele não manipula a filtragem de ID de grupo como nós, humanos, esperamos. Não tenho certeza se é o WAD ou um bug. IMHO, é um erro no código de extensão iptables -m owner .

O problema está no tratamento de --gid-owner . Parece que o código extensões iptables não filtra o ID do grupo literalmente (ou seja, o usuário está neste grupo, sim ou não?). É evidente a partir do comportamento do módulo que ele se aprofunda e examina as configurações de nome de usuário e, em seguida, toma uma decisão com base na associação ao grupo principal do usuário. Isso é versus um exame literal da lista de membros do grupo (esperada por mim e por outras pessoas que tiveram esse problema). Esse comportamento não está documentado em nenhuma das páginas do manual relevantes.

A implementação do iptables no Ubuntu apenas examina o grupo primário do proprietário do pacote de rede atual. Digamos que você queira criar uma VPN dividida, em que um grupo de usuários específico vpn terá seu tráfego forçado para a interface da VPN.

Se você especificar cada proprietário, o parâmetro --uid-owner na extensão -m owner funcionará como esperado. Então, digamos que você tenha vários nomes de usuários que deseja ramificar, e a lista de usuários pode mudar com o tempo. Então, você decide que seria mais eficiente usar a filtragem de ID do grupo ( --gid-owner ). Você coloca todos os usuários de tráfego VPN em um único grupo chamado vpn e altera o parâmetro iptables para --gid-owner vpn . Como você viu, em muitos casos, o filtro não funciona como esperado. Por quê?

Apenas o grupo principal / padrão do proprietário do pacote será comparado. Portanto, qualquer nome de usuário que você tenha adicionado ao seu grupo vpn depois que o usuário foi criado, estará no grupo vpn como usuário secundário e eles ganharam ser ramificada mesmo sendo um membro do grupo!

A razão pela qual o usuário 'root' não funcionou para você é porque seu grupo principal / padrão é 'root'.

Exemplo ilustrado

Digamos que você tenha um nome de usuário vpn no grupo primário vpn e nome de usuário testdummy no grupo primário teste mas testdummy também é um membro do grupo vpn . Para testdummy , vpn é um grupo secundário.

Esta regra iptables marcará os pacotes pertencentes ao usuário vpn , mas não ao usuário testdummy , embora instintivamente se pense que os pacotes de ambos os usuários serão marcados porque ambos pertence ao grupo vpn :

iptables -t mangle -A OUTPUT ! -d 192.168.1.1 -m owner --gid-owner vpn -j MARK --set-mark 0x1

Para resolver o problema, você terá que criar outra regra, como esta solução:

iptables -t mangle -A OUTPUT ! -d 192.168.1.1 -m owner --gid-owner vpn -j MARK --set-mark 0x1
iptables -t mangle -A OUTPUT ! -d 192.168.1.1 -m owner --uid-owner testdummy -j MARK --set-mark 0x1
    
por 30.12.2017 / 18:59
-1
/sbin/iptables -A OUTPUT -p tcp --dport 80  -m owner ! --gid-owner root -j DROP
    
por 19.12.2017 / 02:30