GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo encuentra al usuario original a través de múltiples comandos sudo y su?

No hay perfecto responder. Cuando cambia las ID de usuario, la ID de usuario original generalmente no se conserva, por lo que la información se pierde. Algunos programas, como logname y who -m implementar un truco donde verifican qué terminal está conectado a stdin y luego verifique qué usuario ha iniciado sesión en ese terminal.

Esta solución a menudo funciona, pero no es infalible y ciertamente no debe considerarse seguro. Por ejemplo, imagina si who genera lo siguiente:

tom     pts/0        2011-07-03 19:18 (1.2.3.4)
joe     pts/1        2011-07-03 19:10 (5.6.7.8)

tom usado su para llegar a la raíz y ejecuta su programa. Si STDIN no se redirige, entonces un programa como logname generará tom . Si ES redirigido (por ejemplo, desde un archivo) así:

logname < /some/file

Entonces el resultado es "no login name ", ya que la entrada no es la terminal. Más interesante aún, sin embargo, es el hecho de que el usuario podría hacerse pasar por un usuario conectado diferente. Dado que Joe está conectado en pts/1, Tom podría pretender ser él ejecutando

logname < /dev/pts1

Ahora dice joe aunque tom es quien ejecutó el comando. En otras palabras, si usa este mecanismo en cualquier tipo de rol de seguridad, está loco.


Resultados:

Utilice who am i | awk '{print $1}' O logname ya que ningún otro método está garantizado.

Conectado como propio:

evan> echo $USER
evan
evan> echo $SUDO_USER

evan> echo $LOGNAME
evan
evan> whoami
evan
evan> who am i | awk '{print $1}'
evan
evan> logname
evan
evan>

Sudo normal:

evan> sudo -s
root> echo $USER
root
root> echo $SUDO_USER
evan
root> echo $LOGNAME
root
root> whoami
root
root> who am i | awk '{print $1}'
evan
root> logname
evan
root>

sudo su - :

evan> sudo su -
[root ]# echo $USER
root
[root ]# echo $SUDO_USER

[root ]# echo $LOGNAME
root
[root ]# whoami
root
[root ]# who am i | awk '{print $1}'
evan
[root ]# logname
evan
[root ]#

sudo su-; su tom :

evan> sudo su -
[root ]# su tom
tom$ echo $USER
tom
tom$ echo $SUDO_USER

tom$ echo $LOGNAME
tom
tom$ whoami
tom
tom$ who am i | awk '{print $1}'
evan
tom$ logname
evan
tom$

Este es un ksh función que escribí en HP-UX. No sé cómo funcionará con Bash en linux La idea es que el sudo El proceso se ejecuta como el usuario original y los procesos secundarios son el usuario de destino. Al retroceder a través de los procesos principales, podemos encontrar al usuario del proceso original.

#
# The options of ps require UNIX_STD=2003.  I am setting it
# in a subshell to avoid having it pollute the parent's namespace.
#
function findUser
{
    thisPID=$$
    origUser=$(whoami)
    thisUser=$origUser
    while [ "$thisUser" = "$origUser" ]
    do
        ( export UNIX_STD=2003; ps -p$thisPID -ouser,ppid,pid,comm ) | grep $thisPID | read thisUser myPPid myPid myComm
        thisPID=$myPPid
    done
    if [ "$thisUser" = "root" ]
    then
        thisUser=$origUser
    fi
    if [ "$#" -gt "0" ]
    then
        echo $origUser--$thisUser--$myComm
    else
        echo $thisUser
    fi
    return 0
}

Sé que la pregunta original era de hace mucho tiempo, pero la gente (como yo) sigue preguntando y este parecía un buen lugar para poner la solución.


Linux
  1. Cómo configurar los privilegios de Sudo para el usuario en Linux

  2. ¿Por qué el usuario raíz necesita permiso de Sudo?

  3. ¿Diferencia entre el usuario de Sudo y el usuario raíz?

  4. ¿Cómo le das a su las variables de entorno del usuario actual?

  5. ¿Cómo se comprime un archivo y se conserva el archivo .gz?

Cómo usar Sudo y el archivo Sudoers

¿Qué es UID en Linux, cómo encontrarlo y cambiarlo?

Cómo cambiar la contraseña de sudo a través de la línea de comandos en CentOS 8

Cómo convertirse en usuario raíz en la línea de comandos de Ubuntu usando su y sudo

Cómo crear un usuario Sudo en Ubuntu y Debian

Cómo encontrar el PID y PPID de un proceso en Linux