Linux-各類uid

Linux-各類UID

1、UID

UID是系統中用來表示用戶的標識符,啓動的進程的uid就是當前登陸用戶的uid,查看用戶uid可以使用id -u <username>命令linux

須要注意的是,權限檢查的時候是對euid檢查,一般狀況下進程的euid是和uid相同的。shell

2、EUID

euideffective user id ,有效用戶ID。編程

euid做用

用於文件訪問檢查,euid和決定了進程是否有訪問某個文件的能力。例如,編寫下面代碼:ui

/* testeuid.c */
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>

int main(int argc, char * argv[])
{
    if (argc != 2)
        return 0;
    printf("uid: %d\teuid: %d\n", getuid(), geteuid());
    printf("trying to open %s\n", argv[1]);
    int fd = open(argv[1], O_RDONLY);
    if (fd < 0)
        perror("open");
    else
        printf("success\n");
    return 0;
}

編譯並運行spa

euid
上述執行過程當中,將a.file擁有者改成root並修改訪問權限爲root只讀後,我以eureka用戶的身份沒法訪問該文件。unix

3、SUID

看APUE發現本身對suid不是特別瞭解,查資料以後明白了,記錄以下。code

參考文章:blog

what is suid進程

上面連接中的文章說的很準確,SUID即(Set Owner User ID up on execution)get

在執行時設置爲全部者ID,一個例子就是/usr/bin/passwd這個可執行文件。

$ ls /usr/bin/passwd
-rwsr-xr-x 1 root root 54256 May 17  2017 /usr/bin/passwd

從上面passwd的屬性能夠看到,權限位中有個s,這就是suid。

passwd這個命令是用來修改密碼的,而密碼文件是/etc/shadow,且查看密碼文件的屬性能夠看到它的擁有者是root,root可讀寫,用戶組可讀的。

/tmp $ ls -l /etc/shadow                                                            │
-rw-r----- 1 root shadow 1711 Mar 30 17:00 /etc/shadow

既然這個文件是root可讀寫,那非root用戶修改密碼要怎麼辦呢?

這時候就要說的suid了,當非root用戶調用passwd修改密碼時,此時的euid將會變爲passwd的擁有者用戶,即root用戶,這樣就能夠修改密碼了。

與其說suid是一個id,不如說它是文件的一個標誌,它標誌着這個可執行文件在執行時的euid將會被修改成它擁有者的uid。

下面編程實驗:

/* testsuid.c */
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>

int main(void)
{
    printf("uid: %d euid:%d", getuid(), geteuid());
}

編譯後執行

suid

上面的chmod u+s是給文件加上usid標誌,而從上面的結果能夠看出進程的uid和euid是能夠不一樣的。

相關文章
相關標籤/搜索