他のユーザーとして単一のコマンドを実行する。sudo の制限

他のユーザーとして単一のコマンドを実行する。sudo の制限

私はルート権限のないマシンで作業していますが、許可されているsudoコマンドのリストがあります。これらのコマンドの 1 つが です/bin/su - foouser。 と入力するsudo su - foouserと、foouser として対話型シェルが起動します。その後、 としていくつかの操作を実行できますfoouser

問題は、foouser特定の重要な生産プロセスを起動するために使用される共有ユーザー/シェルであることです。簡単にカスタマイズしたり、希望どおりに設定したりすることはできません。また、一貫して作業するべきではないため、ターミナルとコマンド履歴が、自分自身としてログインしているターミナルと、 としてログインしているターミナルの間で分割されますfoouser

私が本当にやりたいのは、単一のコマンドを として実行しfoouser、それをブロックし、コマンドが通常行うように stdout と stderr をシェルに出力し、私自身としてログインしたまま ( ではなく) 戻る方法です。これは、たとえば、コマンド を として実行し、 stdout と stderr を出力し、 の戻りコードを返し、その後シェルに戻るようfoouserにスクリプトにカプセル化することができます。as_foo barbarfoouserbar

システム管理者に権限の変更を依頼できます。たとえば、barsudo リストに追加してもらい、 (おそらく) を使用して、su -c説明した方法で bar を実行できます。ただし、翌日に を実行したい場合はbar2、再度管理者に問い合わせる必要があります。

このジレンマから抜け出す方法はあるのでしょうか? 明らかに、私はfoouser好きなだけコマンドを実行して、セキュリティの面で違いがないように思えるので、これはかなりばかげているように思えます。これを可能にする明白で便利な方法が見つからないだけです。

答え1

sudo su - foouser <command>root として実行するには、少なくとも制限付きの root アクセスが必要ですsu - foouser <command>

sudo -u foouser <command>必要な操作を 1 ステップで実行できます。ただし、システム管理者が次のようにアカウントsudoへのアクセスを許可している必要があります。foouser

ignacio ALL=(foouser) ALL

代わりに次のようにします:

ignacio ALL=(root) su - foouser

このように設定するとsudo、たとえば、想定したようなエイリアスを定義できるようになります。

as_foo='sudo -u foouser'

また、 を避けることでsu -、独自のカスタマイズを使い続けることができるかもしれません。 をsudoこのように使用すると、ユーザーIDのみが変更され、HOME以前の値は保持され、シェル起動スクリプトやその他のカスタマイズが読み込まれます。あなたの'sの代わりにホーム ディレクトリを使用しますfoouser

(もちろん、それらのスクリプトは他のユーザーからも読み取り可能である必要があり、実行する可能性のある共有スクリプトは、foouserのホーム ディレクトリ/home/foouserを ではなくとして明示的に参照する方がよいでしょう$HOME。)

sudoただし、このソリューションが機能しない設定がいくつかあります。sudoersalways_set_homeファイルで sudo オプションが設定されている場合、またはリストにenv_reset追加せずにオプションが設定されている場合は、いずれにせよリセットされます。このような状況では、コマンドにオプションを追加して、環境を保持するように明示的に要求してみてください。HOMEenv_keepHOME-Esudo

foouserそして、としてログインしたときとまったく同じ環境設定で何かを実行したい場合foouser(つまり、 と同等sudo su - foouser)、-iそのことを具体的に要求するオプションを追加します。 はsudo -i -u foouserの 100% 正確な置き換えですsudo su - foouser

sudoの非常に古いバージョンでオプションがないシステムを見つけた場合は-i-H代わりに sudo でオプションを使用してください。これは完全な代替品ではありませんが、十分な場合があります。 のこのような古いバージョンには、sudoセキュリティに関係する既知のバグもいくつかある可能性が高いため、いずれにしても更新する価値はあります。

sudo -l自分自身で as を使用すると、sudo アクセスがどのように定義されているか、どの sudo オプション (別名、デフォルト エントリ) が有効になっているかを正確に確認できます。

答え2

追加の引数を に渡しますsu

sudo su - foouser sh -c 'echo $USER'

関連情報