Qual script poderia permitir que usuários comuns usassem namespaces de rede?

22

Eu tenho uma arquitetura usando namespaces de rede (netns). Gostaria de permitir que usuários regulares realizem algumas operações nesses netns.

Eu poderia escrever um script netns-exec.sh, inspirado neste post , executado com sudo, contendo:

ip netns exec $1 su $USER -c "$2"

e adicione ao meu arquivo sudoer:

user ALL=(ALL) /path/to/netns-exec.sh

Mas acho tão feio que eu poderia ter pesadelos sobre isso. Existe uma solução melhor para permitir que usuários comuns usem namespaces? É possível colocar os usuários em alguns grupos úteis? Eu procurei, mas não encontrei nada.

Raspbeguy
fonte
1
por que você não define Cmd_Alias CMD_NETNS = ip netns exec [regexp matching your namespace] su [regexp matching allowed used] -c [regexp matching allowed namespace command]no arquivo sudoers e cria um grupo no qual coloca os usuários permitidos e associa esse grupo a esse alias de comando.
Netmonk
2
É o que sudocontém um suque me incomoda, não o próprio script. De qualquer forma, vou escrever um script para embrulhar a coisa. Faz 2 comutadores de usuário, isso é realmente feio, você não acha?
Raspbeguy
6
Isso deve te assustar. O usuário pode modificar $ USER para ser root.
Stephen
1
Sim, e isso me assusta. Mas descobri mais tarde que sudofornecia uma variável específica $SUDO_USER, que é mais segura. Mas isso ainda é feio.
Raspbeguy
1
@Elronnd - do kernel ignora setuid em scripts
Angelo

Respostas:

1

Solução 1

Basta adicionar um grupo chamado "netns" e adicionar todos os usuários desejados. Em seguida, forneça propriedade para root: netns e forneça recursos de leitura / execução ao grupo.

Em outros termos:

# New group netns
sudo groupadd --system netns

# Add root to "netns", not sure if needed
sudo usermod -aG netns root

# Do this for every needed user
sudo usermod -aG netns $UserName

# Change ownership to root, grant rw acces to group netns
sudo chown root:netns /path/to/netns-exec.sh
sudo chmod 633 /path/to/netns-exec.sh

Solução 2

Esta solução é mais simples, você deve editar o arquivo sudoers, conforme mostrado neste exemplo .

user ALL=(ALL) /bin/ip netns
Taz8du29
fonte
Bem, a solução 1 é impossível, o comando ip netnsretornará um erro dizendo que somente o root pode executá-lo. A solução 2 é o que eu tinha inicialmente em mente, mas não foi satisfatório na minha opinião.
Raspbeguy 28/05
Isso chmod 0633daria write+executepermissões a todos os usuários e ao netnsgrupo. Eu suspeito que você desejou definir o bit SGID no script, mas como o @Angelo mencionou: setuide setgidé ignorado pelos scripts de shell, e por boas razões .
Ckujau
0

Pessoalmente, não sei se existe a possibilidade de permitir que usuários comuns executem comandos em diferentes namespaces de rede, mas esse shell script anotado pode atender melhor às suas necessidades:

#!/bin/bash
# ip netns wrapper script, nns.
# Usage: nns nsname cmdline

case "${1}" in
    do)
        shift # remove "do"
        NSNAME="${1}" # remember nsname
        shift # remove nsname to get argument list for su -c
        [ -z "${NSNAME}" -o -z "${1}" ] && exit 1 # if either nsname or arglist is empty - error out
        echo ip netns exec "${NSNAME}" su "${SUDO_USER}" -c "${*}" # execute, ${*} merges separate arguments into single word for su/sh -c parsing. See with strace.
    ;;
    *)
        SCRIPTNAME="${0}" # remember script full path
        exec sudo "${SCRIPTNAME}" do "${@}" # run it through sudo with elevated privileges
    ;;
esac

Instale-o em algum lugar /usr/bine permita que seus usuários o executem.


fonte
Obrigado pela sua resposta (e desculpe-me por perceber vários meses depois). Mas o problema permanece o mesmo, ou seja, usando o sudo.
Raspbeguy