Bagaimana saya bisa mendaftar semua pengguna super?


87

Saya ingin perintah untuk membuat daftar semua pengguna yang memiliki hak akses root yaitu sudo?

Misalkan saya adalah pengguna sudoer. Bagaimana saya bisa tahu semua pengguna sudoer lainnya?




@JoKeR bagus dan rumit
Maythux

1
Perhatikan bahwa hanya jawaban Joker dan muru yang benar, hanya parsing file konfigurasi pengguna / grup tidak memberi Anda siapa yang memiliki sudoizin dan siapa yang tidak .... jika pengguna dalam sudogrup tetapi sudoersfile tersebut tidak disebutkan untuk sudogrup, kemudian?
heemayl

Jawaban:


81

Jika Anda hanya perlu membuat daftar sudoer yang tercantum dalam sudogrup, saya pikir cara terbaik untuk melakukannya adalah dengan menjalankan perintah ini (yang seharusnya lebih ringan secara komputasi daripada perintah lain dalam jawaban ini):

grep -Po '^sudo.+:\K.*$' /etc/group

Juga seperti yang disarankan dalam komentar oleh muru, format entri /etc/groupdapat dengan mudah ditangani oleh cut:

grep '^sudo:.*$' /etc/group | cut -d: -f4

Juga lagi seperti yang disarankan dalam komentar oleh muru, seseorang dapat menggunakan getentdi tempat grep:

getent group sudo | cut -d: -f4

Salah satu dari perintah ini akan mencetak semua pengguna yang terdaftar dalam sudogrup di /etc/group(jika ada).

Rincian perintah # 1:

  • grep: Mencetak semua baris yang cocok dengan regex dalam file
  • -P: membuat greppertandingan dengan regex gaya Perl
  • o: membuat grephanya mencetak string yang cocok
  • '^sudo.+:\K.*$': membuat grepcocokkan dengan regex antara tanda kutip

Regex # 1 kerusakan:

  • Setiap karakter atau grup karakter yang tidak terdaftar cocok dengan karakter atau grup karakter itu sendiri
  • ^: mulai dari garis
  • .+: satu atau lebih karakter
  • \K: buang pertandingan sebelumnya
  • .*: nol atau lebih karakter
  • $: akhir baris

Rincian perintah # 2:

  • grep: Mencetak semua baris yang cocok dengan regex dalam file
  • '^sudo.+:\K.*$': membuat grepcocokkan dengan regex antara tanda kutip
  • cut: Mencetak hanya bagian tertentu dari setiap baris dalam file
  • -d:: menjadikan cutinterpretasikan :sebagai pembatas bidang
  • -f4: membuat cutcetak hanya bidang keempat

Rincian Regex # 2:

  • Setiap karakter atau grup karakter yang tidak terdaftar cocok dengan karakter atau grup karakter itu sendiri
  • ^: mulai dari garis
  • .*: nol atau lebih karakter
  • $: akhir baris

5
-1: ini tidak akan menangkap pengguna atau grup lain yang mungkin telah ditambahkan ke sudoers, atau sumber eksternal seperti LDAP, dan ini adalah cara yang buruk untuk melakukan ini. getent group sudo | cut -d: -f4, atau gunakan awk, tetapi ingatlah bahwa grup dan passwd memiliki format tetap, dengan pembatas.
muru

@muru Anda benar, saya memperbarui jawaban saya
kos

@kos Juga perhatikan bahwa Anda benar-benar harus menggunakan getent group- Anda tidak perlu grep sama sekali. getent group fooseperti grep foo /etc/group, tetapi lebih mampu.
muru

@uru aku tidak tahu getentsama sekali, ada pemikiran tentang bagaimana grepdan getentmembandingkan komputasi? Apakah lebih ringan untuk dijalankan getent?
kos

1
Jawaban ini mengasumsikan bahwa semua sudoers adalah anggota sudogrup. Beberapa unix memiliki grup lain seperti wheel. Jawaban oleh @muru akan mencakup semua sudoer, apa pun kelompoknya.
Simon Woodside

30

Seperti yang dinyatakan di sini saya menganggap cara paling sederhana untuk menemukan -l& -Uopsi bersama-sama, cukup ketik usersitu akan daftar misalnya: Johnlalu:

Jika pengguna memiliki sudoakses, itu akan mencetak tingkat sudoakses untuk pengguna tertentu:

  sudo -l -U John
  User John may run the following commands on this host:
     (ALL : ALL) ALL

Jika pengguna tidak memiliki akses sudo, itu akan mencetak bahwa pengguna tidak diizinkan berjalan sudodi localhost:

   sudo -l -U John
   User John is not allowed to run sudo on localhost.

2
Anda bisa loop melalui semua pengguna normal dan mengembalikan rincian pada mereka menggunakan sesuatu seperti : for u in $(awk -F'[/:]' '{if($3>=1000&&$3!=65534) print $1}' /etc/passwd); do sudo -lU "$u" ; done. hack cepat tidak ada yang dijamin :)
Wilf

Ini juga berfungsi dalam pengaturan direktori aktif. Misalnya Anda dapat memilih pengguna dari beberapa grup khusus dan memeriksa pengguna. Jika Anda menambahkan grup AD dengan benar, "%domain admins@mycompany.intra" ALL=(ALL) ALLmaka itu berfungsi. Anda menghemat banyak waktu, karena saya tidak tahu ini juga berfungsi untuk pengguna non-lokal.
AdamKalisz

14

Seperti yang telah dinyatakan, jawabannya dapat ditemukan di Unix & Linux Stack Exchange :

Ini menunjukkan bahwa pengguna "saml" adalah anggota grup wheel.

$ getent group wheel
wheel:x:10:saml

Satu-satunya perbedaan adalah bahwa grup di Ubuntu tidak wheel, tetapi sudo(atau admindalam versi Ubuntu yang lebih lama). Jadi perintahnya menjadi:

getent group sudo

Apa arti angka-angka ini? Saya lakukan geten groupdan saya melihat banyak angka yang berbeda. Pertanyaan awal saya adalah, bagaimana cara mengetahui apakah pengguna adalah pengguna sistem (dibuat dengan useradd -r)
Shayan

9

Memperluas pada sudo -l -Utes, satu dapat menggunakan getent passwduntuk menentukan pengguna yang dapat menggunakan sudo. Menggunakan getentmemungkinkan kita untuk mengakses pengguna yang mungkin tidak ada dalam passwdfile, seperti pengguna LDAP:

getent passwd | cut -f1 -d: | sudo xargs -L1 sudo -l -U | grep -v 'not allowed'

sudo -U tidak mengembalikan nilai keluar non-nol yang dapat kita manfaatkan, jadi kita direduksi untuk menangkap output.


Ini adalah jawaban terbaik karena tidak menganggap ada grup yang dipanggil sudo.
Simon Woodside

3

Pada kebanyakan sistem mirip Unix, yang memiliki perintah sudo, dan memiliki file konfigurasi sudo; menjalankan visudo sebagai root:

:~$ sudo bash

atau

:~$ su

:~# visudo

akan memungkinkan administrator untuk memeriksa dan mengubah hak-hak kelompok yang dapat menggunakan perintah sudo.

Pada sistem mirip Unix berbasis Debian, seperti Ubuntu, grup 4 dan 27 umumnya memiliki hak akses ke hak akses sudo.

Grup 4 adalah grup administrator (adm) dan grup 27 adalah sudo gid.

Untuk melihat pengguna apa yang saat ini ditugaskan ke grup-grup ini, file / etc / group seperti yang ditunjukkan di bawah ini:

:~$ cat /etc/group

Output sampel, pada Ubuntu (tetapi tidak berbasis Redhat, berbasis Oracle Solaris / Solaris, atau sistem berbasis BSD) akan menghasilkan ini:

adm:x:4:youruser
tty:x:5:
disk:x:6:
lp:x:7:
mail:x:8:
news:x:9: 
uucp:x:10:
man:x:12:
proxy:x:13:
kmem:x:15:
dialout:x:20:
fax:x:21:
voice:x:22:
cdrom:x:24:youruser,mybrother
floppy:x:25:
tape:x:26:
sudo:x:27:youruser,mybrother

Seperti yang kami ketahui, pengguna Anda adalah administrator sistem, dan anggota grup 4 (adm). Tetapi pengguna Anda dan kakak saya keduanya anggota grup 27, yang merupakan nomor gid (identifikasi grup) dari sudo grup. Jadi kakak saya juga bisa mendapatkan hak akses root (pengguna super).

Banyak sistem linux seperti Fedora dan Slackware, menggabungkan grup wheel gid = 10. Yang memungkinkan hak administrator ketika perintah sudo diterapkan. Pada sistem berbasis BSD (mis. FreeBSD), pengguna root adalah anggota dari grup wheel yang gid 0.

Juga dengan menggunakan perintah id setiap pengguna dapat menemukan informasi grup pengguna lain yang diketahui ke sistem.

Sebagai contoh:

:~$ id mybrother

Output sampel

uid=1001(mybrother) gid=1001(mybrother) groups=1001(mybrother),24(cdrom),27(sudo),30(dip),46(plugdev),108(lpadmin),124(sambashare)

Saya secara khusus masuk untuk mendukung Anda. Penjelasan sempurna :)
Vidor Vistrom

1

Perintah ini mengembalikan daftar pengguna dengan hak sudo:

awk -F ":" '{ system("groups " $1 " | grep -P \"[[:space:]]sudo([[:space:]]|$)\"") }' /etc/passwd

Outputnya adalah (mis.):

<username> : <username> adm cdrom sudo dip plugdev lpadmin sambashare docker

Jika hanya nama pengguna yang akan ditampilkan, maka perintah ini:

awk -F ":" '{ system("groups " $1 " | grep -P \"[[:space:]]sudo([[:space:]]|$)\"") }' | awk -F ":" '{ print $1 }' /etc/passwd

1
ini menunjukkan lebih banyak pengguna daripada sudoers. Perlu beberapa modifikasi
Maythux

@NewUSer Apakah itu lebih baik?
AB

Jauh lebih baik. Pekerjaan Gd
Maythux


0

Saya bingung tentang bagaimana vagrantpengguna dapat menggunakan sudobahkan tanpa disebutkan /etc/sudoersatau /etc/grouptidak ditemukan getent.

Ternyata sudojuga membaca entri dari semua file di bawah/etc/sudoers.d/ . Jadi, jika Anda belum melihat-lihat direktori itu, Anda mungkin tidak menyadari berapa banyak pengguna yang benar-benar memiliki sudoakses.

sudoAkses semacam ini dapat dideteksi oleh jawaban JoKeR menggunakan sudo -l -U vagranttetapi tidak terdeteksi oleh jawaban lain di sini yang semuanya bergantung pada salah satu getentatau /etc/group.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.