GNU/Linux >> Znalost Linux >  >> Linux

Jak najdete původního uživatele pomocí několika příkazů sudo a su?

Žádné dokonalé neexistuje Odpovědět. Když změníte ID uživatele, původní ID uživatele se obvykle nezachová, takže se informace ztratí. Některé programy, například logname a who -m implementovat hack, kde zkontrolují, který terminál je připojen k stdin a poté zkontrolujte, který uživatel je na tomto terminálu přihlášen.

Toto řešení často funguje, ale není spolehlivý a rozhodně by neměl být považován za bezpečný. Představte si například who vypíše následující:

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 použit su dostat se do rootu a spustí váš program. Pokud STDIN není přesměrován, pak program jako logname vypíše tom . Pokud JE přesměrován (např. ze souboru) takto:

logname < /some/file

Výsledek je "no login name ", protože vstupem není terminál. Ještě zajímavější je však skutečnost, že uživatel se může vydávat za jiného přihlášeného uživatele. Protože je Joe přihlášen na pts/1, Tom by se mohl vydávat za něj spuštěním

logname < /dev/pts1

Nyní to říká joe i když je Tom ten, kdo spustil příkaz. Jinými slovy, pokud používáte tento mechanismus v jakékoli bezpečnostní roli, jste blázen.


Výsledky:

Použijte who am i | awk '{print $1}' NEBO logname protože žádné jiné metody nejsou zaručeny.

Přihlášen jako self:

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>

Normální sudo:

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$

Toto je ksh funkce, kterou jsem napsal na HP-UX. Nevím, jak to bude fungovat s Bash v Linuxu. Myšlenka je taková, že sudo proces běží jako původní uživatel a podřízené procesy jsou cílovým uživatelem. Cyklováním zpět přes rodičovské procesy můžeme najít uživatele původního procesu.

#
# 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
}

Vím, že původní otázka byla z dávné doby, ale lidé (jako já) se stále ptají a tohle vypadalo jako dobré místo pro řešení.


Linux
  1. Jak najít všechny uživatele Sudo v Linuxu

  2. Jak fungují vnitřnosti sudo?

  3. Jak zjistit typ souboru Img a připojit jej?

  1. Jak nastavit oprávnění Sudo pro uživatele v Linuxu

  2. Proč potřebuje uživatel root oprávnění sudo?

  3. Rozdíl mezi uživatelem Sudo a uživatelem root?

  1. Jak dáte su aktuální proměnné uživatelského prostředí

  2. Jak zazipujete soubor a uchováte soubor .gz?

  3. Jak přinutím sudo, aby požádal o heslo uživatele root?