Linux進程的uid和euid

來源:互聯網
上載者:User

 

對可執行檔設定 setuid 許可權時,將對運行該檔案的進程授予基於檔案屬主的存取權限。該存取權限不是基於正在運行可執行檔的使用者。使用此特殊許可權,使用者可以訪問通常只有屬主才可訪問的檔案和目錄。 

可以使用chmod u+s 或chmod g+s來設定二進位的可執行檔的euid。setuid只能對二進位的可執行設定。

 

一 進程的uid和euid 

轉自:http://bbs.linuxpk.com/thread-39597-1-1.html 

 

linux系統中每個進程都有2個ID,分別為使用者ID(uid)和有效使用者ID(euid),UID一般表示進程的建立者(屬於哪個使用者建立),而EUID表示進程對於檔案和資源的存取權限(具備等同於哪個使用者的許可權)。C語言中,可以通過函數getuid()和geteuid()來獲得進程的兩個ID值。

當一個使用者登陸系統時,系統會將UID和EUID都賦值為/etc/passwd檔案中的UID,一般情況下2個ID是相同的,但是某些情況下會出現2個ID不同的情況。
gid和egid同理。

下面一段C代碼將解釋區別:"printid.c"

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main(void)
{
    printf(" UID\t= %d\n", getuid());
    printf(" EUID\t= %d\n", geteuid());
    printf(" GID\t= %d\n", getgid());
    printf(" EGID\t= %d\n", getegid());

    return EXIT_SUCCESS;
}

編譯之:
aguo@linux-x9rc:~> gcc -o printid printid.c 

執行:
aguo@linux-x9rc:~> ./printid 
Real UID        = 1000
Effective UID        = 1000
Real GID        = 100
Effective GID        = 100

看看/etc/passwd裡uid和gid:
aguo@linux-x9rc:~> cat /etc/passwd | grep aguo | awk -F":" '{print "uid:"$3 "\tgid:"$4}'
uid:1000        gid:100

以上是相同的例子。

下面示範uid和euid不同的例子。
首先,修改一下檔案屬性,setuid或setgid
aguo@linux-x9rc:~> chmod u+s printid #這樣一來,檔案在執行階段具有檔案所有者的許可權。
還可以再補充一個:
aguo@linux-x9rc:~> chmod g+s printid #這樣一來,檔案在執行階段具有檔案所屬組的許可權。

其次,變成其他使用者,再來實驗一下,比如變成root;
linux-x9rc:/home/aguo # ./printid 
Real UID        = 0
Effective UID        = 1000
Real GID        = 0
Effective GID        = 100

看到了吧?uid和euid是有區別的!
以上示範環境:
OS:SuSE Desktop Linux 11
gcc:4.3.2

順便補充一下:
perl裡面的特殊變數$<、$>表示uid euid; $(、$)表示gid egid。
只是,$(和$)會儲存一個列表,第一位表示的才是gid和egid,這個是perl的設定,不在本文討論範圍中。 

 

二 passwd 執行個體

轉自:http://keren.blog.51cto.com/720558/144908  

 

【關於linux的passwd命令】 passwd命令是用來修改使用者登陸密碼的,用來記錄使用者登陸密碼的檔案為/etc/shadow,該檔案只有root使用者具有存取權限,如下所示:gaolu@gaolu-desktop:~$gaolu@gaolu-desktop:~$ cd /etcgaolu@gaolu-desktop:/etc$ ls -l shadow-rw-r----- 1 root shadow 978 2009-02-22 21:25 shadowgaolu@gaolu-desktop:/etc$

 

這是出現了矛盾:出於安全考慮,不允許普通使用者查看並修改shadow檔案;但是如果這樣普通使用者就無法為自己修改密碼。

 

Linux系統就是使用setuid來解決這個矛盾的問題:如果一個程式被設定了setuid位,那麼它無論被哪個使用者啟用,都會具備程式所有者的許可權。而passwd程式的所有者是root使用者,passwd的許可權如下所示,那麼任何使用者執行該程式,程式的EUID就會變成root使用者的EUID,而不是執行該程式的UID。

 

gaolu@gaolu-desktop:/etc$ cd /usr/bingaolu@gaolu-desktop:/usr/bin$ ls -l passwd-rwsr-xr-x 1 root root 32988 2008-06-10 02:10 passwdgaolu@gaolu-desktop:/usr/bin$gaolu@gaolu-desktop:/usr/bin$

 

因此,普通使用者可以通過passwd程式修改shadow檔案內容,完成密碼修改。

 

 

 

完! 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.