私はすでに実際のユーザーIDを知っています。これは、システム内のユーザーの一意の番号です。
私のシステムでuid
は、My is
$ echo $UID
1014
$
他の2つのIDは何の略ですか?
また、有効なユーザーIDと保存されたユーザーIDの使用方法と、システムでそれを使用する場所は何ですか?
私はすでに実際のユーザーIDを知っています。これは、システム内のユーザーの一意の番号です。
私のシステムでuid
は、My is
$ echo $UID
1014
$
他の2つのIDは何の略ですか?
また、有効なユーザーIDと保存されたユーザーIDの使用方法と、システムでそれを使用する場所は何ですか?
回答:
実際のユーザー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の目的です。
access
です。それはその99.9%です。またsetfsuid
(まれに必要になります)、いくつかの非常に低レベルの関数、および優先順位またはスケジューラーを取得/設定するための実際のユーザーID、およびシグナルハンドラーに渡された、またはwait
その他によって返されたIDが必要です(ただし、チェックされません)。ある本当のIDが。execve
はチェックしませんが、実際のユーザーIDを変更した場合は失敗する可能性があります。またfork
、チェックは行われませんが、実際のUIDの最大プロセスクォータに到達すると失敗する可能性があります。グーグルsite:man7.org
はあなたの友達です。
ping
が必要です。すべてのユーザーは、(通常は)ソケットを開き、リスニングのために、1024以上のことができます
いくつかの例を挙げて、順を追って説明していきます。
短い背景
各プロセスのような属性が含まれ、独自の「プロセスの資格」はPID
、PPID
、PGID
、session ID
および、実と実効ユーザーIDとグループIDを:
RUID
、EUID
、RGID
、EGID
。
それらに焦点を当てます。
パート1:UIDとGIDを理解する
次に、資格情報を使用してシェルにログインし、実行します。
$ grep $LOGNAME /etc/passwd
rotem:x:1000:1000:rotem,,,:/home/rotem:/bin/bash
私のログ名(rotem)、UIDとGIDの両方が1000であることがわかります。また、ログインしているシェルなどの詳細も表示されます。
パート2:RUIDとRGIDを理解する
すべてのプロセスには所有者がいて、グループに属しています。
シェルでは、これから実行するすべてのプロセスがユーザーアカウントの特権を継承し、同じUIDとGIDで実行されます。
それをチェックする簡単なコマンドを実行してみましょう:
$ sleep 10 & ps aux | grep 'sleep'
そして、プロセスのUIDとGIDを確認します。
$ stat -c "%u %g" /proc/$pid/
1000 1000
これらは、実 ユーザーID(RUID
)と実際のグループID(RGID
の)プロセス。
(*)をチェックUIDとGIDを表示するために、他のオプションとでワンライナーでこれを取得する方法を。
今のところ、事実受け入れる EUID
とEGID
属性が「冗長性」であり、ちょうどに等しいRUID
とRGID
舞台裏を。
パート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と呼ばれる特定のバイナリ実行可能ファイル(およびなど)の特別な許可ビットです。ping
sudo
ここが、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
特権アカウントに戻ります。