Linux の特別な権限 SUID、SGID、SBIT の詳細な説明

Linux の特別な権限 SUID、SGID、SBIT の詳細な説明

序文

Linux のファイルまたはディレクトリの権限については、通常の rwx 権限についてすべて知っている必要があります (Linux の rwx 権限の詳細については、私のブログ投稿 http://www.cnblogs.com/javaee6/p/3994750.html を参照してください)。まず、次の2つの権限が何であるかを見てみましょう

/tmp ディレクトリと passwd ファイルの権限が非常に奇妙であることは非常に奇妙です。なぜ s 権限と t 権限があるのでしょうか?以下の内容を読めば理解できるでしょう。

setuid と setgid は、それぞれ実行時に uid ID を設定する、および実行時にグループ ID を設定することの略語です。これらを suid や sgid と略すことがよくあります。これらはファイル アクセスを制御する権限フラグであり、ユーザーはそれぞれ実行可能ファイルの所有者または所有者グループの権限で実行可能ファイルを実行できます。

注: この記事のデモ環境は Ubuntu 16.04 です。

スイド

Linux では、すべてのアカウントのパスワードは /etc/shadow ファイルに記録され、このファイルを読み書きできるのは root だけです。

別の共通アカウント テスターがパスワードを変更する必要がある場合は、/etc/shadow ファイルにアクセスする必要があります。しかし、/etc/shadow ファイルにアクセスできるのは root だけです。これはどのように行われるのでしょうか?実際、テスター ユーザーは SUID 機能を使用して /etc/shadow ファイル内のパスワードを変更できます。 passwd プログラム ファイルの権限情報を見てみましょう。

上の画像の赤いボックス内の権限情報が少し奇妙です。所有者情報は rwx ではなく rws です。ファイル所有者の x 権限に s が表示される場合、それは SETUID BITS または SETUID と呼ばれ、その特性は次のとおりです。

  • SUID権限はバイナリ実行ファイルに対してのみ有効です
  • 実行者がバイナリ実行可能ファイルに対して x 権限を持っている場合、実行者はファイルの所有者の権限を持ちます。
  • この権限はバイナリ実行ファイルの実行中のみ有効です

次に、テスター ユーザーが SUID 権限を使用してパスワードを変更する方法を見てみましょう。

  • テスターユーザーは/usr/bin/passwdプログラムの実行権限を持っているので、実行することができます。
  • passwdプログラム passwdプログラムの所有者はrootです
  • テスター ユーザーは、passwd プログラムを実行するときに一時的に root 権限を取得します。
  • したがって、テスター ユーザーは、passwd プログラムの実行中に /etc/shadow ファイルを変更できます。

ただし、テスター ユーザーが cat コマンドを実行して /etc/shadow ファイルを読み取ると、機能しません。

理由は明らかです。テスターユーザーには /etc/shadow ファイルを読み取る権限がなく、cat プログラムが SUID に設定されていません。これら 2 つの状況は次の図で理解できます。

どのユーザーでも cat コマンドを使用して /etc/shadow ファイルの内容を読めるようにしたい場合も、非常に簡単です。SUID 権限を設定するだけです。

$ sudo chmod 4755 /bin/cat 

これで、cat に SUID 権限が与えられました。/etc/shadow の内容を cat できるかどうか確認してみましょう。これは非常に危険なので、次のコマンドを使用して cat の SUID 権限をすぐに削除します。

$ sudo chmod 755 /bin/cat

SGID

グループの x 権限に s フラグが表示される場合、それは SGID と呼ばれます。 SGID の特性は SUID の特性と同じです。/usr/bin/mlocate プログラムを使用してその使用方法を説明します。 mlocate プログラムは、データベース ファイル /var/lib/mlocate/mlocate.db を照会して高速なファイル検索を実行します。 mlocate プログラムの権限を次の図に示します。

明らかに、SGID 権限が設定されています。以下は、データベース ファイル /var/lib/mlocate/mlocate.db の権限情報です。明らかに、SGID 権限で設定されています。以下は、データベース ファイル /var/lib/mlocate/mlocate.db の権限情報です。

一般ユーザー tester が mlocate コマンドを実行すると、tester はユーザー グループ mlocate の実行権限を取得します。ユーザー グループ mlocate には mlocate.db の読み取り権限があるため、tester は mlocate.db を読み取ることができます。プログラムの実行プロセスを次の図に示します。

バイナリ プログラムに加えて、SGID はディレクトリでも使用できます。ディレクトリに SGID 権限が設定されている場合、次の機能が実行されます。

  • ユーザーがこのディレクトリに対してrとxの権限を持っている場合、ユーザーはディレクトリに入ることができます。
  • このディレクトリ内のユーザーの有効なユーザーグループは、このディレクトリのユーザーグループになります。
  • ユーザーがこのディレクトリで w 権限を持っている場合、ユーザーが作成した新しいファイルのユーザー グループは、ディレクトリのユーザー グループと同じになります。

例を見てみましょう。testdir ディレクトリを作成し、その権限を次のように設定します。

現時点では、ディレクトリ testdir の所有者は nick であり、グループは tester です。

まず、nickfile というファイルを作成します。

このファイルの権限は特別なものではないようです。次に、testdir ディレクトリの SGID 権限を設定します。

$ sudo chmod 2775 テストディレクトリ

次に、ファイル nickfile2 を作成します。

新しく作成されたファイルが属するグループは tester です。

要約すると、SGID が通常のファイルに対して作用する場合、SUID と同様に、ファイルが実行されると、ユーザーはファイルが属するグループの権限を取得します。 SGID がディレクトリに適用されると、非常に重要な意味を持ちます。ユーザーがディレクトリに対して書き込み権限と実行権限を持っている場合、そのユーザーはそのディレクトリ内にファイルを作成できます。ディレクトリが SGID で変更された場合、そのディレクトリ内にユーザーが作成したファイルは、そのディレクトリが属するグループに属します。

スビット

実際、SBIT は SUID や SGID とはほとんど関係がありません。

SBIT は、制限付き削除フラグまたはスティッキー ビットの略語です。

SBIT は現在ディレクトリに対してのみ機能し、ファイル所有者以外のユーザーがファイルを削除できないようにするために使用されます。一般的な例は /tmp ディレクトリです。

権限情報の最後の t は、ディレクトリに SBIT 権限が設定されていることを示します。 SBIT がディレクトリに与える影響は次のとおりです。ユーザーがディレクトリ内に新しいファイルまたはディレクトリを作成すると、そのファイルまたはディレクトリを削除する権限を持つのはユーザーと root のみになります。

注意: SBIT はファイルでは機能しません。

SUID、SGID、SBIT権限を設定する

数値による権限の設定

SUID、SGID、SBIT 権限に対応する番号は次のとおりです。

SUID->4
SGID->2
SBIT->1

したがって、ファイル権限が「-rwxr-xr-x」のファイルに SUID 権限を設定する場合は、元の 755 の前に 4 を追加して、4755 にする必要があります。

$ chmod 4755 ファイル名

同様に、2 と 1 を使用して SGID および SBIT 権限を設定できます。設定が完了すると、ファイル権限の x がそれぞれ s、s、t に置き換えられます。

実際、S と T の状況も発生する可能性があります。 S と t は x 権限の代わりです。ただし、x 権限がない場合は、SUID、SGID、または SBIT 権限を追加した後、大文字の S または大文字の T として表示されます。たとえば、権限 666 のファイルに SUID、SGID、および SBIT 権限を追加します。

chmod 7666 nickfile を実行します。666 は「-rw-rw-rw」を意味し、x 権限がないため、最終的には「-rwSrwSrwT」になります。

シンボルの種類による権限の変更

権限を変更するには、数字を使用するだけでなく、記号も使用できます。

$ chmod u+s testfile # testfile ファイルに SUID 権限を追加します。
$ chmod g+s testdir # testdir ディレクトリに SGID 権限を追加します。
$ chmod o+t testdir # testdir ディレクトリに SBIT 権限を追加します。

要約する

SUID、SGID、および SBIT 権限は特別な機能を実装するように設計されており、その目的は、ugo 権限では実現できないいくつかの使用シナリオを補うことです。

参照:

  • chmod マニュアルページ
  • setuid - Wikipedia
  • Linux における SUID、SGID、SBIT の素晴らしい使い方
  • Linux の特別な権限 SUID、SGID、SBIT
以下もご興味があるかもしれません:
  • Linux ファイル ディレクトリのデフォルトの権限 (詳細な説明)
  • Linux 基本チュートリアル: 特別な権限 SUID、SGID、SBIT
  • Linux システムファイルのデフォルトの権限と特別な権限

<<:  ドロップダウンボックス選択コンポーネントを実装するためのネイティブ js

>>:  Mac に mysql5.7 をインストールするための完全な手順 (画像とテキスト付き)

推薦する

時間別にグループ化された MySQL クエリ ステートメント

年、月、週、日グループによる MySQL クエリ1. 学年別検索 SELECT DATE_FORMA...

JavaScript を使用してカルーセル効果を実装する

この記事では、カルーセルマップの特殊効果を実現するためのJavaScriptの具体的なコードを参考ま...

MySQL の自動増分 ID (主キー) が不足した場合の解決策

MySQL で使用される自動インクリメント ID には多くの種類があり、各自動インクリメント ID ...

Vueで複数の添付ファイルをアップロードする実装例

目次序文コアコードコードのファイル表示部分序文この記事では主に、Vue プロジェクトでの添付ファイル...

VScode リモート SSH リモート編集とデバッグコード

Visual Studio Code の最新の Insider バージョンには、コードのリモート デ...

Dockerコンテナがホストポートにアクセスできない場合の解決策

最近、仕事中に問題が発生しました。Docker コンテナがホストの redis にアクセスできず、t...

Dockerはブリッジを追加し、IPアドレスの範囲を設定します

バイナリ docker 19.03 バージョンがインストール後に docker0 ブリッジを自動的に...

du コマンドを使用して Linux システム ディレクトリのサイズを取得する方法

Linux システムを使用したことがある人なら、Linux システムの ls コマンドは通常、ファイ...

MySQL InnoDB テーブルスペース暗号化の例の詳細な説明

序文MySQL 5.7.11 以降、MySQL は、別の表領域に格納された InnoDB テーブルの...

docker run -v はデータボリュームを異常にマウントし、コンテナのステータスは常に再起動になります。

問題点: docker run に -v パラメータを追加すると、コンテナは常に再起動状態になります...

Linux 占有ポートの強制解放と Linux ファイアウォールのポート開放方法の詳しい説明

nginx、mysql、tomcat などのサービスをインストールするときに、使用する必要があるポー...

CSS3で実装されたスライドメニュー

結果:実装コード: <!DOCTYPE html><html class=&quo...

MySQL トランザクションの概念と使用法の詳細な説明

目次情事の概念取引の状態取引の役割取引の特徴トランザクション構文トランザクション対応ストレージエンジ...

MySQL 5.6 から 5.7 にアップグレードする際のマスター スレーブ遅延問題のトラブルシューティング

最近、Zabbix データベースを MySQL 5.6 から 5.7 にアップグレードしたときに、マ...

Tomcat 初回展開 Web プロジェクト プロセス図

独自のWebプロジェクトをtomcatディレクトリの下のwebappsディレクトリに配置します。 R...