技術ノート Linux Linux で SUID、SGID、およびスティッキー ビットを使用する方法

Linux で SUID、SGID、およびスティッキー ビットを使用する方法

SUID、SGID、および Sticky Bits は、Linux 上の実行可能ファイルとディレクトリに設定できる強力な特別なアクセス許可です。これらを使用する利点と、潜在的な落とし穴についても説明します。

すでに使用されています

マルチユーザー オペレーティング システムにセキュリティを組み込むと、いくつかの困難が生じます。たとえば、パスワードの(一見)基本的な概念を考えてみましょう。誰かがログインするたびに、システムが入力したパスワードと保存されているコピーを比較できるように、これらはすべて保存する必要があります。明らかに、パスワードは王国への鍵であるため、保護する必要があります。

Linux では、保存されたパスワードは 2 つの方法で保護されます。1 つは暗号化で、もう 1 つは root 権限を持つユーザーのみがパスワードを含むファイルにアクセスできます。それは問題ないように聞こえるかもしれませんが、これには問題があります。root 権限を持つ人だけが保存 root れたパスワードにアクセスできるとしたら、そのアクセス権を持たない人はどうやってパスワードを変更するのでしょうか?

Linux で SUID、SGID、およびスティッキー ビットを使用する方法

ステータスを上げる

通常、Linux のコマンドとプログラムは、プログラムを起動したユーザーと同じ権限セットで実行されます。 root passwd コマンドを実行して パスワードを変更する 場合、このコマンドは root の権限で実行されます。つまり、passwd コマンドは /etc/shadow ファイルに保存されているパスワードに自由にアクセスできます。

理想的なのは、システム上の誰でも passwd プログラムを起動できるが、 passwd プログラムには root の昇格された特権を保持させるというスキームです。これにより、誰でも自分のパスワードを変更できるようになります。

上記のシナリオは、まさに Set User ID ビット ( SUID ) が行うことです。プログラムを起動する人の権限ではなく、ファイル所有者の権限でプログラムとコマンドを実行します。

Linux で SUID、SGID、およびスティッキー ビットを使用する方法

プログラムのステータスを向上させています

ただし、別の問題もあります。その人は他人のパスワードに干渉しないようにする必要があります。 Linux には SUID スキームが組み込まれており、一時的に借用したアクセス許可のセットでアプリケーションを実行できますが、これはセキュリティの話の半分にすぎません。

他人が他人のパスワードを使用して作業できないようにする制御メカニズムは、オペレーティング システムや SUID スキームではなく、passwd プログラム内に含まれています。

昇格された特権で実行されるプログラムは、「セキュリティによる設計」の考え方で作成されていない場合、セキュリティ リスクを引き起こす可能性があります。つまり、セキュリティが最初に考慮され、その後、それに基づいて構築されるということです。プログラムを作成してから、後でセキュリティのコーティングを施すことは避けてください。

オープンソース ソフトウェアの最大の利点は 、ソース コードを自分で確認したり、信頼できるピアレビューを参照したりできること です。 passwd プログラムのソース コードにはチェックがあるため、プログラムを実行している人が root であるかどうかを確認できます。誰かが root (または sudo を使用している人) であれば、さまざまな機能が許可されます。

これは 、誰かが root であるかどうかを検出するコードです。

以下はそれを考慮した例です。 root 任意のパスワードを変更できるため、プログラムは、そのユーザーがどのパスワードを変更する権限を持っているかを確認するために通常実行するチェックをわざわざ行う必要がありません。したがって、 root の場合、 これらのチェックをスキップし、チェック関数を終了します

コアの Linux コマンドとユーティリティにはセキュリティが組み込まれており、コードが何度もレビューされていると確信できます。もちろん、まだ未知のエクスプロイトの脅威は常に存在します。ただし、新たに特定された脆弱性に対処するためのパッチやアップデートがすぐに登場します。

これはサードパーティ ソフトウェア (特にオープンソースではないソフトウェア) であるため、 SUID 使用には細心の注意が必要です。実行しないでくださいと言っているわけではありませんが、実行する場合は、システムがリスクにさらされないようにする必要があります。それ自体とそれを実行する人を正しく自己管理できないプログラムの特権を昇格する必要はありません。

Linux で SUID、SGID、およびスティッキー ビットを使用する方法

SUID を使用する Linux コマンド

以下は、通常のユーザーが実行するときに SUID ビットを使用してコマンドに昇格された権限を与える Linux コマンドの一部です。

 ls -l /bin/su

 ls -l /bin/ping

 ls -l /bin/マウント

ls -l /bin/umount

 ls -l /usr/bin/passwd

ファイル名が赤で強調表示されていることに注意してください。これは、SUID ビットが設定されていることを示します。

ファイルまたはディレクトリのアクセス許可は、通常、rwx という 3 つの文字からなる 3 つのグループで表されます。これらは、読み取り、書き込み、実行を表します。文字が存在する場合、その許可は与えられています。ただし、文字の代わりにハイフン ( - ) が存在する場合、その許可は与えられていません。

これらのアクセス許可には 3 つのグループ (左から右へ) があります。ファイルの所有者用、ファイルのグループのメンバー用、およびその他のアクセス許可です。ファイルに SUID ビットが設定されている場合、「s」は所有者の実行権限を表します。

実行可能機能を持たないファイルに SUID ビットが設定されている場合、大文字の「S」はこれを示します。

例を見てみましょう。通常のユーザー dave が passwd コマンドを入力します。

パスワード

passwd コマンドは、 dave に新しいパスワードの入力を求めます。 ps コマンドを使用する と、実行中のプロセスの詳細を確認でき ます。

別のターミナル ウィンドウで ps grep を使用し、 passwd プロセスを探します。 ps では -e (すべてのプロセス) オプションと -f (フルフォーマット) オプションも使用します。

次のコマンドを入力します。

 ps -e -f | grep パスワード

2 行が報告されます。そのうちの 2 行目は、文字列「passwd」を含むコマンドを検索する grep プロセスです。ただし、これは、 dave 起動した passwd プロセスの行であるため、私たちが興味を持っている最初の行です。

passwd プロセスが、 root が起動した場合と同じように実行されることがわかります。

Linux で SUID、SGID、およびスティッキー ビットを使用する方法

SUID ビットの設定

SUID ビットは chmod を使用して簡単に変更できます。 u+s シンボリック モードは SUID ビットを設定し、 us シンボリック モードは SUID ビットをクリアします。

SUID ビットの概念の一部を説明するために、 htg という小さなプログラムを作成しました。これは dave ユーザーのルート ディレクトリにあり、 SUID ビットが設定されていません。実行すると、実際の有効なユーザー ID ( UID ) が表示されます。

実際の UID は 、プログラムを起動した人に属します。実効 ID は、プログラムが起動されたかのように動作しているアカウントです。

次のように入力します。

 ls -lh htg

 ./htg

プログラムのローカル コピーを実行すると、実際の ID と有効な ID の両方が dave に設定されていることがわかります。したがって、通常のプログラムとまったく同じように動作します。

他の人が使用できるように、これを /usr/local/bin ディレクトリにコピーしましょう。

次のように入力し、 chmod を使用して SUID ビットを設定し、設定されていることを確認します。

 sudo cp htg /usr/local/bin

 sudo chmod u+s /usr/local/bin/htg

 ls -hl /usr/local/bin/htg

したがって、プログラムがコピーされ、SUID ビットが設定されます。もう一度実行しますが、今回は /usr/local/bin フォルダー内のコピーを実行します。

 htg

dave プログラムを起動したにもかかわらず、実効 ID は root ユーザーに設定されます。したがって、 mary プログラムを起動すると、以下に示すように、同じことが起こります。

 htg

実際の ID は mary 、実効 ID は root です。プログラムは root ユーザーの権限で実行されます。

Linux で SUID、SGID、およびスティッキー ビットを使用する方法

SGID ビット

グループ ID 設定 ( SGID ) ビットは SUID ビットと非常によく似ています。実行可能ファイルに SGID ビットが設定されている場合、有効なグループはファイルのグループに設定されます。プロセスは、ファイルを起動した人の権限ではなく、ファイルのグループのメンバーの権限で実行されます。

htg プログラムを微調整して、効果的なグループも表示できるようにしました。 htg プログラムのグループをユーザー mary のデフォルト グループ mary に変更します。また、 chown us および g+s シンボリック モードを使用して SUID ビットを削除し、 SGID を設定します。

これを行うには、次のように入力します。

 sudo chown root:mary /usr/local/bin/htg

 sudo chmod us,g+s /usr/local/bin/htg

 ls -lh /usr/local/bin/htg

グループ権限の「s」で示される SGID ビットを確認できます。また、グループが mary に設定され、ファイル名が黄色で強調表示されていることにも注目してください。

プログラムを実行する前に、 dave mary どのグループに属しているかを確認しましょう。 id コマンドを -G (グループ) オプションとともに使用して、 すべてのグループ ID を出力します 。次に、 htg プログラムを dave として実行します。

次のコマンドを入力します。

 id -G デイブ

id -G マリー

htg

mary のデフォルト グループの ID は 1001 で、 htg プログラムの有効なグループは 1001 です。つまり、このプログラムは dave によって起動されましたが、 mary グループのメンバーの権限で実行されています。それは、 dave mary グループに加わったのと同じです。

SGID ビットをディレクトリに適用してみましょう。まず、「work」というディレクトリを作成し、そのグループを「geek」に変更します。次に、ディレクトリに SGID ビットを設定します。

ls を使用してディレクトリの設定を確認するときは、 -d (ディレクトリ) オプションも使用します。これにより、ディレクトリの内容ではなく詳細が表示されます。

次のコマンドを入力します。

 sudo mkdir 作業

sudo chown dave:オタクの仕事

sudo chmod g+s は機能します

ls -lh -d は動作します

SGID ビットと「geek」グループが設定されます。これらは、 work ディレクトリ内に作成されたすべての項目に影響します。

次のように入力して work ディレクトリに入り、「demo」というディレクトリを作成し、そのプロパティを確認します。

 CD作品

mkdir デモ

ls -lh -d デモ

SGID ビットと「geek」グループは、「demo」ディレクトリに自動的に適用されます。

次のように入力して touch コマンド でファイルを作成し、そのプロパティを確認してみましょう。

便利なタッチ.sh

 ls -lh 便利な.sh

新しいファイルのグループは自動的に「geek」に設定されます。

Linux で SUID、SGID、およびスティッキー ビットを使用する方法

スティッキービット

スティッキービットの名前は、その歴史的な目的に由来しています。実行可能ファイルに設定すると、実行可能ファイルのテキスト部分を swap に保持する必要があるというフラグがオペレーティング システムに設定され、再利用が高速化されます。 Linux では、スティッキー ビットはディレクトリにのみ影響します。ファイルにスティッキー ビットを設定しても意味がありません。

ディレクトリにスティッキー ビットを設定すると、ユーザーはそのディレクトリ内の自分に属するファイルのみを削除できます。ファイルに設定されているファイル権限の組み合わせに関係なく、他人に属するファイルを削除することはできません。

これにより、全員 (およびそのメンバーが起動するプロセス) が共有ファイル ストレージとして使用できるディレクトリを作成できます。繰り返しますが、誰も他の人のファイルを削除できないため、ファイルは保護されています。

「shared」という名前のディレクトリを作成しましょう。 chmod o+t シンボリック モードを使用して、そのディレクトリにスティッキー ビットを設定します。次に、そのディレクトリと /tmp および /var/tmp ディレクトリの権限を確認します。

次のコマンドを入力します。

 mkdir 共有

sudo chmod は共有されていません

ls -lh -d 共有

ls -lh -d /tmp

 ls -lh -d /var/tmp

スティッキー ビットが設定されている場合、ファイル権限の「その他」セットの実行可能ビットは「t」に設定されます。ファイル名も青色で強調表示されます。

/tmp フォルダーと /var/tmp フォルダーは、所有者、グループ、その他に対してすべてのファイル権限が設定されているディレクトリの 2 つの例です (そのため、これらのフォルダーは緑色で強調表示されています)。これらは、一時ファイルの共有場所として使用されます。

これらの権限があれば、理論的には誰でも何でもできるはずです。ただし、スティッキービットはそれらをオーバーライドするため、自分に属さないファイルは誰も削除できません。

リマインダー

以下は、将来の参考のために、上で説明した内容の簡単なチェックリストです。

  • SUID ファイルに対してのみ機能します。
  • SGID ディレクトリとファイルに適用できます。
  • スティッキー ビットはディレクトリにのみ適用できます。
  • s 」、「 g 」、または「 t 」インジケーターが大文字で表示されている場合は、実行可能ビット ( x ) が設定されていません。

これらの点に留意すれば、順調に進んでいきます。

「 Linux で SUID、SGID、およびスティッキー ビットを使用する方法」に関するベスト動画選定!

Special Linux Permissions Part 4
【Linux 入門】パーミッションを超ざっくり解説!【何となく理解するIT】