ユーザー名を記録せずに$ USERまたは$ SUDO_USERからスクリプトを実行できますか?

ユーザー名を記録せずに$ USERまたは$ SUDO_USERからスクリプトを実行できますか?

他のユーザーやログインしているユーザー以外のユーザーがBashスクリプトを実行できることを確認しようとしていますsudo -u otherusername

次の行を含むスクリプトがありますecho $USERecho $SUDO_USERこれにより、常にスクリプトを実行しているユーザーが表示されます。

~からこのQ&A特定のユーザーがを使用できることを収集しましたsudo。したがって、変数またはは、SUDO_USERログイン${SUDO_USER:-$USER}したユーザーが呼び出したかどうかを使用してBashスクリプトを呼び出したかどうかを示しますsudo

ログインしたユーザーを使用するかsudo。コマンドは「元の」ユーザー名を表示echo $USERしますか?echo ${SUDO_USER:-$USER}

つまり、スクリプトの実行中に$USERユーザー名を非表示にできますか?$SUDO_USER

インターネットで検索しましたが、「bash call script obfuscating username」という検索キーワードを使用して回答が見つかりませんでした。

おそらく答えは「いいえ」かもしれませんが、何でも可能です...

答え1

sudoアクセス権がある限り、誰でもコマンドを実行できますsudo

$ cat ~/scripts/foo.sh
#!/bin/bash
echo $USER

$ ~/scripts/foo.sh
terdon

terdon@tpad ~ $ sudo -u bib ~/scripts/foo.sh
bib

したがって、ターゲットユーザーのユーザー名でsudo -u USERNAMEスクリプトを実行するだけです。USERNAME

変数SUDO_USERにはコマンドを実行しているユーザーのユーザー名がありますが、sudo変数USERはターゲットユーザーになります。

$ cat ~/scripts/foo.sh
#!/bin/bash
echo "sudo command was run by $SUDO_USER but I am actually $USER"


$ sudo -u bib ~/scripts/foo.sh
sudo command was run by terdon but I am actually bib

答え2

この質問につきましては質問通りにお答えいたします。ただし、質問はシステムのしくみを理解していないと思うように書かれており、この回答を誤って使用するとシステムが安全ではない可能性があります。

上記のリンクでは、一部のユーザーがSUDOを使用できることがわかっているため、SUDO_USERまたは$ {SUDO_USER:-$USER}変数は、ログインしたユーザーまたはSUDOを使用しているユーザーによって呼び出されたかどうかにかかわらず、Bashスクリプトを実行したユーザーを表示できます。 。

sudoに関する部分は正しいですが、sudoを使用しないという部分はそうではありません。次のsudoersルールがある場合

@staff ALL = (priya) /usr/local/bin/myprogram

その後、実行時にこのsudoルールを介してプログラムが呼び出されると、この変数が呼び出し元ユーザーに設定されているmyprogramことを確認できます。その結果、設定されていない場合、実行者は実際のユーザーアカウントにアクセスするための別の方法があります。SUDO_USERsudo myprogramSUDO_USERmyprogrammyprogram

したがってmyprogram、他のユーザーに代わってアクションを実行する必要があり、priya管理者以外のユーザーがアカウントにアクセスできる唯一の方法がこの規則を介してのみ実行される場合、指定されたmyprogramユーザーの代わりにpriyaのリソースに安全にアクセスできますSUDO_USER

昇格された権限なしで実行する場合、myprogramそれを実行している人は誰でも実行方法を選択できます。必要な環境変数を設定できます。このUSER変数は慣例であり、セキュリティとは関係ありません。ただし、とにかくmyprogram昇格された権限なしで実行すると信頼できます(USER必要に応じて)。セキュリティには高い権限が必要です。実行可能なプログラムをブラックボックスに送信し、特定のユーザーだけが実行できることを確認したい場合は、忘れてください。それは不可能であり、そうではないと主張する人は蛇油を売ることです。

つまり、スクリプトを実行するときに$ USERまたは$ SUDO_USERからユーザー名を隠すことはできますか?

これは同じ問題ではありません!上記のように、スクリプトを設定してUSER実行するのはSUDO_USER非常に簡単です。そうでない状況があります。sudoを実行してスクリプトを実行するように指示します。(スクリプトを直接実行する代わりに)この場合にのみデフォルトのsudo設定を想定すると、スクリプトを実行しているユーザーとsudoを呼び出すユーザーがUSER保証されます。SUDO_USER

sudo ルールが program1 を呼び出して program1 が program2 を呼び出す場合、program2 はこの変数を変更しないように program1 を信頼する場合にのみこれらの変数を信頼できます。

ログインしたユーザーを使用したり、SUDOを使用したりする以外に、Bashスクリプトを実行する他の方法は考えられません。

プログラムの他のサービスを呼び出します。非常に一般的なこと予約されたこと。通常、ユーザーはログインしてcrontabを編集しますが、その後、ユーザーは「ログイン」(つまり、コンピュータの前にいるか資格情報を入力する)を必要とせずにcronジョブが実行されます。 cronはログインと見なされるため、ユーザーは「ログイン」されます(用語の問題です)。

別のアカウントを使用してプログラムを呼び出す別の方法があります。(対象アカウントの資格情報が必要)プログラムの実行(通常、ターゲットアカウントの資格情報が必要ですが、より複雑な戦略も可能です。)または、プログラムがある種の名前空間またはコンテナ内で実行される可能性があります(ここにリストするには多すぎます)。

Linuxには別の概念があります。「ログインID」。この値は、ユーザーがログインしたときに設定し、ユーザーが別のアカウントに変更したときに変更しないでください。たとえば、ユーザーログインの一般的なフロー(制限設定、呼び出しなど)に従いますが、su -loginuidは変更しません。次のコマンドを使用するか、次のコマンドを使用してloginuidを取得できます。sudo -i.profile/proc/self/loginuidlogname注文する。これは主に監査目的で使用されます。デフォルトではルートできるログインIDを変更してください。また、loginuidはプロセス固有の概念であるため、ログインした単一ユーザーのグローバル概念はありません。

関連情報