すべてのスーパーユーザーをリストするにはどうすればよいですか?


87

ルート権限を持つすべてのユーザー、つまりsudoをリストするコマンドが必要ですか?

私がsudoerユーザーだとします。他のすべてのsudoerユーザーを知るにはどうすればよいですか?


ここに答えがある:unix.stackexchange.com/a/140974/107084
AB


@JoKeR素敵でトリッキー
Maythux

1
唯一のことに注意してくださいジョーカーmuruさんの答えが正しい、唯一のユーザー/グループのconfファイルを解析すると、持っている人、あなたを与えるものではありませんsudo許可を、ユーザーがである場合誰が....していないsudoグループが、sudoersファイルが何のために言及していないsudoグループ、それから?
heemayl

回答:


81

sudoグループにリストされているsudoersをリストする必要がある場合、それを行う最善の方法は、このコマンドを実行することだと思います(この回答の他のコマンドよりも計算が軽いはずです):

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

また、muruのコメントで示唆されているように、のエントリの形式は次の/etc/groupように簡単に処理できますcut

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

また、muruのコメントで示唆されているように、次のgetent代わりに使用できますgrep

getent group sudo | cut -d: -f4

これらのコマンドはいずれも、sudoグループにリストされているすべてのユーザーを出力します/etc/group(存在する場合)。

コマンド#1の内訳:

  • grep:ファイル内の正規表現に一致するすべての行を出力します
  • -PgrepPerlスタイルの正規表現に一致させる
  • ogrep一致した文字列のみを印刷します
  • '^sudo.+:\K.*$'grep引用符間の正規表現を一致させます

正規表現#1の内訳:

  • リストされていない文字または文字グループは、文字または文字グループ自体と一致します
  • ^:行頭
  • .+:1つ以上の文字
  • \K:前の一致を破棄
  • .*:0個以上の文字
  • $:行末

コマンド#2の内訳:

  • grep:ファイル内の正規表現に一致するすべての行を出力します
  • '^sudo.+:\K.*$'grep引用符間の正規表現を一致させます
  • cut:ファイル内の各行の指定されたセクションのみを印刷します
  • -d::フィールド区切り文字としてcut解釈:します
  • -f4cut4番目のフィールドのみを印刷します

正規表現#2の内訳:

  • リストされていない文字または文字グループは、文字または文字グループ自体と一致します
  • ^:行頭
  • .*:0個以上の文字
  • $:行末

5
-1:これは、sudoers、またはLDAPなどの外部ソースに追加された可能性のある他のユーザーまたはグループをキャッチしません。getent group sudo | cut -d: -f4、またはawkを使用しますが、どちらの方法でも、グループとpasswdは区切り文字付きの固定形式であることを覚えておいてください。
ムル

@muruあなたは正しい、私は私の答えを更新しました
コス

@kosまた、本当に使用すべきであることに注意してください-grep getent groupはまったく必要ありません。getent group fooはに似てgrep foo /etc/groupいますが、より能力があります。
ムル

@muru私はまったく知りませんでしたgetent、どのように計算grepしてgetent比較するのですか?走るのは軽くなりますgetentか?
コス

1
この回答は、すべてのsudoerがsudoグループのメンバーであることを前提としています。一部のUNIXには、などの他のグループがありますwheel。@muruによって答えは関係なく、彼らがしているものをグループのすべてのsudoersファイルが含まれません。
サイモン・ウッドサイド

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アクセス権がない場合、localhostでの実行が許可されいないことを表示します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。クイックハック何も保証されていません:)
ウィルフ

これは、Active Directoryセットアップでも機能します。たとえば、特別なグループからユーザーを選択して、ユーザーを確認できます。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(またはadminUbuntuの古いバージョンで)。したがって、コマンドは次のようになります。

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 は、利用できるゼロ以外の終了値を返さないため、出力をgrepすることになります。


というグループが存在するとは想定していないため、これが最良の回答sudoです。
サイモンウッドサイド

3

ほとんどのUnixライクシステムでは、sudoコマンドがあり、sudo設定ファイルがあります。rootとしてvisudoを実行:

:~$ sudo bash

または

:~$ su

:~# visudo

管理者は、sudoコマンドを使用できるグループの特権を検査および修正できます。

UbuntuのようなDebianベースのUnixライクシステムでは、グループ4と27は一般にsudo特権へのアクセス権を持っています。

グループ4は管理者グループ(adm)で、グループ27はsudo gidです。

これらのグループに現在割り当てられているユーザーを確認するには、以下に示すように/ etc / groupファイルをcatします。

:~$ 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のメンバーです。これは、グループsudoのgid(グループID)番号です。したがって、mybrotherはルート権限(スーパーユーザー)を取得することもできます。

FedoraやSlackwareなどの多くのLinuxシステムには、ホイールグループgid = 10が組み込まれています。sudoコマンドを適用すると、管理者特権が許可されます。BSDベースのシステム(FreeBSDなど)では、rootユーザーはgid 0であるwheelグループのメンバーです。

また、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よりも多くのユーザーが表示されます。いくつかの変更が必要です
Maythux

@NewUSerそれは良いですか?
AB

ずっといい。Gdの仕事
Maythux


0

に言及されていない、または見つけられないvagrant場合sudoでも、ユーザーがどのように使用できるかについて困惑しました。/etc/sudoers/etc/groupgetent

結局のところsudoも下のすべてのファイルからエントリを読み込みます/etc/sudoers.d/。そのため、そのディレクトリを調べていない場合、実際にsudoアクセスしているユーザーの数に気付かないことがあります。

この種のsudoアクセスは、使用してジョーカーの答えによって検出することができますsudo -l -U vagrantが、すべてのいずれかに依存している、ここで他の回答のいずれかによって検出されていませんgetent/etc/group

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.