Setuidがユーザーに特権昇格されたファイルを実行させる方法

Bg Setuid

Linuxで実行可能ファイルを実行すると、通常は現在のユーザーおよびグループIDで実行されます。しかし、別のユーザー(例えばroot)としてそのファイルを実行する必要がある場合があります。ユーザーアカウントを切り替える代わりに、setuidを利用して実行可能ファイルを現在のユーザーではなくファイル所有者として実行できます。ここでは、setuidがどのように機能し、ユーザーが特権昇格された実行可能ファイル/バイナリを実行できるようにするかを説明します。

setuidの仕組み

SetuidはSET User ID on executionの略です。rootユーザーによって作成された「identity」という実行可能ファイルがあるとしましょう。それを実行すると、あなたのユーザーID、グループID、およびユーザー特権で実行されます。「identity」ファイルにsetuidビットが設定されている場合、それを実行するとrootユーザーとして、そのユーザー特権で実行されます。

例として、まず「identity」ファイルの所有権を確認し、それがrootユーザーによって所有されていることを確認できます。パーミッション文字列には、ユーザー、グループ、その他のために設定された実行可能(x)ビットも表示されます。

ユーザー「john1」が「identity」ファイルを実行すると、それが実行時にプロセスになります。プロセスリストに示されているように、そのプロセスは「john1」ユーザー名およびユーザーIDの下で作成され、実行されます。

Setuid John Id Owner

次に、rootユーザーとして「identity」ファイルのsetuidビットを設定します:

chmod u+s /usr/bin/identity

「u」はsetuidビット(+s)がユーザーのためだけに設定されるべきことを示します。

所有者のために、パーミッション文字列の実行可能部分では「x」が「s」に置き換えられたことがわかります。実行可能ファイルに対して「s」に出会った場合、それはsetuidビットが設定されていることを意味します。

chmodコマンドの数値バリアントも以下のように使用できます。

chmod4755/usr/bin/identity

数値パーミッション文字列に4を追加することはsetuidビットの追加を示します。

以下は、「john1」が再度「identity」ファイルを実行したときに起こることです。実行中のプロセスのリストを見ると、プロセスが「john1」ではなく「root」ユーザーによって作成され、実行されていることがわかります。

Setuid John Ids Ownder

setuidビットの重要な使用法

ほとんどの場合、専門家からはアプリケーションをrootユーザーとして実行すべきではないと言われます。しかし、特定のファイルはroot権限で実行する必要がある場合があります。たとえば、Linuxシステムにデフォルトでインストールされているpasswdユーティリティにはsetuidビットが設定されています。

理由は簡単です:ユーザーのパスワード情報は「/etc/passwd」と「/etc/shadow」ファイルに保存されており、これらは「root」だけが変更できます。「john1」が自分のパスワードを変更しようとすると、彼は前述の2つのファイルの情報を変更する権限を持っている必要があります。passwdにsetuidビットが設定されていることで、「john1」は一時的にroot権限を持ってユーザーパスワードを変更し、2つのファイルの情報を更新できるようになります。

Setuidのセキュリティリスク

注意しないと、攻撃者はsetuidバイナリを悪用してシステムを制御することができます。ユーザーは通常、特に自分以外のユーザーにsetuidプログラムをインストールすべきではありません。最も重要なのは、ホームフォルダーにrootユーザー用のsetuidが有効なバイナリを持ってはいけないということです。これらは通常、トロイの木馬やマルウェアです。

結論

Setuidは実行可能ファイルにのみ設定できます。同様に、setgidビットも設定でき、これによりグループのすべてのメンバーが所有者の権限で実行可能ファイルを実行できます。

setuidおよびsetgidビットはセキュリティに敏感であり、資格のあるシステム管理者のみが使用する必要があることに注意してください。

次を読む:

  • Linuxの共有ディレクトリでファイルを管理するためのSticky Bitの使用方法
  • Linuxターミナルでのスペルチェックの方法
  • Linuxでファイルを検索するためのfind、locate、which、whereisコマンドの使用