Unix / Linux:実ユーザーID、有効ユーザーID、保存ユーザーIDの違い


102

私はすでに実際のユーザーIDを知っています。これは、システム内のユーザーの一意の番号です。

私のシステムでuidは、My is

$ echo $UID
1014
$                 

他の2つのIDは何の略ですか?
また、有効なユーザーID保存されたユーザーIDの使用方法と、システムでそれを使用する場所は何ですか?


FYI - Wikipediaのページに概説され、また、ファイル・システム・ユーザーIDがある:en.wikipedia.org/wiki/User_identifier
ウィレムバンKetwich

(wikiリンクから)「カーネル2.0以降、Linuxはシグナルを送信するためのSUSv3ルールに準拠しているため、fsuidの存在は必要ありませんが、互換性の理由からfsuidは残っています。」
RtmY

回答:


147

実際のユーザーIDと有効なユーザーIDを区別するのは、一時的に別のユーザーのIDを取得する必要がある場合があるためです(ほとんどの場合root、それはになりますが、どのユーザーでもかまいません)。ユーザーIDが1つしかない場合は、後で元のユーザーIDに戻す方法はありません(単語を当然のことと見なし、の場合はの特権をroot使用rootして任意のユーザーに変更します)。

したがって、実際のユーザーIDはあなたが実際に誰であるか(プロセスを所有するユーザー)であり、有効なユーザーIDは、オペレーティングシステムが何かを行うことが許可されているかどうかを決定するためにオペレーティングシステムが確認するものです(ほとんどの場合)。 、いくつかの例外があります)。

ログインすると、ログインシェルは、実際のユーザーIDと実効ユーザーIDの両方を、パスワードファイルで指定されたものと同じ値(実際のユーザーID)に設定します。

さて、あなたはsetuidプログラムを実行することも起こります、そして他のユーザー(例えばroot)として実行することに加えて、setuidプログラムあなたに代わって何かをすることになっています。これはどのように作動しますか?
setuidプログラムを実行すると、setuidプログラムであるため、実際のID(プロセスの所有者であるため)とファイル所有者の有効なユーザーID(例root:)が表示されます。

プログラムは、スーパーユーザー特権を使用して必要なすべての魔法を実行し、ユーザーに代わって何かを実行したいと考えています。つまり、できないはずのことをしようとすると失敗します。それはどのように行うのですか?まあ、明らかにその有効なユーザーIDを実際のユーザーIDに変更することによって!

今、すべてのカーネルが知っているのでsetuidのプログラムがバックの切り替え方法がないことを、あなたのidと...あるあなたのID。バング、あなたは死んだ。

これが、保存されたユーザー設定IDの目的です。


6
保存セットのユーザーIDに関する最後のポイントの詳細については、Wikipediaを
GDP2 2017年

代わりに実際のuidをチェックするsys呼び出しを見つけることができるいくつかの測定値を教えていただけますか?ありがとう
mik1904

1
@ mik1904:実際に実際のUIDをチェックするために使用する可能性が最も高いのはaccessです。それはその99.9%です。またsetfsuid(まれに必要になります)、いくつかの非常に低レベルの関数、および優先順位またはスケジューラーを取得/設定するための実際のユーザーID、およびシグナルハンドラーに渡された、またはwaitその他によって返されたIDが必要です(ただし、チェックされません)。ある本当のIDが。execveはチェックしませんが、実際のユーザーIDを変更した場合は失敗する可能性があります。またfork、チェックは行われませんが、実際のUIDの最大プロセスクォータに到達すると失敗する可能性があります。グーグルsite:man7.orgはあなたの友達です。
デイモン

「pingコマンドはソケットを開く必要があり、Linuxカーネルはそのためにroot特権を要求します。」これは本当に正確ではありません。 生のソケットpingが必要です。すべてのユーザーは、(通常は)ソケットを開き、リスニングのために、1024以上のことができます
ダニエル・ファレル

35

いくつかの例を挙げて、順を追って説明していきます。

短い背景

各プロセスのような属性が含まれ、独自の「プロセスの資格」はPIDPPIDPGIDsession IDおよび、実と実効ユーザーIDとグループIDを: RUIDEUIDRGIDEGID

それらに焦点を当てます。


パート1:UIDとGIDを理解する

次に、資格情報を使用してシェルにログインし、実行します。

$ grep $LOGNAME /etc/passwd
rotem:x:1000:1000:rotem,,,:/home/rotem:/bin/bash

私のログ名(rotem)、UIDGIDの両方が1000であることがわかります。また、ログインしているシェルなどの詳細も表示されます。


パート2:RUIDとRGIDを理解する

すべてのプロセスには所有者がいて、グループに属しています。
シェルでは、これから実行するすべてのプロセスがユーザーアカウントの特権を継承し、同じUIDとGIDで実行されます。

それをチェックする簡単なコマンドを実行してみましょう:

$ sleep 10 & ps aux | grep 'sleep'

そして、プロセスのUIDとGIDを確認します。

$ stat -c "%u %g" /proc/$pid/
1000 1000

これらは、 ユーザーIDRUID)と実際のグループIDRGIDの)プロセス

(*)をチェックUIDとGIDを表示するために、他のオプションでワンライナーでこれを取得する方法を

今のところ、事実受け入れる EUIDEGID属性が「冗長性」であり、ちょうどに等しいRUIDRGID舞台裏を。

パート3:EUIDとEGIDを理解する

pingコマンドを例にとってみましょう。

whichコマンドでバイナリの場所を検索して実行しますls -la

-rwsr-xr-x  1 root root   64424 Mar 10  2017  ping

ファイルの所有者とグループがであることがわかりますroot。これは、pingコマンドがソケットを開く必要があり、Linuxカーネルrootがそのための特権を要求するためです。

しかし、特権pingがない場合、どのように使用できrootますか?ファイル許可の所有者部分の「x」の代わりに「s」の文字に
注意してください。 これは、setuidと呼ばれる特定のバイナリ実行可能ファイル(およびなど)の特別な許可ビットです。
pingsudo

ここが、EUIDそのEGID出番です。
何が起こるかというと、setuidバイナリがping実行されると、プロセスはその実効ユーザーID(EUID)をデフォルトRUIDからこの特別なバイナリ実行可能ファイルの所有者(この場合は-)に変更しrootます。
これはすべて、このファイルにsetuidビットがあるという単純な事実によって行われます。

カーネルは、プロセスのを調べることにより、このプロセスに特権があるかどうかを判断EUIDします。これでがEUIDポイントされるrootので、操作はカーネルによって拒否されません。

注意:最新のLinuxリリースでは、このsetuidアプローチではなくLinux機能アプローチpingを採用しているため、コマンドの出力は異なるように見えます

パート4:SUIDとSGIDはどうですか?

保存されたユーザーID(SUID)は、(rootたとえば)特権プロセスが実行されており、いくつかの非特権タスクを実行する必要がある場合に使用されます。

その場合、EUID以前の有効なUID()が内部に保存SUIDされ、非特権タスクに変更されます。非特権タスクが完了するEUIDと、の値から取得され、SUID特権アカウントに戻ります。



1
SUIDに関する最後のパラグラフを除いて、明確な答え。特権タスクと特権タスクを混同しました。例が提供されている場合に役立ちます。ありがとう。
Upendra

2
非常に正確な答え。ありがとう!!
user37416
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.