他のユーザーやログインしているユーザー以外のユーザーがBashスクリプトを実行できることを確認しようとしていますsudo -u otherusername
。
次の行を含むスクリプトがありますecho $USER
。
echo $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_USER
sudo myprogram
SUDO_USER
myprogram
myprogram
したがって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/loginuid
logname
注文する。これは主に監査目的で使用されます。デフォルトではルートできるログインIDを変更してください。また、loginuidはプロセス固有の概念であるため、ログインした単一ユーザーのグローバル概念はありません。