SUID_SGID_Sticky簡單總結

參考:
 http://blog.chinaunix.net/uid-25314474-id-3313109.html
 
—————————————權限—————————————————-
r——4  \
w—–2    > umask —-root的系統umask:022 , 普通用戶:umask:002 
x—– 1  /           
                   修改系統默認的umask: /etc/login.defs

                                        421   421   421
 系統默認目錄到權限為:rwx   rwx   rwx      ———————————————————目錄
 系統默認文件到權限為:rw-    rw-   rw-      —————————————-文件

                      root          :—     -w-   -w-   ===Umask遮蓋后的權限===:rwx  r–  r–      rwx  r-x  r-x
             普通用戶            :—     —    -w-   ===Umsak遮蓋后的權限===  : rw-  rw- r–      rwx  rwx r-x
   
suid———-4
sgid———-2
sticky——–1
————————————————————————————————

高級權限—-SUID,SGID 和 Sticky

 SUID,SGID和Sticky僅適合文件和目錄:
   因為SUID和SGID是在執行程序(程序的可執行位被設置)時起作用,而可執行位只對普通文件和目錄文件有意義,
 所以設置其他種類文件的SUID和SGID位是沒有多大意義了。
 
   為何需要SUID和SGID權限?
         最典型的一個問題就是普通用戶該密碼,因為改密碼需要修改shadow文件,而shadow文件只有root可修改,
 因此AT&T就開發了SUID/SGID來解決此問題;通過給passwd加SUID權限,就實現了普通用戶也可以修改自己的密碼了。

  SUID和SGID是如何解決這個問題呢?
    首先,我們要知道一點:進程在運行的時候,有一些屬性,其中包括 實際用戶ID,實際組ID,有效用戶ID,有效組ID等。
 實際用戶ID和實際組ID標識我們是誰,誰在運行這個程序,一般這兩個字段在登陸時決定,在一個登陸會話期間,
 這些值基本上不改變。而有效用戶ID和有效組ID則決定了進程在運行時訪問系統資源的權限。
 內核在決定進程是否有文件存取權限時,是采用了進程的有效用戶ID來進行判斷的。

 1.suid
 作用:任何用戶在執行擁有suid權限的命令時,都以該命令擁有者的身份執行
   僅適合作用與文件,目錄也可添加SUID,但不起任何作用。
   shell腳本不適合加SUID權限。最好是二進制可執行文件,如:passwd
   注:若二進制文件沒有執行權限,添加了SUID,也不能使其他人執行時獲得擁有者的權限。
   chmod u+s  命令
    驗證方法:

     useradd  test1
     mkdir  /tmp/abc;  chmod 4777  /tmp/abc
     echo -e '#!/bin/bash\ntouch  /abc.txt' > /tmp/abc/a.sh;  chmod 4755 /tmp/abc/a.sh
     su  -  test1      //加“-” 是因為需要在切換到test1時,使用test1的全局環境設置。
     cd /tmp/abc
     mkdir test1       //查看權限并沒有繼承任何特殊權限。
     /tmp/abc/a.sh     //執行shell腳本,報權限不足。

     
 2.sgid
  作用:任何用戶在擁有sgid權限的目錄中,創建文件或目錄都要強制繼承該目錄的所屬組。
    注: 對于可執行文件:SGID可讓執行該文件的用戶臨時擁有該文件組的權限。
                                  但是,若所屬組沒有執行權限,other有執行權限,則即便加了SGID的權限,
                                  也無法讓其他用戶臨時擁有該文件組的權限。
      對于目錄:SGID可讓目錄下的所有子目錄和文件的所屬組都強制改為該目錄的所屬組。
                   即便, SGID位為 大S (即:目錄組沒有執行權限),它依然后繼續影響其下的
                  子目錄和文件的所屬組。
      驗證方法:
      目錄:

       useradd  test1
       mkdir /tmp/abc;  chmod  2777  /tmp/abc
       su  -  test1
       cd  /tmp/abc;  touch  test1.txt
       mkdir  test1   //查看權限,繼承了父目錄去的SGID權限。
       su  -  root
       chmod  g-x  /tmp/abc
       su - test1
       cd  /tmp/abc;  touch  test2.txt
       mkdir test2   //查看權限,依然繼承了父目錄的SGID權限。

      二進制可執行文件:

       su  -  test1
       cd  /tmp;  cp  /bin/cat  .  ; chmod  g+s  ./cat
       echo  "This  is  a  test"  > test1.txt
       su - test2
       cd /tmp
       /bin/cat    test1.txt      //報權限不足
       /tmp/cat   test1.txt       //成功查看test1.txt
       su  -  test1
       chmod  g-x  /tmp/cat
       su  - test2
       /tmp/cat   test1.txt        //報權限不足。

  
 普通文件的SUID和SGID的作用:
       對于上例中,cat命令是任何普通用戶都可以執行的命令,它默認是沒有SUID位的,那UNIX的內核是根據什么來
 確定一個進程對資源的訪問權限的呢?對,是這個進程的運行用戶的(有效)ID,包括 UID 和 GID。
 用戶可以用id命令來查到自己的或其他用戶的user id和group id。 
 
 一個進程如果沒有SUID或SGID位,則euid=uid egid=gid,分別是運行這個程序的用戶的uid和gid。
  例:【如上測試的例子】
  

 -rwxr-xr-x 1 root root 25216 Jul 13  2009 /bin/cat
   test1: UID=500 GID=600
   test2: UID=501 GID=601

    test2 運行/bin/cat /tmp/test1.txt 時, euid=uid=501, egid=uid=601;
   內核根據這些值來判斷進程對資源訪問的限制,雖然/bin/cat的屬主和屬組是root,
   但實際運行/bin/cat的用戶是test2,與root用戶沒有一點關系.因此test2查看test1
   的私有文件test1.txt時就失敗了。
    
 若一個若程序設置了SUID或SGID,則euid和egid將變成被運行程序的所有者的uid和gid
  例:
  

 -rwxr-sr-x 1 test1 test1 25216 Jul 13  2009 /tmp/cat

   test2 運行 /tmp/cat /tmp/test1.txt 時, euid=500, egid=600, 而 uid=501, gid=601
   因此,test2 就成功的讀出了test1的私有文件test1.txt的文件內容。

 3.sticky (t) 粘貼位 冒險位
  作用:任何用戶在擁有t權限的目錄下創建的文件,只能自己,目錄所有者和root能刪除外,其他人無權刪除
  僅適合作用于目錄,文件也可添加但不會有任何作用。
  chmod o+t dir/  
     驗證方法:

      useradd  test1
      useradd  test2
      useradd  abc
      mkdir  /test ;  chmod 777  /test
      su - abc
      cd  /test ;  mkdir  abcdir
      chmod  7777  abcdir   //給目錄abcdir添加SUID,SGID,sticky權限。
      su - test1
      cd  /test/abcdir;  touch  test1.txt;  mkdir test1;  chmod 777  test*
      su - test2
      cd  /test/abcdir; rm -rf  test*    //將失敗。
      su  -  abc
      cd  /test/abcdir;  rm  -rf  test*    //成功。

 

基礎命令

 $ chmod [-cvRf] 模式[,模式]... 文件...
   # 更改文件的權限
     # -c         同-v,但只在有更改時才顯示結果
     # -f         去除大部份的錯誤信息
     # -R         遞歸操作
     # -v         為處理的所有文件顯示診斷信息
     # --reference=參考文件     使用指定參考文件的模式,而非自行指定權限模式
     # --no-preserve-root      不特殊對待根目錄(默認)
     # --preserve-root         禁止對根目錄進行遞歸操作
     每種 MODE 都應屬于這類形式"[ugoa]*([-+=]([rwxXst]*|[ugo]))+"。
 $ chown [-cvRfh] --reference=RFILE|[OWNER][:[GROUP]] file...
  # 改變文件所有者和所屬組
    # -c             同-v,但只在有更改時才顯示結果
    # -v             為處理的所有文件顯示診斷信息
    # -f             去除大部份的錯誤信息
    # -R             遞歸操作
    # -h             改變符號鏈接本身而不是其所指向文件的屬性。
    # --dereference         改變符號鏈接所指向的文件,而不是符號鏈接本身。
    # --from=CURRENT_OWNER:CURRENT_GROUP
                           只有當文件屬性和該模式匹配,才修改文件屬性。
    # --no-preserve-root   不特殊對待根目錄(默認)
    # --preserve-root      禁止對根目錄進行遞歸操作
    # --reference=參考文件  使用參考文件的屬性,而不用指定參數來設置。
$ chgrp [選項]... 用戶組 文件...
# --reference           則將每個文件的所屬組設置為與指定參考文件相同。    
# --dereference         影響符號鏈接所指示的對象,而非符號鏈接本身(默認值)    
# -h                    會影響符號鏈接本身,而非符號鏈接所指示的目的地    
# --no-preserve-root    不特殊對待"/"(默認值)    
# --preserve-root       不允許在"/"上遞歸操作    
# --reference=RFILE     使用參考文件的所屬組,而非指定值    
# -f         去除大部份錯誤信息    
# -R         遞歸處理所有的文件及子目錄    
# -v         為處理的所有文件顯示診斷信息    
# -c         類似 -v,但只在有更改時才顯示結果
 以下選項是在指定了 -R 選項時被用于設置如何穿越目錄結構體系。 如果您指定了多于一個選項,那么只有最后一個會生效。
   -H         如果命令行參數是一個通到目錄的符號鏈接,則遍歷符號鏈接 
   -L         遍歷每一個遇到的通到目錄的符號鏈接
   -P         不遍歷任何符號鏈接(默認)

文件訪問的其他權限
    隱藏權限

 chattr  和  lsattr
  chattr [-|+|=] Following Options
     a:只能增加數據,不能刪除數據,不能移動文件;
     i:不能被刪除/改名/設置鏈接/不可新增和寫入。
     u:刪除時不實際刪除;
     s:刪除文件時,徹底刪除。
     d:當執行dump(備份)程序時,設置d屬性可使該文件(或目錄)具有轉儲功能。
     A:禁止修改AccessTime屬性; 
     S:寫入時直接sync到磁盤;

  ACL
  facl(文件訪問控制列表)

 使用ACL的前提:    
 1. mount   ----->  先查看分區是否支持ACL, 默認 根分區 是支持 ACL的。
     例:mount -o remount,acl  /dev/sda2  //若不支持ACL,則可重新掛載/dev/sda2的分區,并讓其支持ACL    
 2. getfacl 和 setfacl          
 格式:setfacl  [-mxbd]  { [u  |  g  | m]:[user | group  | umask ] :[rwx] }      
 查看:
    getfacl aa.txt   //查詢文件訪問控制列表內容      
 設置:
    setfacl -m u:robin:rw aa.txt     //設置用戶訪問控制 u:針對用戶設置:[ u :用戶列表:rwx]
    setfacl -m g:looking:rw aa.txt  //設置組的訪問控制 g: 針對群組設置:[ g :群組名: rwx]
    setfacl -m o:rwx aa.txt       //設置其他人 
    setfacl -m m:r aa.txt      //設置掩碼值,任何人權限不可超過掩碼值 m :                 針對默認權限設置:[  m :rwx]
      刪除:
          setfacl -x u:robin aa.txt
          setfacl -x g:looking aa.txt 
      移除所有訪問控制設置 
          setfacl -b aa.txt 
      設置遞歸繼承robin用戶權限,這個用戶所建立目錄和文件會繼承robin設置的默認權限 
          setfacl -m d:u:robin:rwx test/
          setfacl -m d:g:looking:rwx test/ 
          setfacl -m d:o:rwx test/

               

  

 

 

原創文章,作者:Wn1m,如若轉載,請注明出處:http://www.www58058.com/8110

(0)
Wn1mWn1m
上一篇 2015-09-14
下一篇 2015-09-14

相關推薦

  • 選擇判斷專題腳本編程_第九周練習

    Q1:寫一個腳本,判斷當前系統上所有用戶的shell是否為可登錄shell(即用戶的shell不是/sbin/nologin);分別這兩類用戶的個數;通過字符串比較來實現; #!/bin/bash # declare -i y=0 declare -i n=0 for i in $(cut…

    Linux干貨 2016-12-25
  • LVS負載均衡集群詳解

    一、LVS概述  1.LVS:Linux Virtual Server          四層交換(路由):根據請求報文的目標IP和目標PORT將其轉發至后端主機集群中的某臺服務器(根據調度算法);      …

    系統運維 2016-04-30
  • shell基礎if與case

    1.read   使用read來把輸入值分配給一個或多個shell變量;   -p 指定要顯示的提示;例如 read -p "SHURU" num   -t TIMEOUT   read 從標準輸入中讀取值,給每個單詞分配一個變量,所有剩余單詞都被分配給最后一個變量 2.流程控制   過程…

    Linux干貨 2016-08-18
  • vim基本總結

    ASCII可以將計算機存儲的0或1轉成我們認識的文字。在Linux中,絕大部分的配置文件都是以ASCII的純文本形態存在。通過文本編輯器,可以實現對這些文本文件的更改。常風的文本編輯器有emacs, pico,nano,joe與vi(vim是vi的升級版)等。那么為會么要學vi呢? l 因為vi是內置編輯器,系統安裝好就有了 l 很多軟件…

    2017-08-05
  • ifconfig命令學習

    ifconfig命令 網絡配置 ifconfig命令被用于配置和顯示Linux內核中網絡接口的網絡參數。用ifconfig命令配置的網卡信息,在網卡重啟后機器重啟后,配置就不存在。要想將上述的配置信息永遠的存的電腦里,那就要修改網卡的配置文件了。 語法 ifconfig(參數) 參數 add<地址>:設置網絡設備IPv6的ip地址; del&lt…

    Linux干貨 2017-07-02
  • shell編程中的三種流程控制

    流程控制 v 一 、過程式編程語言: 1.順序執行 2.選擇執行 3.循環執行  條件選擇if 語句   選擇執行:   注意: :if 語句可 嵌套    單分支 if 判斷條件;then 條件為真的分支代碼 fi    雙分支 if 判斷條件; then …

    Linux干貨 2016-08-21

評論列表(1條)

  • stanley
    stanley 2015-09-14 09:37

    文章伊始以為是亂碼呢

欧美性久久久久