Як я міг перерахувати всіх супер користувачів?


86

Я хочу, щоб команда перелічила всіх користувачів, які мають привілеї root, тобто sudo?

Припустимо, я користувач судора. Як я міг знати всіх інших користувачів sudoer?


Ось відповідь: unix.stackexchange.com/a/140974/107084
AB

1
Мені здається, це приємне unix.stackexchange.com/questions/50785/…
JoKeR

@JoKeR приємно і хитро
Maythux

1
Зауважте, що лише відповіді Джокера та Муру правильні, лише аналіз файлів конфіденцій користувача / групи не дає вам того, хто має sudoдозвіл, а хто ні .... якщо користувач у sudoгрупі, але у sudoersфайлі нічого не вказано для sudoгрупи, тоді?
heemayl

Відповіді:


81

Якщо вам просто потрібно перерахувати судори, перелічені в sudoгрупі, я думаю, що найкращий спосіб зробити це - запустити цю команду (яка повинна бути обчислювально легшою, ніж будь-яка з інших команд у цій відповіді):

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

Крім того, як запропоновано в коментарях Муру, формат записів /etc/groupможна легко обробити cut:

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

Також знову, як запропоновано в коментарях Муру, можна використовувати getentзамість grep:

getent group sudo | cut -d: -f4

Будь-яка з цих команд буде надрукувати всіх користувачів, перелічених у sudoгрупі /etc/group(якщо такі є).

Розбивка команди №1:

  • grep: Виводить у файл усі рядки, що відповідають регексу
  • -P: grepпоєднує регекси в стилі Perl
  • o: робить grepдрук лише відповідним рядком
  • '^sudo.+:\K.*$': grepвідповідає збігу регулярного вираження між цитатами

Розбивка Regex №1:

  • Будь-який символ або група символів, які не перераховані, відповідають персонажу або групі символів
  • ^: початок рядка
  • .+: один або кілька символів
  • \K: відмовитися від попереднього матчу
  • .*: нуль або більше символів
  • $: кінець рядка

Розбивка команди 2:

  • grep: Виводить у файл усі рядки, що відповідають регексу
  • '^sudo.+:\K.*$': grepвідповідає збігу регулярного вираження між цитатами
  • cut: Друкує лише визначений розділ кожного рядка у файлі
  • -d:: робить cutінтерпретацію :як роздільник поля
  • -f4: робить cutдрук лише четвертим полем

Розбивка Regex №2:

  • Будь-який символ або група символів, які не перераховані, відповідають персонажу або групі символів
  • ^: початок рядка
  • .*: нуль або більше символів
  • $: кінець рядка

5
-1: це не зачепить інших користувачів або груп, які, можливо, були додані до судодерів, або до зовнішніх джерел, таких як LDAP, і хлопчик це некрасивий спосіб зробити це. getent group sudo | cut -d: -f4або використовувати awk, але в будь-якому випадку пам’ятайте, що група та passwd мають фіксовані формати з роздільниками.
муру

@muru Ти маєш рацію, я оновив свою відповідь
kos

@kos Також зауважте, що вам дійсно слід користуватися getent group- вам зовсім не потрібна греп. getent group fooсхожий grep foo /etc/group, але більш здатний.
муру

@muru Я взагалі не знав getent, що-небудь торкався того, як grepі getentпорівняти обчислювально? Чи легше буде бігати getent?
kos

1
Ця відповідь передбачає, що всі судери є членами sudoгрупи. Деякі унікси мають інші групи, такі як wheel. Відповідь @muru включить усіх судерів незалежно від того, в якій групі вони перебувають.
Саймон Вудсайд

30

Як зазначено тут, я вважаю найпростіший спосіб виявити разом із -l& -Uпараметрами разом, просто введіть usersйого, наприклад John:

Якщо користувач має sudoдоступ, він надрукує рівень sudoдоступу для конкретного користувача:

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

Якщо користувач не має доступу до sudo, він надрукує, що користувачеві заборонено працювати sudoна localhost:

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

2
Ви могли б перебрати всі звичайні користувачі та повернути деталі на них , використовуючи що - щось на зразок : for u in $(awk -F'[/:]' '{if($3>=1000&&$3!=65534) print $1}' /etc/passwd); do sudo -lU "$u" ; done. швидкий злом нічого не гарантовано :)
Wilf

Це також працює в активній установці каталогів. Наприклад, ви можете обрати користувача з якоїсь спеціальної групи та перевірити його. Якщо ви правильно додали групу AD, "%domain admins@mycompany.intra" ALL=(ALL) ALLце працює. Ви зекономили мені багато часу, тому що я не знав, що це працює і для немісцевих користувачів.
АдамКаліш

14

Як уже було зазначено, відповідь можна знайти на Unix & Linux Stack Exchange :

Це показує, що користувач "saml" є членом колесної групи.

$ getent group wheel
wheel:x:10:saml

Єдина відмінність полягає в тому, що група в Ubuntu не є wheel, а sudo(або adminв старих версіях Ubuntu). Отже команда стає:

getent group sudo

Що означають ці числа? Я так geten groupі бачив дуже багато різних номерів. Моє первісне запитання - як дізнатись, чи користувач є системним користувачем (створено за допомогою useradd -r)
Шаян

9

Розширюючи sudo -l -Uтест, можна getent passwdвизначити користувачів, які можуть використовувати sudo. Використання getentдозволяє нам отримувати доступ до користувачів, які можуть бути відсутні у passwdфайлі, таких як користувачі LDAP:

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

sudo -U не повертає ненульове значення виходу, яким ми могли б скористатися, тому ми зводимося до отримання виведення.


Це найкраща відповідь, оскільки не передбачає, що існує група, яка називається sudo.
Саймон Вудсайд

3

У більшості Unix-подібних систем, які мають команду sudo і мають файл конфігурації sudo; запуск візудо як кореня:

:~$ sudo bash

або

:~$ su

:~# visudo

дозволить адміністратору перевірити та змінити привілеї груп, які можуть використовувати команду sudo.

У Unix-подібних системах, таких як Ubuntu, як групи Ubuntu, групи 4 і 27 зазвичай мають права доступу до привілеїв sudo.

Група 4 - це група адміністратора (adm), а група 27 - судогід.

Щоб побачити, які користувачі наразі призначені для цих груп, розміщують файл / etc / group, як показано нижче:

:~$ cat /etc/group

Вибірка вибірки на Ubuntu (але не на Redhat, системах на базі Oracle Solaris / Solaris або BSD) дасть це:

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

Як ми можемо сказати, youruser є адміністратором системи та членом групи 4 (adm). Але youruser і mybrother - обидва учасники групи 27, що є номером gid (ідентифікація групи) групового sudo. Таким чином, mybrother також може отримувати привілеї root (супер користувач).

У багатьох Linux-системах, таких як Fedora та Slackware, є gid = 10. Що дозволяє права адміністратора при застосуванні команди sudo. У системах, що базуються на BSD (наприклад, FreeBSD), користувач root є членом колесної групи, яка є gid 0.

Також за допомогою команди id будь-який користувач може знайти в системі інформацію про групу іншого відомого користувача.

Наприклад:

:~$ id mybrother

Вибірка зразка

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

Я спеціально увійшов до вас, щоб просити вас. Ідеальне пояснення :)
Vidor Vistrom

1

Ця команда повертає список користувачів з правами sudo:

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

Вихід (наприклад):

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

Якщо відображається лише ім'я користувача, тоді ця команда:

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

1
він показує більше користувачів, ніж судорів. Він потребує деяких модифікацій
Maythux

@NewUSer Це краще?
AB

Значно краще. Gd робота
Maythux


0

Мене натрапило на те, як vagrantкористувач може використовувати sudoнавіть не згадуючись у /etc/sudoersні в, /etc/groupні в них getent.

Виявляється, sudoтакож читає записи з усіх файлів під/etc/sudoers.d/ . Тож якщо ви не переглянули цей каталог, ви можете не усвідомити, скільки користувачів насправді мають sudoдоступ.

Цей вид sudoдоступу може бути виявлений за допомогою відповіді JoKeR, sudo -l -U vagrantале не виявляється жодними іншими відповідями тут, на які всі покладаються або на, getentабо на /etc/group.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.