GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana Anda menemukan pengguna asli melalui beberapa perintah sudo dan su?

Tidak ada sempurna menjawab. Saat Anda mengubah ID pengguna, ID pengguna asli biasanya tidak dipertahankan, sehingga informasinya hilang. Beberapa program, seperti logname dan who -m menerapkan peretasan di mana mereka memeriksa untuk melihat terminal mana yang terhubung ke stdin , lalu periksa untuk melihat pengguna apa yang masuk di terminal itu.

Solusi ini sering berfungsi, tetapi tidak mudah, dan tentu saja tidak boleh dianggap aman. Misalnya, bayangkan jika who menampilkan yang berikut:

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 menggunakan su untuk mendapatkan root, dan menjalankan program Anda. Jika STDIN tidak dialihkan, maka program seperti logname akan menampilkan tom . Jika IS dialihkan (misalnya dari file) seperti itu:

logname < /some/file

Maka hasilnya adalah "no login name ", karena inputnya bukan terminal. Namun, yang lebih menarik lagi, adalah fakta bahwa pengguna dapat berpura-pura sebagai pengguna login yang berbeda. Karena Joe login pada pts/1, Tom dapat berpura-pura menjadi dia dengan menjalankan

logname < /dev/pts1

Sekarang, tertulis joe meskipun tom adalah orang yang menjalankan perintah. Dengan kata lain, jika Anda menggunakan mekanisme ini dalam peran keamanan apa pun, Anda gila.


Hasil:

Gunakan who am i | awk '{print $1}' ATAU logname karena tidak ada metode lain yang dijamin.

Masuk sebagai diri sendiri:

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 biasa:

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$

Ini adalah ksh fungsi yang saya tulis di HP-UX. Saya tidak tahu cara kerjanya dengan Bash di Linux. Idenya adalah sudo proses berjalan sebagai pengguna asli dan proses anak adalah pengguna target. Dengan menelusuri kembali proses induk, kita dapat menemukan pengguna dari proses asli.

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

Saya tahu pertanyaan aslinya sudah lama sekali, tetapi orang-orang (seperti saya) masih bertanya dan ini sepertinya tempat yang bagus untuk memberikan solusi.


Linux
  1. Cara Mengatur Hak Istimewa Sudo untuk Pengguna di Linux

  2. Bagaimana Internal Sudo Bekerja?

  3. Perbedaan Antara Pengguna Sudo Dan Pengguna Root?

  1. Cara Menemukan Semua Pengguna Sudo Di Linux

  2. Bagaimana Anda memberi su variabel lingkungan pengguna saat ini

  3. Bagaimana cara membuat sudo meminta kata sandi root?

  1. Mengapa Pengguna Root Membutuhkan Izin Sudo?

  2. Bagaimana Menemukan Jenis File Img Dan Memasangnya?

  3. Bagaimana Anda mem-gunzip file dan menyimpan file .gz?