ユーザーがパスワードなしで「sudo」を使用できることを確認する

ユーザーがパスワードなしで「sudo」を使用できることを確認する

ユーザーが利用できるかどうかを確認したいのですがsudo-いいえbashシェルスクリプト用のパスワードを作成する必要があります。私はいくつかの調査を行い、次の事実を見つけました。

sudoersinで構成されていないため使用できないユーザーのsudo場合sudo -n <command> いつも端末にメッセージを印刷しますsudo: a password is required。そしてユーザーが利用可能な場合sudo-sudoセッションで実行されていない、sudoまたは停止する期限切れ -sudo: a password is requiredメッセージが再印刷されます。

また、正しい解決策を使用してください(ただし他の場合)。

$(sudo -n uptime 2>&1 | grep "load" | wc -l)

sudo承認されていないユーザーの場合いつも0を返します。ユーザーが利用できsudosudo停止するそれでも有効 - 1を返し、そうでない場合は0を返します。

質問:だからこの方法を使うのはいいえコマンドを使用すると、ユーザーが利用可能かどうかを実際に知ることができますsudo。このソリューションは、次のことを知っている場合にのみ可能ですsudo停止するまだ有効ですか?

これまでのsudo -v解決策はほぼ次のとおりです。

sudoersコマンドで返された構成を持たないユーザーの場合

Sorry, user <username> may not run sudo on <hostname>.

ユーザーが利用できる場合はパスワードが必要ですsudosudo -vそれが有効な場合、sudoまたは停止するそれでも有効です。。したがって、ここまでは明確な違いと解決策はありません。しかし、Bash Shell仕事をしていて使うべきだからコマンドの置き換え

is_user_sudo=$(sudo -v) # if is empty sudo can be used otherwise not

質問パスワードプロンプト部分を避けたいです。これが解決策になります。

sudo -kまたは、パスワードを要求しないなどの他のパラメータ(もちろん、他のタスクを実行する)や目的を達成するための別のコマンドがある場合。

ターゲット:唯一ルートではない利用可能なユーザーはsudoいくつかのbashスクリプトを実行できます。したがって、スクリプト内でタイプを識別するコマンドが必要です。ルートではないユーザー - したがって、non-root使用できないユーザーに通知してスクリプトの実行を停止するsudo必要があります。

たとえば、

# an if statement about 'id -u' not equals a 0
can_use_sudo=$(<command> whoami) # so the non-root user 
                                 # is able to use sudo or not?

whoami識別する他のコマンドに置き換えることができます。WHOスクリプト実行中

答え1

私はあなたがこれをしたい理由とスクリプトの冒頭sudo whoamiでユーザーにすぐにパスワードを尋ね、ユーザーが続行できないときに終了するために何かを実行または実行しない理由をよく理解していないことを認めます。いいですね。少なくともLinuxシステムでは動作します(sudoまだ他の実装を確認していません)。

sudo_response=$(SUDO_ASKPASS=/bin/false sudo -A whoami 2>&1 | wc -l)
if [ $sudo_response = 2 ]; then
    can_sudo=1
elif [ $sudo_response = 1 ]; then
    can_sudo=0
else
    echo "Unexpected sudo response: $sudo_response" >&2
    exit 1
fi

askpassここでの秘密は、他のプログラムを使用してパスワードを確認するオプションを利用することです。sudoこれを設定すると、ユーザーがrootとしてコマンドを実行できるかどうかに応じて、2つの標準応答を取得/bin/falseできます。sudo

## A user with sudo rights
terdon@tpad $ SUDO_ASKPASS=/bin/false sudo -A whoami 2>&1 
sudo: no password was provided
sudo: a password is required

## A user without sudo rights
bib@tpad $ SUDO_ASKPASS=/bin/false sudo -A whoami
bib is not in the sudoers file.  This incident will be reported.

したがって、stderrをstdoutにリダイレクトした後の応答が2行の場合、ユーザーはsudoコマンドを実行でき、1行の場合はコマンドを実行できません。

重要:私はこれを広くテストしていません。上記のように、2人のユーザーを持つ単一のArch Linuxシステムでのみ試しました。上記のコマンドの出力を変更できる場合は、他のシステムで期待どおりに機能しなくても驚くことはありません。

sudo明らかな失敗の場合:ユーザーがパスワードなしでコマンドを実行するように構成されている場合、これは機能しません。

答え2

まだ明確な確認は見つかりませんでしたが、デザインによってこの操作は認証や権限なしで行うことはできません。

権限のないユーザーではないと思います。しなければならないユーザーとコマンドを選択し、そのユーザーにコマンドを実行する権限があることを確認する機能sudo。これは、攻撃者がシステムを調査し、どのアカウントが最も価値があるかを理解するのに非常に役立ちますが、どのような利点をもたらすかは不明です。

/etc/sudoersこのファイルはデフォルトでロックされており、ルート以外では読み取れないことに注意する価値があります。

答え3

sudoユーザーがコマンドを使用できることを確認したいが、いいえパスワードを書く必要があります

groups user_nameユーザーが属するすべてのグループが表示されます。ユーザーがsudoこのグループのメンバーである場合、ユーザーは可能使用することができるsudo (@terdonが指摘したように、グループメンバーシップは権限を付与するものではありませんが、ユーザーsudoが単に「一般ユーザー」または「管理者」として作成される一般的な場合、sudoグループメンバーシップは権限に関連していますsudo

if [ -z "$(groups user_name | grep sudo)" ]; then
    echo 'user is not in sudo group'
else
    echo 'user is in sudo group'
fi

もちろん、これはsudoersファイルに存在する可能性があるより細かい権限を教えてくれません。これを読むにはルートが必要です。

関連情報