Linux スクリプト/アプリはどのユーザーとして実行されますか?

Linux スクリプト/アプリはどのユーザーとして実行されますか?

CentOSですが、これは問題ではないと思いますすべきこれは Linux の核となる質問です (そう思います)。CentOS ボックスに Apache Kafka (Java 実行ファイル) をインストールして実行しようとしているときに、Linux 全般に当てはまる質問が思い浮かびました。

シェル スクリプトまたはネイティブ実行可能ファイル (などjava) を実行する場合、スクリプト/実行可能ファイルがどのユーザーとして実行されるかを指定しますか、それとも OS がスクリプト/実行可能ファイルがどのユーザーとして実行されるかを指定しますか (つまり、どのユーザーがスクリプト/実行可能ファイルを実行しているか)?

プロセスがどのユーザーとして実行されるかを指定することは可能であり、一般的ですか? 意味できるスクリプト/アプリケーションは、root ユーザーとして実行する必要があるか、または他の特定のタイプのユーザーとして実行する必要があるかを指定しますか?

いずれにしても、プロセスを root として実行することと、非特権ユーザーとして実行することのどちらがよいかという一般的な警告があるのはなぜでしょうか?

答え1

短い答え:両方です。

より長い (そしてより役に立つ) 回答: デフォルトでは、プログラムはそれを起動したユーザーとして実行されます。ただし、そのように記述され、適切な権限が与えられている場合は、プログラムはルート権限を取得したり、「システム」ユーザーに戻って実行したりできます。ただし、この機能は、パッケージ化およびインストール プロセスを通じて、またはそのマシンの管理者が行うアクションを通じて、プログラムに明示的に付与される必要があります。

一般的な警告があるのは、UNIX および Linux のこれまでの経験から、必要のない昇格された (つまりルート) 権限を使用するプログラムがシステムに悪影響を及ぼすことがよくあることがわかっているためです。これには、データの破損、システムの残りの部分が使用不可/応答不能になる暴走プロセス、意図しない方法で攻撃者がシステムにアクセスできるようにするプロセスなどがあります。

答え2

「シェル スクリプト」が実行されると、そのスクリプトを実行したユーザーの権限で実行されます。パッケージ マネージャー (yum、apt など) を使用してインストールされたほとんどのサービス (kafka、redis、nginx など) は、それらのサービスの制御を容易にするためのヘルパー スクリプトをインストールし、それらのサービスに関連付けられた一意のサービス ユーザー (apache、redis、nginx など) を作成します。これらのヘルパー スクリプトのほぼすべては、最初は root として実行され、その後、そのサービスに割り当てられたサービス ユーザーに権限が付与されます。これにより、承認されたユーザー (つまり、「sudo service kafka start」の実行を許可されているユーザー) だけがそれらのサービスを効果的に制御できるようになります。つまり、システム管理者の Sally は kafka と nginx を起動、停止、再起動できますが、開発者の Jim は kafka (またはそれに類するもの) の起動と停止のみに制限される可能性があります。管理者が Java ユーザーを作成することもできますが、Ruby ユーザーや Python ユーザーと同様に、実際に見たことがありません。むしろ、サービスの所有権は、その特定のサービスに関連するサービス ユーザーに固定されることが多いです。

一部のプロセスは、root として実行されることに依存します (通常、ssh サーバー デーモンは root として実行されます)。他のプロセスは、root として起動することを拒否します (postgresql がその 1 つです)。

/etc/init.d/someservice (または /etc/init/someservice.conf) にあるサービスのヘルパー スクリプトを確認すると、権限の昇格またはドロップを引き起こす実際のスクリプトがそこにコード化されています。 あるいは、ユーザー stephan としてログインし、/usr/sbin/redis-server -c /etc/redis.conf などを実行し、別のウィンドウからそのプロセスを確認すると、redis が stephan によって所有されていることがわかります。

お役に立てれば幸いです。

関連情報