Как я могу перечислить всех супер пользователей?


87

Я хочу, чтобы команда перечисляла всех пользователей, которые имеют привилегии root, т.е. sudo?

Предположим, я пользователь sudoer. Как я мог знать всех других пользователей sudoer?



1
Я нахожу этот хороший unix.stackexchange.com/questions/50785/…
JoKeR

@JoKeR приятно и сложно
Maythux

1
Обратите внимание, что только ответы Джокера и Муру являются правильными, только анализ файлов пользователя / группы conf не дает вам, кто имеет sudoразрешение, а кто нет .... если пользователь находится в sudoгруппе, но в sudoersфайле ничего не указано для sudoгруппы, тогда?
Heemayl

Ответы:


81

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

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

Также, как предлагается в комментариях Muru, формат записей в /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: это не поймает других пользователей или группы, которые могли быть добавлены в sudoers, или внешние источники, такие как LDAP, и это плохой способ. getent group sudo | cut -d: -f4или используйте awk, но в любом случае помните, что group и passwd имеют фиксированные форматы с разделителями.
Муру

@muru Вы правы, я обновил свой ответ
kos

@kos Также обратите внимание, что вы действительно должны использовать getent group- вам вообще не нужен grep. getent group fooэто как grep foo /etc/group, но более способный.
Муру

@muru Я вообще не знал getent, хоть как-то размышляли о том, как grepи getentсравнивать в вычислительном отношении? Будет ли легче бежать getent?
Кос

1
Этот ответ предполагает, что все sudoers являются членами sudoгруппы. У некоторых юниксов есть другие группы, такие как wheel. Ответ @muru будет включать всех sudoers независимо от того, в каких группах они находятся.
Simon Woodside

30

Как указано здесь, я рассматриваю самый простой способ поиска с -l& -Uпараметрами вместе, просто напечатайте usersего, например: Johnthen:

Если у пользователя есть sudoдоступ, он напечатает уровень sudoдоступа для этого конкретного пользователя:

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

Если у пользователя нет доступа к sudo, он напечатает, что пользователю не разрешено работать sudoна локальном хосте:

   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. быстрый взлом ничего не гарантировал :)
Уилф

Это также работает в настройке активного каталога. Например, вы можете выбрать пользователя из какой-то специальной группы и проверить пользователя. Если вы правильно добавили группу AD, то "%domain admins@mycompany.intra" ALL=(ALL) ALLэто работает. Вы сэкономили мне много времени, потому что я не знал, что это работает и для не локальных пользователей.
AdamKalisz

14

Как уже было сказано, ответ можно найти на Unix & Linux Stack Exchange :

Это показывает, что пользователь "saml" является членом группы wheel.

$ getent group wheel
wheel:x:10:saml

Разница лишь в том, что группы в Ubuntu нет wheel, но sudo(или adminв более старых версиях Ubuntu). Таким образом, команда становится:

getent group sudo

Что означают эти цифры? Я сделал, geten groupи я вижу много разных чисел. Мой оригинальный вопрос, как узнать, является ли пользователь системным пользователем (создан с помощью useradd -r)
Shayan

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; работает visudo как root:

:~$ sudo bash

или же

:~$ su

:~# visudo

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

В Unix-подобных системах на основе Debian, таких как Ubuntu, группы 4 и 27 обычно имеют права доступа к привилегиям sudo.

Группа 4 - это группа администраторов (adm), а группа 27 - это sudo gid.

Чтобы увидеть, какие пользователи в настоящее время назначены этим группам, просмотрите файл / 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 является членом группы wheel, которая имеет значение 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
это показывает больше пользователей, чем sudoers.
Нужны

@NewUSer Это лучше?
AB

Намного лучше. Б-г работает
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.