Linuxはプロセスの権限を深く理解します。


Linuxプロセス権限分析
linuxでは、ファイルの権限については、ほとんどの人が接触しています。よく知っています。しかし、プロセスの権限については、一般的にはあまり知られていません。この文章はlinuxシステムにおけるプロセス権限問題と現象をまとめます。
ここではlinuxとunixには多くの異なるところがあり、それぞれ異なるunixシステムも多くの違いがあるので、ここではlinuxシステムの下で議論する必要がある。
まず、本論文の討論対象として挙げられるのは、ruid(実際のユーザーID:real userid)、euid(有効ユーザー:effective userid)、suid(保存ユーザID:saved userid)、fuid(ファイルシステムユーザID)です。
上の4つに加えて、ユーザーIDビット(set user id bit)を設定するビット、すなわち、私たちが通常話している処rwx以外のsマークビットにも関連しています。
また、本文では主にuserid、groupidルールが基本的に同じであることを議論します。例えば、rgid、egid、sgid、fgidなどは、グループIDに関して重複した議論を行いません。
まず、これらのuidを見る方法は2つあります。一つはpsコマンド(ps-ax-o ruid-o euid-o suid-o fuid-o pid-o fname)はこれらのuidを並べます。二つ目はstatusファイルを確認します。(cat/proc/2495/status grep Uid)。
本論文では、5つのtestユーザtest 1〜test 5を作成して、本明細書でのsample討論の使用に用い、一般的な権限ユーザを表します。
一:ファイルオーナーユーザとプログラム実行者ユーザが同じユーザである場合

int main(int argc, char *argv[])
{
  while(1)sleep(1);
}
  $>g++ main.cpp -o a.out
  
  $>ll
  -rwxr-xr-x. 1 test1 test 6780 Sep 16 15:32 a.out
        test1,   test1    a.out  
  $>su test1
  $>./a.out &
  $>ps -ax -o ruid -o euid -o suid -o fuid -o pid -o fname | grep a.out
  502  502  502  502 3192 a.out
   (     4 uid  test1;)
       test2    test1       
  $su test2
  503  503  503  503 3234 a.out
    root    
  0   0   0   0 3257 a.out
この結果を見て、私達は基本的にまとめられます。
よくある場合には。これらの4つのIDは実行ユーザーの影響を受けており、ファイルのownerユーザーの影響を受けない。そして4つのuidは全部ユーザーのidを実行することに等しい。
二、譲渡権限は他のユーザーに与える。root以外のユーザーは他のユーザーに権限を譲ることができません。rootユーザーだけが譲ることができます。

int main(int argc, char *argv[])
{
  if( setuid(503) < 0) perror ("setuid error");
  while(1)sleep(1);
}
  $>ll
  -rwxr-xr-x. 1 test1 test 6780 Sep 16 15:32 a.out 
    root    
  $>./a.out
      ,  uid   test2  。
  503  503  503  503 3592 a.out

      setuid  seteuid  ,  euid fuid  test2  
  0  503   0  503 3614 a.out
  
      setuid  setfsuid  ,  fuid  test2  
  0   0   0  503 3636 a.out

            
if( seteuid(503) < 0) perror ("seteuid error");
if( setfsuid(504) < 0) perror ("setfsuid error");
while(1)sleep(1);
    
if( setfsuid(504) < 0) perror ("setfsuid error");
if( setfeuid(503) < 0) perror ("seteuid error");
while(1)sleep(1);
   root    ,         
  0  503   0  503 3614 a.out 
  
          :1、setuid seteuid     ,setuid      root    ,    root   ,
   restore root  ,seteuid     root    ,    seteuid(0),restore root  。
            ,         。
2、seteuid      euid fuid     euid 。
3、root setxxuid 。 root 。
引き続きs権限ビットのプロセス権限への影響を見てください。
三、sマークの影響はeuid、suid、及びfuidです。

int main(int argc, char *argv[])
{
  while(1)sleep(1);
}
  $>g++ main.cpp
  $>ll
   -rwxr-xr-x. 1 test1 test 6780 Sep 16 18:18 a.out
  $>chmod u+s a.out
  $>ll
   -rwsr-xr-x. 1 test1 test 6780 Sep 16 18:18 a.out

    root    ,    ID 
  0  502  502  502 4133 a.out

s権限ビット使用の最も古典的なケースは、passwdコマンドです。
以下では、文書の権限に対する彼らの影響を見てみます。ruid、euid、fuidとは違って、作成したファイルの所有者はどれですか?
四、ユーザーのファイル権限に影響を与えるのはfuidで、euidではなく、このuidはlinux特有の属性であり、unixシステムはeuidによってユーザー権限を判定する。

int main(int argc, char *argv[])
{
  if( setfsuid(503) < 0) perror ("setfsuid error");
  FILE * fp = fopen("test.log", "a+");
  if(fp == NULL)
  {
    perror ("fopen error");
  }
  else
  {
    fclose(fp);
  }
  while(1)sleep(1);
}
    s   ,      root,    test1,  fuid test2,      3 uid    ,      
 $>ll
  -rws---r-x. 1 root root 7397 Sep 16 18:53 a.out
       ,ruid test1,euid root,fuid test2
  502   0   0  503 4240 a.out
 $>ll
  -rws---r-x. 1 root root 7397 Sep 16 18:53 a.out
  -rw-rw-r--. 1 test2 test  0 Sep 16 18:54 test.log
五、権限の継承は、fork子プロセスを使用する時、子プロセスは全部父プロセスの四つのuidを継承します。父プロセスのuidと同じです。
execシリーズ関数を使うと、suidをeuidにします。
読んでくれてありがとうございます。みなさんのご協力をお願いします。ありがとうございます。