Forma segura de permitir que qualquer usuário execute programas no namespace de rede específico

7

Eu tenho um modem de celular conectado ao meu servidor que quero usar como meio de receber e-mails de notificação quando o telefone fixo morre.

Para separar bem o acesso normal à rede e esse acesso excepcional ao modem celular, criei um namespace de rede e criei o dispositivo de rede como o único dispositivo. Para que um programa use o modem de celular, simplesmente uso ip netns exec .

O problema é que desejo permitir que qualquer usuário execute qualquer programa que deseje no namespace, mas netns exec requer raiz. Minha solução é a seguinte:

/ usr / local / sbin / _oob_shim:

#!/bin/sh
cmd_line="$@"
/bin/ip netns exec oob \
    /usr/bin/sudo -u "#$SUDO_UID" -g "#$SUDO_GID" /bin/sh -c "$cmd_line"

/ etc / sudoers:

ALL ALL=NOPASSWD: /usr/local/sbin/_oob_shim

Eu acho que a única maneira de executar o shim sem estar root ou saber que a senha do root é através do sudo, e eu posso confiar no sudo para definir $ SUDO_UID e $ SUDO_GID para os valores corretos.

Estou me abrindo para um risco significativo? Ou, devo dizer, estou perdendo alguma advertência óbvia?

    
por Michael Shick 13.03.2015 / 05:43

1 resposta

5

O único erro que vejo com o seu código é que você está executando o comando do usuário desnecessariamente através de sh -c quando você deve executá-lo diretamente. Executá-lo através de sh -c não compra nada, mas destrói a citação que o usuário originalmente colocou no comando. Por exemplo, tente isto:

sudo /usr/local/sbin/_oob_shim ls -l "a b"

deve listar um arquivo chamado a b dentro do contexto do namespace, mas em vez disso, ele lista dois arquivos chamados a e b .

sudo /usr/local/sbin/_oob_shim ls -l "*"

deve listar um arquivo chamado * (asterisco literal), falha pelo mesmo motivo.

Então, deve ser assim:

#!/bin/sh
/bin/ip netns exec oob \
    /usr/bin/sudo -u "#$SUDO_UID" -g "#$SUDO_GID" -- "$@"

Torna o script mais simples para inicializar!

Outro ponto que posso fazer é que, embora nesse caso o bug fosse apenas um bug de funcionalidade, não um bug de segurança, sempre é suspeito ao auditar código sensível à segurança e descobrir que ele executa coisas através de shells, porque isso é quase sempre problema.

Finalmente, os grupos suplementares do usuário não serão propagados para o namespace (eles obtêm apenas seus uid e main gid), mas isso não parece ser um grande problema e consertar isso não é trivial.

Fora isso, parece bom para mim.

    
por 13.03.2015 / 06:30