![リモートホストのLinux(管理者)ユーザーレポートを抽出する[閉じる]](https://linux33.com/image/202588/%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%83%9B%E3%82%B9%E3%83%88%E3%81%AELinux%EF%BC%88%E7%AE%A1%E7%90%86%E8%80%85%EF%BC%89%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%83%AC%E3%83%9D%E3%83%BC%E3%83%88%E3%82%92%E6%8A%BD%E5%87%BA%E3%81%99%E3%82%8B%5B%E9%96%89%E3%81%98%E3%82%8B%5D.png)
Linuxユーザーのレポートとそのうちの管理者が誰であるかに関するレポートを抽出するための最良の方法を見つけようとしています。ターゲットはDebian(8,9)とUbuntu(18,20)です。最終レポートはかなり長いため、最初の行に各仮想マシンを識別できるホスト名を含めたいと思います。また、すべての詳細ではなく、ユーザー名のみを含む簡単なレポートが必要です。
私のコードは、psshを介して複数のホストにプッシュするときに無関係な情報を表示します。
#!/bin/bash
_l="/etc/login.defs"
_p="/etc/passwd"
## get mini UID limit ##
l=$(grep "^UID_MIN" $_l)
## get max UID limit ##
l1=$(grep "^UID_MAX" $_l)
echo ""
echo `hostname`
echo ""
echo "----------[ User Accounts ]---------------"
awk -F':' -v "min=${l##UID_MIN}" -v "max=${l1##UID_MAX}" '{ if ( $3 >= min && $3 <= max && $7 != "/sbin/nologin" ) print $0 }' "$_p"
#users with UID >= 1000 (MIN) and UID <= 60000 (MAX)
#these users are allowed to login into system if shell is bash/csh/tcsh/ksh as defined in the /etc/shells file
echo "----------[ from which, Admin Accounts ]---------------"
echo `grep '^sudo:.*$' /etc/group | cut -d: -f4`
#users in sudoers group
exit 0
ゴミを持ってきますね。アドバイスありがとうございます。
答え1
私が知りたいのは、ユーザーが実行できるかどうかです。どのsudoコマンド(および可能であればコマンド)を使用してください。次のことが必要なデータを収集(またはレポートとして使用)するための最良の方法です。
for u in $(compgen -u); do echo "# $HOSTNAME - $u"; sudo -l -U $u; echo; done
私にとっては、シェルおよび/またはUID_MINまたはMAXを知ることは関係がないようです。 /etc/groupのgrepに依存するだけでは不十分です。偽または非対話型シェルを持つアカウントは依然としてsudoとして扱うことができます。つまり、sudo su - falseshellaccount -s /bin/bash
十分なsudoアクセス権を持つユーザーは、/etc/passwdおよび/または/etc/groupを編集してID制限を回避でき、sssd、ldapなどのサポートでsudoを使用できます。 。ユーザーがコマンドを実行できるかどうかを確認するには、単にsudoを使用することをお勧めします。
sudo -l -U $u
次のように、少し複雑な(または簡潔な)レポートの基礎になることもできます。
for u in $(compgen -u); do echo -n "# $HOSTNAME - $u"; if sudo -l -U $u | grep -vq "not allowed"; then echo -n " [admin]"; fi; echo; done
または
for u in $(compgen -u); do if [ $(id -r -u $u) -gt 3 ]; then echo -n "# $HOSTNAME - $u"; if sudo -l -U $u | grep -vq "not allowed"; then echo -n " [admin]"; fi; echo; fi; done
または
for u in $(compgen -u); do uid="$(id -r -u $u)"; uid=${uid:-"0"}; echo -n "# $HOSTNAME -"; if sudo -l -U $u | grep -vq "not allowed"; then echo -n " [ADMIN]"; fi; echo -n " uid $uid, $u"; echo; done
...上記のコマンドのいずれかを一重引用符で囲んで実行すると、ssh(またはansibleなど)に渡すことができます。
ssh remote-host 'for u in $(compgen -u); do uid="$(id -r -u $u)"; uid=${uid:-"0"}; echo -n "# $HOSTNAME -"; if sudo -l -U $u | grep -vq "not allowed"; then echo -n " [ADMIN]"; fi; echo -n " uid $uid, $u"; echo; done'