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 をインストールするための完全な手順 (画像とテキスト付き)

推薦する

iframe ページパラメータの文字化けの問題について議論

非常に珍しいパラメータ文字化けの問題に遭遇しました。まずページを見てみましょう写真に示すように、月次...

React NativeのScrollViewプルダウンリフレッシュ効果

この記事では、React Native ScrollViewのプルダウンリフレッシュ効果の具体的なコ...

DockerがElasticsearch7.xを起動してエラーを報告する問題を解決する

Docker実行コマンドの使用docker run -d -p 9200:9200 -p 9300:...

HTML の著作権記号のフォント選択問題 (著作権記号をより美しくする方法)

1. 問題を発見する&copy; は HTML の著作権記号ですが、間違ったフォントを選択す...

MySQL をクリーンにアンインストールする方法 (テスト済みで効果的)

Mysql を完全にアンインストールするにはどうすればいいですか?以下の手順に従って実行してくださ...

Centos Docker ブリッジ モードでホスト Redis サービスにアクセスできないというトラブルシューティングの経験

背景:以前、コンテナ内のホストが提供する Redis サービスにアクセスする必要があるプロジェクトを...

Django が uwsgi+nginx プロキシで静的リソースにアクセスできない問題の解決方法

uwsgi+nginx プロキシ Django をデプロイする場合、uwsgi を使用したアクセスは...

vue3.2 で追加された defineCustomElement の基本原理の詳細な説明

目次Webコンポーネントカスタム要素概要HTMLTemplateElement コンテンツ テンプレ...

Linux での umask の使用に関する詳細な説明

私は最近 Linux を学び始めました。Ma Ge の umask に関する Linux コースを読...

Linuxでテキスト比較を実現するコツを教えます

序文コードを書く過程で、必然的にコードに何らかの変更を加えることになります。しかし、変更を加えるとき...

IE で ClearType をオンにした後の透明フォントの問題の解決方法

IE で ClearType をオンにした後に発生する透明フォントの問題を解決するには、透明要素に背...

MySQL でプロファイルを使用する方法のチュートリアル

プロフィールとは何ですか?特定の SQL のパフォーマンスを分析したい場合に使用できます。プロファイ...

Dockerコンテナを終了した後も実行を継続する方法

現象:イメージを実行します (例: ubuntu14.04)。 docker run -it --r...

MySQLのファジークエリのような遅い速度を解決する方法

質問: インデックスは作成されているのに、Like ファジー クエリがまだ遅いのはなぜですか?インデ...