-
權限(rwx、sst、umask)
-
chown
-
chmod
-
ACL(見下篇)
試驗環境:CentOS 7.2 與CentOS 6.8,具體會在應用場景明確指出
權限
Linux系統對用戶與組的管理,其具體操作手段就是對于權限的分配,而常見的權限分配工具有 rwx, sst, umask, ACL. 跟用戶與組有uid和gid一樣,權限也有自己的數字標識,用八進制數表示。 我們先逐一作個簡單認知,其具體的應用就在后面的實驗中慢慢說明了!
rwx
當我們在ls -l 時,會看見如下字段:九個位,每三位一組,每個組有對應的對象
這就是我們通常所說的一般權限標識:
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是對目錄中文件的一種保護,但只能應用于目錄,而具有寫權限的目錄,用戶通??梢詣h除該目錄下的任何文件,而
給目錄設置了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通常就說后三位。
常用參數
-
-S: 以符號方式輸出權限掩碼
-
-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才可以使用該命令。
常用參數
-
-c: –changes, 僅回顯被更改的部分
-
-h: –no-dereference, 只對符號鏈接的文件做修改,而不更改其他任何文件
-
-R: –recursive, 遞歸處理,將指定目錄下的所有文件及其子目錄一并處理
-
-v: –verbose, 回顯指令執行過程
-
–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下面的文件及子目錄屬主不變
[root@centos6 liansir]# chown -R wang dir2 # dir2下的文件及子目錄結構遞歸改變了
[root@centos6 home]# chown wangcai --dereference=wang # 給目錄wangcai引用目錄wang屬主屬組
關于chown的幾種寫法:
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;
常用參數
-
-c: –changes, 僅回顯被更改的部分
-
-R: –recursive, 遞歸處理,將指定目錄下的所有文件及其子目錄一并處理
-
-v: –verbose, 回顯指令執行過程
-
–dereference: 引用其它文件的權限屬性,即把指定文件或目錄的權限屬性變成參考文件的權限屬性
使用示例
[root@centos6 ~]# chmod g+w laohu
[root@centos6 liansir]# chmod -R g+rwX dir2
所以,rwx對于文件的意義
r: 文本 w: 可修改內容,但不能刪除文件本身 x: 針對二進制的程序或腳本 X: 不會增加x(前提本身無x權限)
如果其它用戶對目錄缺少寫權限,則無法創建與刪除目錄下的文件
如果其它用戶對目錄只有x權限,則
如果其它用戶對目錄只有w權限,則
所以,rwx對于目錄的意義:
r:可以查看目錄內的文件列表,但不能訪問文件,不能cd進去,不能查看文件的元數據 w:可以創建或刪除目錄中的文件,要配合x權限 x:可以進入目錄,可以訪問目錄中的文件,但不能查看目錄內的文件列表 X:針對目錄加x權限,而對文件不加x權限
利用數字標識修改權限:
[root@centos6 dir1]# chmod 640 f1 [root@centos6 dir1]# chmod 111 f2
引用其它文件的權限屬性:
[root@centos6 testdir]# chmod --reference /etc/shadow dir1
接下來,我們來幾個關于特殊權限sst的試驗:環境—CentOS 7.2
對于二進制可執行程序,必須要有x權限才能運行:
由id liansir可看出,liansir既不是/etc/cat的屬主,也不屬于root組,所以就只能以other的角色運行cat,又因為chmod o=r 去掉了other原來的x權限,所以在cat /etc/issue時cat程序運行出錯。
當一個程序運行起來之后,就是一個進程,而一個進程能否啟動取決于發起者對程序文件是否擁有可執行權限。 而liansir 既非文件的屬主,亦不是文件屬組的成員,就只能以other的角色來運行程序,可other只有r權限無x權限,最終導致程序運行出錯!
此時我們再恢復other的x權限:
[root@centos6 ~]# ps aux
可見cat這個進程又成功執行了!
但是,例外發生了:
其他用戶liansir竟然可以執行passwd成功修改密碼,這意味著在/etc/shadow里面寫入了東西,而/etc/shadow這個機密文件除了超級用戶其他人都是看不了的,更何況寫入密碼!
我們通過which 命令得到passwd的絕對路徑,然后查看其權限發現其屬主的權限為rws, 這個s就是所謂的suid. 而s權限的好處是程序的發起者可以繼承程序屬主的權限,此處,是liansir繼承了root的權限,從而成功修改的密碼。
我們再來反證一下:去掉s權限,再讓liansir修改密碼看能否成功!
[root@localhost ~]# chmod u-s /usr/bin/passwd
再用數字標識恢復該文件的s權限:
[root@localhost ~]# chmod 4755 /usr/bin/passwd
suid真是一把利斧,想想,如果給文本編輯器nano或者vi給予s權限。。。引得想像力無限,如果一旦這樣,就只能把其屬主修改為一個擁有普通權限的普通用戶了!
sgid與suid是一樣的思路,只不過是把可執行程序繼承其屬主的規則移花接木到繼承其屬組的規則,不同的是,sgid還應用于目錄,通常用來創建協作目錄。
從
上圖可看到,雖然給/bin/cat
添加了sgid權限,liansir用戶應該是繼承了root組的權限,但也沒能打開/etc/shadow文件,這是因為/etc/shadow本身的
特殊權限問題,root組也無權限訪問。你可能會問,如果設置成suid,/etc/shadow也沒有給root帳號任何權限啊,那為什么
liansir用戶就可以訪問呢?因為它繼承的是root帳號的權限,而非root組(普通組或管理組)的權限。任何權限對于超級用戶root而言是沒有
任何意義的,誰讓root是老子天下第一了!?。?/p>
同樣,我們得反證一下,既然/etc/shadow沒有給屬組r的權限,導致liansir空歡喜一塊,那就給其屬組r的權限,再看:
成功讀取!
用數字標識修改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和其屬主!
上
圖中,用戶wangcai對于liansir來說是其它用戶,擁有r權限,但wangcai卻所liansir的文件f1給刪除了,豈有此理,有人可以隨
時把你的東西給扔了(linux是一個多任務多用戶的操作系統),這是為何,wangcai只是liansir的其它用戶,且只有r權限,沒有w權限,怎
么就把liansir的f1文件就給刪除了呢???這是因為其父目錄有w寫權限?。。榱朔乐鼓骋挥脩綦S意刪除其他用戶的文件,Sticky權限應用而生!
經目錄添加sticky權限:
[root@localhost /]# chmod o+t /testdir/
有了sticky權限,我們再來看:
結果:別人的文件刪除不了,只能刪除自己的文件;當然root用戶可以刪除任何用戶的文件!
注意:sst權限必須要配合x權限,很好理解,沒有基本的執行權限,你這在執行權限之上的特權如何存在?皮之不存,毛將焉附!當sst變成SST的時候,則稱之為sst權限異常。
liansir用戶也無法正常查看/testdir目錄下的文件列表了!
注意:在sst權限中,t權限可用數字標識法去掉,而s權限只能用字符去掉。
而在Centos 6.8中是可以的。
師曰:每執行一步都要檢查其結果,不要自認為執行成功了!
試證明suid是繼承了可執行文件屬主的權限:
liansir發起一個cat進程:
給/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進程:
可見,當/bin/cat這個可執行文件有了suid之后,liansir這個普通用戶改進的進程實質上是root幫其執行的!原來并不是“借勢”,而是有人暗中相助?。?/p>
最后還有一個個性化的控制權限的工具,ACL,學習網絡的伙伴應該不陌生了,在網絡中,ACL是用來匹配感興趣的數據流,從而控制其走向;同樣在Linux中,ACL就是匹配感興趣的用戶,進而控制其權限的!具體詳情,看下回分解。
原創文章,作者:Liansir,如若轉載,請注明出處:http://www.www58058.com/29938
文章整體思路清晰,對命令的的操作也有了自己的思考與總結。