1. 程式人生 > >2018-1-13Linux基礎知識(21)特殊權限

2018-1-13Linux基礎知識(21)特殊權限

rgb soft 會有 之前 bottom b- text 問控制 用戶創建

在前一章當中我們講述了文件的查找命令,分別是locate和find命令,二者的區別很大,前者依賴於索引數據庫,查找速度很快,模糊性匹配,意思是只要該路徑中符合查找字段,其結果也會顯示,後者則是實時性的查找工具,且並不依賴於索引數據庫,只不過查找速度與前者相比略慢一些,而且查找精確。那麽在這一章當中,我們來講述Linux上的特殊權限。

一、特殊權限

我們首先查看一下passwd命令。

   # ls -l /bin/passwd
   -rwsr-xr-x. 1 root root 27832 Jun 10  2014 /bin/passwd

再看一下/tmp命令。

   # ll -d /tmp/
   drwxrwxrwt. 13 root root 4096 Jan 13 15:44 /tmp/

以上前幾個字段和我們之前所看到的權限位的字符有些不同,那麽以上我們所看到的就是特殊權限,我們之前看到的無論是屬主還是屬組以及其它人,都是由rwx組成的,那麽現在看到的是由特殊權限組成的。
特殊權限一共有三個:SUID、SGID和STICKY。我們之前講過安全上下文的概念,一個進程是否可以訪問該文件,取決於用戶的發起者是否有該權限來進行訪問的應用機制,而應用機制是首先去判斷該用戶的發起者是不是屬於該文件的屬主,如果是就應用屬主的權限;否則,就去檢查該用戶的發起者是不是屬於該文件的屬組,如果是則應用屬主的權限;否則,該用戶的發起者既不是屬主也不是屬組主,則就應用於其它人的權限。

   特殊權限:SUID, SGID, STICKY

   安全上下文:
     1、進程以某個用戶的身份運行;進程是發起此進程用戶的代理,因此以此用戶的身份和權限完成所有操作;
     2、權限匹配類型:
         (1) 判斷進程的屬主,是否被訪問的文件屬主;如果是,則應用屬主的權限;否則就進入第二步;
         (2) 判斷進程的屬主,是否屬於被訪問的文件屬組;如果是,則應用屬組的權限;否則進入第三步;
         (3) 應用other權限;

但是,發起該命令的用戶是否能夠發起該命令,這要取決於該命令的文件是否該有用戶的執行權限;
以上就是正常的匹配模型,那麽現在我們就介紹其特殊模型。

1.1 SUID

我們查看一個命令文件,例如為ls命令文件。

   # ls -l /bin/ls
   -rwxr-xr-x. 1 root root 117656 Nov  6  2016 /bin/ls

如果是以一個普通用戶的身份去運行該命令的話,可以看出,則執行的是其他人的權限,不過被某個用戶啟動之後,該進程的屬主就是當前用戶。由此進行總結為:

   默認的情況下:用戶發起的進程,進程的屬主是其發起者;因此,其以發起者的身份運行;

但是,如果擁有SUID權限的文件,這個用戶的運行者身份,並不是該發起者,而是變成了該文件的屬主;所以,我們來總結它的功能作用。

   SUID的功用:用戶運行某程序時,如果此用戶擁有SUID權限,那麽程序運行為進程時,進程的屬主不是發起者,而是文件自己的屬主;

需要註意的是,除了passwd等命令以外,所有命令如果都加上該特殊權限的話,都會有意想不到的後果,例如:cat或vim等,如果加上特殊權限,則敏感文件都可以進行查看及編輯。
那麽管理文件的SUID權限命令的格式如下:

   chmod u+|-s FILE...

那麽對此它的顯示方式以及其特性在這裏我們來總結一下:

   顯示位置:屬主的執行權限位;
       如果屬主原本有執行權限,顯示為小寫s;
       否則,顯示為大寫S;

1.2 SGID

SGID最常見的用法在修改目錄的屬組權限上,通常應用在目錄上,任何在此目錄下創建文件的用戶,在該目錄下,無論是目錄及文件,其屬組不會是該用戶的基本組,而是這個目錄的基本組。
操作試題:

   1、在/tmp目錄中創建目錄為test;
   2、新建用戶:centos、fedora、gentoo、archlinux;
   3、新建組為mygrp,講以上新建的用戶附加到這個組中;
   4、將tests的屬組改為mygrp;
   5、將該目錄加上SGID,使用創建的用戶創建a, b, c, d這四個文件,每個文件的後面都跟上自己的用戶名;

這樣做的結果是,但凡該用戶是該目錄的屬組,那麽是這個屬組a用戶創建的該文件,屬組b用戶也可以更改,需要註意的是,只能是同一個組內可以修改編輯,組以外或其它人無權修改。
好的,以上這就是SGID的介紹及功能特性,那麽我們來總結一下SGID的功能作用:

   SGID:
     功用:當目錄屬組有寫權限,且有SGID權限時,那麽所有屬於此目錄的屬組,且以屬組身份再次目錄中新建文件或目錄時,新文件的屬組不是用戶的基本組,而是此目錄的屬組;

那麽管理文件的SGID權限命令格式如下:

   chmod g+|-s FILE...

那麽對此它的顯示方式以及特性總結如下:

   顯示位置:屬組的執行權限位;
       如果屬組原本有執行權限,顯示為小寫t;
       否則,則為大寫T;

1.3、STICKY

以上的擁有SGID的用戶,或者說附加該組的既可以該自己的文件,又可以該其他人的文件,但即使能更改,同時也可以刪除,因為該目錄屬組的有寫權限的話,該目錄下面的所有文件都可以刪除,不管是否為該用戶創立,只要擁有屬組的權限,則可以進行修改並刪除,為了避免這樣的操作,就有了Sticky的權限。
只要某個目錄擁有了該Sticky權限,在組內的任何人創建的文件,除了自己可以刪除,其他人則刪除不了。那麽我們總結一下SGID的功能其作用。

   Sticky:
     功用:對於屬組或全局可寫的目錄,組內的所有用戶或系統上的所有用戶對在此目錄中都能創建新文件或刪除已有的文件;如果為此類目錄設置為Sticky權限,則每個用戶都能創建新文件,且只能刪除自己的新文件;

管理文件的Sticky權限命令格式如下:

   chmod o+|-t FILE...

對此,它的顯示方式以及功能特性總結如下:

   顯示位置:屬組的執行權限位;
       如果屬組原本有執行權限,顯示為小寫t;
       否則,顯示為大寫T;

需要註意的是,系統上的/tmp和/var/tmp目錄默認均有sticky權限。
操作試題:

   1、在以上的SGID的題目中,往test目錄中設置Sticky,看看有什麽結果發生。

二、管理特殊權限的另一種方式

所謂的另一種特殊權限的方式為以數字來進行表示,和之前權限復制要差不多,suid、sgid和sticky,有剛好組成三位一組,示例如下:

   suid sgid Sticky  八進制權限
    0   0   0         0
    0   0   1         1
    0   1   0         2
    0   1   1         3
    1   0   0         4
    1   0   1         5
    1   1   0         6
    1   1   1         7

那麽我們可以用以上的八進制的權限位來進行表示,比如:

   # chmod 1777

這表示那個1為特殊權限,777屬於正常權限,相當於賦予Sticky權限,因為該權限顯示在執行權限位。
所以,基於八進制方式賦權時,可於默認的三位八進制數字左側再加一位八進制數字即可。

三、facl

facl的名稱為訪問權限控制列表,每一個用戶都沒辦法修改該文件的屬主屬組,作為一個普通用戶,想讓某一個用戶對該文件擁有寫權限時,正常來說只能修改other權限,但是這是非常危險的操作,因為該用戶可讀寫,說明其他的用戶也可以讀寫,那麽facl的作用在於是一個額外新增的權限機制,在原有的權限之內,可以額外賦權機制。

   文件的額外賦權機制:
       在原有的u, g, o之外,另一層讓普通用戶能控制給另外的用戶或組的賦權機制;

getfacl命令是查看該文件中是否有額外權限,命令格式如下:

   getfacl命令:
       getfacl FILE...
          user:USERNAME:MODE
          group:GROUPNAME:MODE

setfacl命令為賦予額外權限給用戶或組,如何進行賦權及撤銷的使用方法及命令格式如下:

   setfacl命令:
       賦權給用戶:
          setfacl -m u:USERNAME:MODE FILE...
       賦權給組:
          setfacl -m g:GROUPNAME:MODE FILE...
    
       撤銷賦權:
          setfacl -x u:USERNAME FILE...
          setfacl -x g:GROUPNAME FILE...

不過,一旦有了該訪問控制列表之後,那麽其權限模型就會改變,那麽對於新的安全上下文我們來總結一下:

   總結新的安全上下文:
     用戶發的命令進程去訪問該文件時,首先檢查該進程是否為文件的屬主,如果是,則應用屬主權限,否則就檢查額外專門給這個用戶的訪問控制列表,如果有該權限,則應用特殊的訪問控制列表權限;
    
     如果不是,則檢查該進程的屬主是否為該文件的屬組,如果是,則應用屬組權限;不是,則檢查該用戶組是否為訪問控制列表的權限,如果有該權限則應用訪問控制列表中的權限。
    
     不是則為other。


2018-1-13Linux基礎知識(21)特殊權限