Linux用戶與組之權限管理

Linux用戶與之權限組管理


  • 權限(rwx、sst、umask)

  • chown

  • chmod

  • ACL(見下篇)


試驗環境:CentOS 7.2 與CentOS 6.8,具體會在應用場景明確指出

權限

Linux系統對用戶與組的管理,其具體操作手段就是對於權限的分配,而常見的權限分配工具有 rwx, sst, umask, ACL. 跟用戶與組有uid和gid一樣,權限也有自己的數字標識,用八進制數表示。 我們先逐一作個簡單認知,其具體的應用就在後面的實驗中慢慢說明了!

rwx

當我們在ls -l 時,會看見如下字段:九個位,每三位一組,每個組有對應的對象

wKiom1ekeRTxPNMQAAAt956Vjjk381.png

這就是我們通常所說的一般權限標識:

rwx:
    r: Readable     可讀         100   4          
    w: Writable     可寫         010   2
    x: eXcutable    可執行       001   1
    -:             無權限位
    X:              只針對目錄給予x權限
    
sst:
    s: SUID,Set User ID     100   4     只對二進制可執行程序有效
    s: SGID,Set Group ID     010   2     針對可執行文件與創建協作目錄
    t: Sticky   001   1     粘滯位,只針對目錄
    
umask:  
    root用戶:022
    其它用戶:002
    ACL: Access Control List    訪問控制列表

rwx

我們分配權限,一定是分配給某一對象而言的,而且分配權限,往往也是針對“別人”來說的,如果我對一個文件有所有權,那麼我就可以把自己的權力分配給相關用戶,規定誰可以訪問,誰可以修改,誰可以用它去執行相關任務;那麼“我”,就是該文件的屬主;如果這個文件或目錄有特定的幾個人需要共同管理,或這幾個人需要協作完成一件事,都要用到某文件或目錄,那麼我們把這幾個用戶組建個小團隊,這個小團隊就是該文件或目錄的屬組;除屬主與屬組之外的其它人,我們則管它叫其它用戶

屬主:u, owner
屬組:g, group其它用戶:o, other

另外,rwx對於文件與目錄而言,其具體含義是有區別的:

文件:    r: 可使用文件查看類工具獲取其內容 
         w: 可修改其內容 
         x: 可以把此文件提請給內核從而發起一個進程
    
目錄:    r: 可以使用ls查看此目錄中的文件列表    
         w: 可在此目錄中創建文件,也可刪除此目錄中的文件    
         x: 可cd進此目錄,可使用ls -l查看文件列表 
         X:給給目錄x權限,不給文件x權限

sst

接下來我們瞭解下SUID與SGID,SUID與SGID是的標識都是s,在異常的情況下會顯示爲S,且分別位於文件屬主和屬組的執行位上,即 原先在執行位上的x被修改爲s, 其所起的主要作用是一種“借勢”;

所謂借勢,對於SUID來說,就是本來A用戶要執行一個文件,卻發現自己沒有權限,心有不甘,“借” 來一個s 替代了自己屬主位上的可執行位x,使自己擁有了該文件屬主的權限,進而能夠正常執行此文件,SUID只對可執行的二進制程序有效!

有了SUID,解決了對於特殊情況下特殊用戶的特殊需求,說白了,SUID就是一個“法外之地”,只要管理員分配給你這個權限,你就可以去執行自己本不能執行的文件,而當此文件的屬主是root的時候,那麼執行者也就有了超級用戶的特權,此處的想象力無限!

SUID帶來使得的同時,不免會有安全隱患,這也符號“任何事物具有兩面性”的哲學思考,所以,SGID也就應用而生了,當SGID應用於可執行文件時,其雖無法獲取該文件屬主的權限,但它卻退而求其次,順利地”借“到了該可執行文件屬組的權限,從而用一個s替代了自己屬組位上的可執行位x,從而獲得該文件屬組的特權,任意存取整個組所能使用的系統資源。

而當SGID應用於目錄上時,則在此目錄下創建的文件,其屬組都將被設置爲與此目錄的屬組一致;而當把一個文件複製到該目錄下時,除非在複製時加上-p 或 -a選項,才能保留原來的屬組,注意,文件的屬主不變,還是建立這個文件的用戶。

延伸:安全上下文

前提:進程有屬主與屬組;文件有屬主與屬主

(1)任何一個可執行程序文件能否啓動爲進程:取決於發起者對程序文件是否有執行權限;
(2)啓動爲進程之後,其進程的屬主爲發起者的屬主;進程的屬組爲發起者的屬組;
(3)進程訪問文件時的權限,取決於進程的發起者    
     a.如果進程的發起者,同文件的屬主,則應用文件屬主權限    
     b.如果進程的發起者,屬於文件的屬組,則應用文件的改組權限
     c.應用文件其它權限

任何一個可執行程序文件能不能啓動爲進程:取決發起者對程序文件是否擁有執行權限

可執行文件上SUID權限
    啓動爲進程之後,其進程的屬主爲原程序文件的屬主
    SUID只對二進制可執行程序有效
    SUID設置在目錄上無意義
    權限設定:
        chmod u+s FILE...
        chmod u-s FILE...
        
可執行文件上SGID權限
    啓動爲進程之後,其進程的屬組爲原程序文件的屬組
    權限設定:
        chmod g+s FILE...
        chmod g-s FILE...
        
目錄上的SGID權限
    默認情況下,用戶創建文件時,其屬組爲此用戶所屬的主組
    一旦某目錄被設定了SGID,則對此目錄有寫權限的用戶在此目錄中創建的
    文件所屬的組爲此目錄的屬組
    通常用於創建一個協作目錄
    權限設定:
        chmod g+s DIR...
        chmod g-s DIR...

接着來認識Sticky位,首先,Sticky是對目錄中文件的一種保護,但只能應用於目錄,而具有寫權限的目錄,用戶通常可以刪除該目錄下的任何文件,而給目錄設置了Sticky位之後,只有文件的屬主或root可以刪除該文件,所以說Sticky位的意義就是避免用戶誤操作或防止惡意用戶的一些行爲,要知道,Linux可是一個多任務多用戶的操作系統。 但要注意的是,sticky設置在文件上是無意義的,只能針對於目錄。

權限設定:
    chmod o+t DIR...
    chmod o-t DIR...

吐血了,我們還有一個umask.

umask

umask, 俗稱遮罩碼,該命令用設置了用戶創建文件時的默認權限。所謂遮罩碼,其實就是一種掩碼,對於IP地址來講,如果IP地址不配合子網掩碼一起使用,那麼這個IP就是無意義的,子網掩碼了靈活使用,打破了傳統IP地址的類別,已無所謂什麼A類、B類還是C類;對於umask而言,當用戶每次進行系統時,umask都會被執行,並自動設置掩碼改變默認值。

Linux系統是一個多任務多用戶的操作系統,系統管理員必須要爲每個用戶設置一個合理的umask值,以確保該用戶在創建文件時能夠有相應的權限控制,同時也可防止非同組用戶對該用戶的文件具有寫權限;另外,直接設置的umask只對當前shell進程有效,一般地,umask是在/etc/profile文件中設置的,每個用戶在登錄時都會引用此文件,當然,也可以只在自己的家目錄$HOME下.profile或.bash_profile或.bashrc中進行設置。

umask是一個四位八進制數,第一位代表suid被“掩”的權限,第二位代表文件或目錄的屬主被“掩”的權限,第三位代表文件或目錄的屬組被“掩”的權限,第四位代表其它用戶被“掩”的權限。由於suid一般情況下不常用,所以umask通常就說後三位。

常用參數

  1. -S: 以符號方式輸出權限掩碼

  2. -p: 輸出的權限掩碼可直接作爲指令來執行

使用示例

環境:CentOS 6.8

[root@centos6 ~]# umask 0022              # root默認的umask爲022
[root@centos6 ~]# umask -S
u=rwx,g=rx,o=rx
[root@centos6 ~]# touch laohu
[root@centos6 ~]# ll laohu
-rw-r--r--. 1 root root 0 Aug  4 09:15 laohu # root創建文件的默認權限爲644
[root@centos6 ~]# ll -d dir1
drwxr-xr-x. 2 root root 4096 Aug  4 10:02 dir1 # root創建目錄的默認權限爲755
[root@centos6 ~]#
[root@centos6 ~]# su - liansir
[liansir@centos6 ~]$ umask
0002                              # 普通用戶的默認的umask爲002   
[liansir@centos6 ~]$ umask -S
u=rwx,g=rwx,o=rx
[liansir@centos6 ~]$ touch shizi
[liansir@centos6 ~]$ ll shizi
-rw-rw-r--. 1 liansir liansir 0 Aug  4 09:15 shizi    # 普通用戶創建文件的默認權限爲664
[liansir@centos6 ~]$ ll -d dir2
drwxrwxr-x. 2 liansir liansir 4096 Aug  4 10:06 dir2   # 普通用戶創建目錄的默認權限爲775
[liansir@centos6 ~]$

通過比較,可得出:

umask, 就是通過屏蔽相應的權限位,從而得出默認的權限umask與rwx之間有如下關係:
       dir: 777-umask
       file: 666-umask, 結果有奇數則加1,偶數保留

注:對於目錄,x權限代表可以進入該目錄,故對於這個權限初始賦值是沒有什麼問題的;對於文件,x權限代表執行,風險太高,故一般權限賦值一般去掉x權限。(這就是666-mask其結果爲奇數要加1的解釋,逆向思維應用下)


chown

主要用途

修改文件的屬主和屬組

chown - change file owner and group
chown [OPTION]... [OWNER][:[GROUP]] FILE...
chown [OPTION]... --reference=RFILE FILE...

chown命令用來改變某個文件或目錄的屬主和屬組,這是一個比較大的權限修改問題,所以只有文件原有的屬主與超級用戶root纔可以使用該命令。

常用參數

  1. -c: --changes, 僅回顯被更改的部分

  2. -h: --no-dereference, 只對符號鏈接的文件做修改,而不更改其他任何文件

  3. -R: --recursive, 遞歸處理,將指定目錄下的所有文件及其子目錄一併處理

  4. -v: --verbose, 回顯指令執行過程

  5. --dereference: 引用其它文件的權限屬性

使用示例

[root@centos6 ~]# chown -c liansir laohu
changed ownership of `laohu' to liansir             # 回顯出了被更改的信息
[root@centos6 ~]# 
[root@centos6 ~]# ls -l /usr/tmp
lrwxrwxrwx. 1 root root 10 Jul 20 16:56 /usr/tmp -> ../var/tmp
[root@centos6 ~]# chown -h liansir /usr/tmp
[root@centos6 ~]# ls -l /usr/tmp           
lrwxrwxrwx. 1 liansir root 10 Jul 20 16:56 /usr/tmp -> ../var/tmp
[root@centos6 ~]# ls -l ../var/tmp
total 4-rw-r--r--. 1 root root 899 Aug  3 15:19 fstab  # 被鏈接的文件屬主不變
[root@centos6 ~]#  
[root@centos6 ~]# chown wang /usr/tmp
[root@centos6 ~]# ls -l ../var/tmp   
total 4-rw-r--r--. 1 root root 899 Aug  3 15:19 fstab  # 默認被鏈接的文件的屬主不變
[root@centos6 ~]#
[root@centos6 liansir]# chown wang dir2    # dir2下面的文件及子目錄屬主不變

wKiom1ekeuminevRAAA3sItibnI370.png

[root@centos6 liansir]# chown -R wang dir2  # dir2下的文件及子目錄結構遞歸改變了

wKioL1ekezHzNHFHAAA4jSk5BLU772.png

[root@centos6 home]# chown wangcai --dereference=wang  # 給目錄wangcai引用目錄wang屬主屬組

wKioL1ekg3_gnZH_AAC5J1tNzFw440.png

關於chown的幾種寫法:

wKioL1ekfEzAfjCBAAChEMXAfYM747.png



chmod

主要用途

修改文件或目錄的權限

chmod - change file mode bits
chmod [OPTION]... MODE[,MODE]... FILE...
chmod [OPTION]... OCTAL-MODE FILE...
chmod [OPTION]... --reference=RFILE FILE...

chmod命令用來修改文件或目錄的固有權限,設置方式可採用字符或數字標識,注意,符號鏈接文件的權限無法修改,如果要對符號鏈接文件修改權限,則要改變被鏈接的原始文件。

方式:mode

修改一類用戶的所有權限:    u= g= o= ug= a= u=,g=
修改一類用戶某位或某些位權限    u+ u-g+ g-o+ o-a+ a-
    
chmod[OPTION]... --reference=RFILE FILE...
參考RFILE文件的權限,將FILE的修改爲同RFILE;

常用參數

  1. -c: --changes, 僅回顯被更改的部分

  2. -R: --recursive, 遞歸處理,將指定目錄下的所有文件及其子目錄一併處理

  3. -v: --verbose, 回顯指令執行過程

  4. --dereference: 引用其它文件的權限屬性,即把指定文件或目錄的權限屬性變成參考文件的權限屬性

使用示例

[root@centos6 ~]# chmod g+w laohu

wKioL1ekhBHAW0NCAAA7NIzWzE8665.png

[root@centos6 liansir]# chmod -R g+rwX dir2

wKiom1ekhCSDaQeSAABrnL2nNlc890.png

所以,rwx對於文件的意義

r: 文本
w: 可修改內容,但不能刪除文件本身
x: 針對二進制的程序或腳本
X: 不會增加x(前提本身無x權限)

如果其它用戶對目錄缺少寫權限,則無法創建與刪除目錄下的文件

wKioL1ekhPHj6yIKAABq_Phdh8k949.png

如果其它用戶對目錄只有x權限,則

wKioL1ekhQHChy50AADHR9BdBJI982.png

如果其它用戶對目錄只有w權限,則

wKioL1ekhRPDqMYdAABHXGb-6og369.png

所以,rwx對於目錄的意義:

r:可以查看目錄內的文件列表,但不能訪問文件,不能cd進去,不能查看文件的元數據
w:可以創建或刪除目錄中的文件,要配合x權限
x:可以進入目錄,可以訪問目錄中的文件,但不能查看目錄內的文件列表
X:針對目錄加x權限,而對文件不加x權限

利用數字標識修改權限:

[root@centos6 dir1]# chmod 640 f1
[root@centos6 dir1]# chmod 111 f2

wKioL1ekhTeyL7_sAABcv4WXQag882.png

引用其它文件的權限屬性:

[root@centos6 testdir]# chmod --reference /etc/shadow dir1

wKiom1ekhUiBY9BCAAA-USPT2Ys813.png


接下來,我們來幾個關於特殊權限sst的試驗:環境---CentOS 7.2

對於二進制可執行程序,必須要有x權限才能運行:

wKioL1ekhZHzw92iAABbblkIsAU701.png

由id liansir可看出,liansir既不是/etc/cat的屬主,也不屬於root組,所以就只能以other的角色運行cat,又因爲chmod o=r 去掉了other原來的x權限,所以在cat /etc/issue時cat程序運行出錯。

當一個程序運行起來之後,就是一個進程,而一個進程能否啓動取決於發起者對程序文件是否擁有可執行權限。 而liansir 既非文件的屬主,亦不是文件屬組的成員,就只能以other的角色來運行程序,可other只有r權限無x權限,最終導致程序運行出錯!

此時我們再恢復other的x權限:

wKioL1ekhbLDJrKqAAAkw3k1lP8286.png

[root@centos6 ~]# ps aux

wKiom1ekhmbRghJAAAAw99lvg40298.png

可見cat這個進程又成功執行了!

但是,例外發生了:

wKiom1ekhobi-c5QAACREk-qNgQ042.png


其他用戶liansir竟然可以執行passwd成功修改密碼,這意味着在/etc/shadow裏面寫入了東西,而/etc/shadow這個機密文件除了超級用戶其他人都是看不了的,更何況寫入密碼!

我們通過which 命令得到passwd的絕對路徑,然後查看其權限發現其屬主的權限爲rws, 這個s就是所謂的suid. 而s權限的好處是程序的發起者可以繼承程序屬主的權限,此處,是liansir繼承了root的權限,從而成功修改的密碼。

我們再來反證一下:去掉s權限,再讓liansir修改密碼看能否成功!

[root@localhost ~]# chmod u-s /usr/bin/passwd

wKiom1ekhqvw6pTGAACRoC2o0C8310.png

再用數字標識恢復該文件的s權限:

[root@localhost ~]# chmod 4755 /usr/bin/passwd

wKiom1ekhsLA-ucRAABPZV4ugsQ971.png

suid真是一把利斧,想想,如果給文本編輯器nano或者vi給予s權限。。。引得想像力無限,如果一旦這樣,就只能把其屬主修改爲一個擁有普通權限的普通用戶了!


sgid與suid是一樣的思路,只不過是把可執行程序繼承其屬主的規則移花接木到繼承其屬組的規則,不同的是,sgid還應用於目錄,通常用來創建協作目錄。

wKiom1ekhzOyyP_SAAB2YyARX5w579.png

從上圖可看到,雖然給/bin/cat 添加了sgid權限,liansir用戶應該是繼承了root組的權限,但也沒能打開/etc/shadow文件,這是因爲/etc/shadow本身的特殊權限問題,root組也無權限訪問。你可能會問,如果設置成suid,/etc/shadow也沒有給root帳號任何權限啊,那爲什麼liansir用戶就可以訪問呢?因爲它繼承的是root帳號的權限,而非root組(普通組或管理組)的權限。任何權限對於超級用戶root而言是沒有任何意義的,誰讓root是老子天下第一了!!!

同樣,我們得反證一下,既然/etc/shadow沒有給屬組r的權限,導致liansir空歡喜一塊,那就給其屬組r的權限,再看:

wKiom1ekh2Lh--z9AABxdzopz-c039.png

成功讀取!

用數字標識修改sgid權限:

[root@localhost ~]# chmod 2755 /bin/cat

創建一個協作目錄:所謂協作目錄就是同一組的用戶可以相互修改對方的文件,但不在此組的人無訪問權限。

1.首先得創建一個項目組
2.把相關用戶加入項目組
3.找個目錄將其屬組改爲項目組,且將項目組的權限修改爲o=---,且加sgid
[root@localhost ~]# groupadd it             # 創建it項目組
[root@localhost ~]# gpasswd -a wangcai it
Adding user wangcai to group it
[root@localhost ~]# gpasswd -a liansir it   # 在項目組中添加用戶
Adding user liansir to group it
[root@localhost ~]#
[root@localhost ~]# id wangcai
uid=1003(wangcai) gid=1005(wangcai) groups=1005(wangcai),1006(it)
[root@localhost ~]# id liansir
uid=1001(liansir) gid=1001(liansir) groups=1001(liansir),1006(it)
[root@localhost ~]# 
[root@localhost ~]# chgrp it /testdir/    # 給項目組找個項目目錄
[root@localhost ~]# chmod o= /testdir/   # 將項目目錄的權限設置爲別人無法訪問
[root@localhost home]# chmod g+s /testdir/  # 給項目目錄添加sgid
[root@localhost home]# ll -d /testdir/drwxrws---. 2 root it 93 Aug  4 10:13 /testdir/
[root@localhost home]#

接着Sticky, 它是一個粘滯們或粘貼位,它要粘貼誰呢,sticky位“粘貼”的是root和其屬主

wKioL1ekiWmDppd_AAB8wwaJMj8837.png

上圖中,用戶wangcai對於liansir來說是其它用戶,擁有r權限,但wangcai卻所liansir的文件f1給刪除了,豈有此理,有人可以隨時把你的東西給扔了(linux是一個多任務多用戶的操作系統),這是爲何,wangcai只是liansir的其它用戶,且只有r權限,沒有w權限,怎麼就把liansir的f1文件就給刪除了呢???這是因爲其父目錄有w寫權限!!!爲了防止某一用戶隨意刪除其他用戶的文件,Sticky權限應用而生!

經目錄添加sticky權限:

[root@localhost /]# chmod o+t /testdir/

wKioL1ekiYLju7sXAAAt0YNofdg101.png

有了sticky權限,我們再來看:

wKiom1ekiiXQofEKAACIpvQYMug768.png

結果:別人的文件刪除不了,只能刪除自己的文件;當然root用戶可以刪除任何用戶的文件!

注意:sst權限必須要配合x權限,很好理解,沒有基本的執行權限,你這在執行權限之上的特權如何存在?皮之不存,毛將焉附!當sst變成SST的時候,則稱之爲sst權限異常。

wKiom1ekinyQ0q4gAABRR4YbYGk065.png

wKioL1ekiq-wU_fDAAAobBFBZq8748.png

liansir用戶也無法正常查看/testdir目錄下的文件列表了!

注意:在sst權限中,t權限可用數字標識法去掉,而s權限只能用字符去掉。

wKioL1ekiueCgnYoAAB0sl3Q8uY537.png

而在Centos 6.8中是可以的。

wKiom1ekkGvAzZeNAABMIKGDojc293.png

師曰:每執行一步都要檢查其結果,不要自認爲執行成功了!


試證明suid是繼承了可執行文件屬主的權限:

liansir發起一個cat進程:

wKioL1ekklfxbd2-AAAT87Ekpo0568.png

wKioL1eklLqCMOTGAAA98ftxSt4651.png

給/bin/cat可執行文件添加suid權限:

[root@localhost ~]# ll /bin/cat
-rwxr-xr-x. 1 root root 54048 Nov 20  2015 /bin/cat
[root@localhost ~]# chmod u+s /bin/cat
[root@localhost ~]# ll /bin/cat       
-rwsr-xr-x. 1 root root 54048 Nov 20  2015 /bin/cat
[root@localhost ~]#

讓liansir再次發起cat進程:

wKiom1eklNjCKBqCAAAgx7FYg2k241.png

wKiom1eklOWhJzT6AAAjmv3uFes065.png

可見,當/bin/cat這個可執行文件有了suid之後,liansir這個普通用戶改進的進程實質上是root幫其執行的!原來並不是“借勢”,而是有人暗中相助啊!

最後還有一個個性化的控制權限的工具,ACL,學習網絡的夥伴應該不陌生了,在網絡中,ACL是用來匹配感興趣的數據流,從而控制其走向;同樣在Linux中,ACL就是匹配感興趣的用戶,進而控制其權限的!具體詳情,看下回分解。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章