
Eu tenho um script php, digamos file.php que contém:
<?php
exec("ip netns exec vpn file2.php");
?>
Se eu executar file.php através da linha de comando, como root, ele funciona. No entanto, quando eu executo via Apache, www-data não tem permissão para usar ip netns exec, no entanto, www-data pode usar ip netns list.
Como faço para a) deixar o ip netns exec ser executado por usuários não root ou conceder ao www-data as permissões para executar o material do ip net exec?
Responder1
Tente algo como
# ip netns exec vpn sudo -u www-data apache
como raiz.
Dessa forma, o Apache será executado com netns como usuário não root. Se você precisar dos dois namespaces ao mesmo tempo, inicie duas instâncias, cada uma em um namespace. Alterar o namespace dinamicamente não parece funcionar.
Explicação:
O diretório /var/run/netns
armazena todos os namespaces da rede, quando adicionamos um novo "abc", o arquivo vazio "abc" é criado neste diretório. Cada vez que executamos o programa "xyz" no namespace "abc" , ip(1)
abre e mantém um descritor de arquivo para /var/run/netns/abc
, depois chama unshare(2)
e setns(2)
.
Então aí vêm as duas barreiras. Uma são as permissões do sistema de arquivos /var/run/netns/*
e a outra são os recursos para syscalls privilegiados.