¿Qué script podría permitir a los usuarios normales usar espacios de nombres de red?

22

Tengo una arquitectura que usa espacios de nombres de red (netns). Me gustaría permitir que los usuarios habituales realicen algunas operaciones en estas redes.

Podría escribir un guión netns-exec.sh, inspirado en esta publicación , ejecutado con sudo, que contenga:

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

y agregar a mi archivo sudoer:

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

Pero lo encuentro tan feo que podría tener pesadillas al respecto. ¿Existe una mejor solución para permitir que los usuarios habituales usen espacios de nombres? ¿Es posible poner a los usuarios en algunos grupos útiles? Lo busqué pero no encontré nada.

Raspbeguy
fuente
1
por qué no define Cmd_Alias CMD_NETNS = ip netns exec [regexp matching your namespace] su [regexp matching allowed used] -c [regexp matching allowed namespace command]en su archivo sudoers y luego crea un grupo en el que coloca sus usuarios permitidos, y asocia este grupo a este alias de comando.
netmonk
2
Es el que sudocontiene un suque me molesta, no el script en sí. De todos modos, escribiré un guión para envolver la cosa. Hace 2 cambios de usuario, eso es realmente feo, ¿no te parece?
Raspbeguy
66
Eso debería asustarte. El usuario podría modificar $ USER para que sea root.
Stephen
1
Sí, y eso me asusta. Pero luego descubrí que sudoproporcionaba una variable específica $SUDO_USER, que es más segura. Pero eso sigue siendo feo.
Raspbeguy
1
@Elronnd - kernel ignora setuid en los scripts
Angelo

Respuestas:

1

Solución 1

Simplemente agregue un grupo llamado "netns", agregue todos los usuarios deseados. Luego otorgue propiedad a root: netns y brinde capacidades de lectura / ejecución al grupo.

En otros terminos:

# 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

Solución 2

Esta solución es más simple, debe editar su archivo sudoers como se muestra en este ejemplo .

user ALL=(ALL) /bin/ip netns
Taz8du29
fuente
Bueno, la solución 1 es imposible, el comando ip netnsdevolverá un error que dice que solo root puede ejecutarlo. La solución 2 es lo que tenía en mente inicialmente, pero en mi opinión no era satisfactorio.
Raspbeguy
Esto chmod 0633daría write+executepermisos a todos los usuarios y al netnsgrupo. Sospecho que quería establecer el bit SGID en el script, pero como mencionó @Angelo: setuidy setgidse ignora para los scripts de shell, y por una buena razón .
ckujau
0

Personalmente, no sé si existe la posibilidad de permitir que los usuarios regulares ejecuten comandos en diferentes espacios de nombres de red, pero este script de shell anotado puede satisfacer mejor sus necesidades:

#!/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

Instálelo en algún lugar /usr/biny permita que sus usuarios lo ejecuten.


fuente
Gracias por su respuesta (y perdón por notarlo varios meses después). Pero el problema sigue siendo el mismo, es decir, usar sudo.
Raspbeguy