SUID、SGID、および Sticky Bits は、Linux 上の実行可能ファイルとディレクトリに設定できる強力な特別なアクセス許可です。これらを使用する利点と、潜在的な落とし穴についても説明します。
すでに使用されています
マルチユーザー オペレーティング システムにセキュリティを組み込むと、いくつかの困難が生じます。たとえば、パスワードの(一見)基本的な概念を考えてみましょう。誰かがログインするたびに、システムが入力したパスワードと保存されているコピーを比較できるように、これらはすべて保存する必要があります。明らかに、パスワードは王国への鍵であるため、保護する必要があります。
Linux では、保存されたパスワードは 2 つの方法で保護されます。1 つは暗号化で、もう 1 つは
root
権限を持つユーザーのみがパスワードを含むファイルにアクセスできます。それは問題ないように聞こえるかもしれませんが、これには問題があります。root 権限を持つ人だけが保存
root
れたパスワードにアクセスできるとしたら、そのアクセス権を持たない人はどうやってパスワードを変更するのでしょうか?
ステータスを上げる
通常、Linux のコマンドとプログラムは、プログラムを起動したユーザーと同じ権限セットで実行されます。
root
passwd コマンドを実行して
パスワードを変更する
場合、このコマンドは
root
の権限で実行されます。つまり、passwd コマンドは /etc/shadow ファイルに保存されているパスワードに自由にアクセスできます。
理想的なのは、システム上の誰でも passwd プログラムを起動できるが、 passwd プログラムには
root
の昇格された特権を保持させるというスキームです。これにより、誰でも自分のパスワードを変更できるようになります。
上記のシナリオは、まさに Set User ID ビット (
SUID
) が行うことです。プログラムを起動する人の権限ではなく、ファイル所有者の権限でプログラムとコマンドを実行します。
プログラムのステータスを向上させています
ただし、別の問題もあります。その人は他人のパスワードに干渉しないようにする必要があります。 Linux には
SUID
スキームが組み込まれており、一時的に借用したアクセス許可のセットでアプリケーションを実行できますが、これはセキュリティの話の半分にすぎません。
他人が他人のパスワードを使用して作業できないようにする制御メカニズムは、オペレーティング システムや SUID スキームではなく、passwd プログラム内に含まれています。
昇格された特権で実行されるプログラムは、「セキュリティによる設計」の考え方で作成されていない場合、セキュリティ リスクを引き起こす可能性があります。つまり、セキュリティが最初に考慮され、その後、それに基づいて構築されるということです。プログラムを作成してから、後でセキュリティのコーティングを施すことは避けてください。
オープンソース ソフトウェアの最大の利点は
、ソース コードを自分で確認したり、信頼できるピアレビューを参照したりできること
です。
passwd
プログラムのソース コードにはチェックがあるため、プログラムを実行している人が
root
であるかどうかを確認できます。誰かが
root
(または
sudo
を使用している人) であれば、さまざまな機能が許可されます。
これは
、誰かが
root
であるかどうかを検出するコードです。
以下はそれを考慮した例です。
root
任意のパスワードを変更できるため、プログラムは、そのユーザーがどのパスワードを変更する権限を持っているかを確認するために通常実行するチェックをわざわざ行う必要がありません。したがって、
root
の場合、
これらのチェックをスキップし、チェック関数を終了します
。
コアの Linux コマンドとユーティリティにはセキュリティが組み込まれており、コードが何度もレビューされていると確信できます。もちろん、まだ未知のエクスプロイトの脅威は常に存在します。ただし、新たに特定された脆弱性に対処するためのパッチやアップデートがすぐに登場します。
これはサードパーティ ソフトウェア (特にオープンソースではないソフトウェア) であるため、
SUID
使用には細心の注意が必要です。実行しないでくださいと言っているわけではありませんが、実行する場合は、システムがリスクにさらされないようにする必要があります。それ自体とそれを実行する人を正しく自己管理できないプログラムの特権を昇格する必要はありません。
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
が起動した場合と同じように実行されることがわかります。
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 ユーザーの権限で実行されます。
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」に設定されます。
スティッキービット
スティッキービットの名前は、その歴史的な目的に由来しています。実行可能ファイルに設定すると、実行可能ファイルのテキスト部分を 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) が設定されていません。
これらの点に留意すれば、順調に進んでいきます。





