一文搞懂Linux權(quán)限體系
本文轉(zhuǎn)載自微信公眾號「小姐姐味道」,作者小姐姐養(yǎng)的狗。轉(zhuǎn)載本文請聯(lián)系小姐姐味道公眾號。
隨著年齡的增加,我的經(jīng)驗(yàn)越來越豐富,而記憶力卻越來越差。為了應(yīng)付繁重的日常事務(wù),我不得不準(zhǔn)備了長長的任務(wù)清單。每一條事項的背后,都在不斷的提醒我:無論生活中充滿什么驚喜,還是逃離不了它平庸的本質(zhì)。
而我對時間,會更加的敏感。每次一次敲擊鍵盤,都會調(diào)動骨關(guān)節(jié)的扭動,留下一洗不可撤回的痕跡:windows的超級用戶,名字叫做Administrator。這個單詞太長了,我總也記不住。相對來說,linux的超級用戶叫做root,只有四個字母。它的耗能值,比前者要低的多。
我們在第三小節(jié),剛接觸命令行的時候,就使用chmod命令,給普通文本文件,賦予了執(zhí)行權(quán)限。本小節(jié)將看一下用戶權(quán)限和文件權(quán)限這兩個息息相關(guān)的概念,
1、添加用戶
到現(xiàn)在為止,我們的系統(tǒng)中,還孤零零的只有這一個用戶,是時候?qū)W學(xué)女媧,捏幾個小泥人了。
首先創(chuàng)建兩個用戶:張三(zhang3)、李四(li4)。
- [root@localhost ~]# useradd zhang3
查看下面命令的三個輸出結(jié)果。
- # 系統(tǒng)中多了一個叫做zhang3的組,group文件保存了系統(tǒng)的組信息
- [root@localhost ~]# tail -n1 /etc/group
- zhang3:x:1000:
- # 系統(tǒng)中多了一個叫做zhang3的用戶,shadow文件保存了它們的密碼。很多安全滲透就是為了拿到它進(jìn)行暴力破解
- [root@localhost ~]# tail -n1 /etc/shadow
- zhang3:!!:18207:0:99999:7:::
- # home目錄中,多了一個叫做zhang3的目錄
- [root@localhost ~]# ll /home --full-time
- total 0
- drwx------. 2 zhang3 zhang3 83 2019-11-06 22:09:33.357165082 -0500 zhang3
接下來,給我們剛剛建立的用戶,使用passwd設(shè)置一個密碼。密碼需要輸入兩次進(jìn)行確認(rèn)。如果想要更改密碼,可以使用chpasswd命令。
- [root@localhost ~]# passwd zhang3
- Changing password for user zhang3.
- New password:
- BAD PASSWORD: The password is shorter than 8 characters
- Retype new password:
- passwd: all authentication tokens updated successfully.
那么如何刪除一個現(xiàn)有的用戶呢?這是通過userdel命令實(shí)現(xiàn)的。加上參數(shù)f,會在其他用戶使用系統(tǒng)的時候,強(qiáng)制退出。
- userdel -f zhang3
2、文件權(quán)限說明
從上面的命令執(zhí)行結(jié)果中,我們發(fā)現(xiàn)了有兩件非常有意思的東西。添加用戶后,除了在密碼文件shadow中增加了一些內(nèi)容,同時還在group文件中添加了信息。這涉及到用戶的兩個屬性:用戶名,組名。
一個用戶只有一個名稱代號,但是可以有多個組。下面命令創(chuàng)建一個密碼為123的用戶li4,并給它追加一個叫做zhang3的組??梢钥吹?etc/group文件中的信息變更。
- [root@localhost ~]# useradd -G zhang3 -p 123 li4
- [root@localhost ~]# tail -n 2 /etc/group
- zhang3:x:1000:li4
- li4:x:1001:
好啦,接下來切換到我們的文件權(quán)限上面。為了進(jìn)行下面命令的驗(yàn)證,我們首先創(chuàng)建一個名字叫confirm777.sh的腳本文件。為了讓腳本對所有用戶可見,我們把它創(chuàng)建在/tmp目錄下。
- cat > /tmp/confirm777.sh <<EOF
- echo $USER
- id
- EOF
使用ll命令查看文件信息。
- [root@localhost ~]# ll /tmp/confirm777.sh --full-time
- -rw-r--r--. 1 root root 13 2019-11-07 04:25:55.418254935 -0500 confirm777.sh
從ll的命令可以看出,文件的所有者是root用戶,文件所屬的組,也是root組,它的權(quán)限是rw-r--r--。文件權(quán)限分為三部分。
- 所有者權(quán)限,縮寫為u。文件的所有者所擁有的權(quán)限。也就是root用戶的權(quán)限,是rw-
- 組用戶權(quán)限,縮寫為g。文件所屬組內(nèi)所有用戶的權(quán)限。因?yàn)閞oot組內(nèi)只有root一個用戶,所以組用戶權(quán)限是r--。
- 其他用戶權(quán)限,縮寫為o。其他不相關(guān)用戶的權(quán)限,比如我們剛創(chuàng)建的zhang3、li4用戶,對文件的權(quán)限就是r--。
- 全部,縮寫為a,表示對上面三類用戶集體操作。
那rw-這些東西是什么意思呢?
- r 表示可讀權(quán)限。read。
- w 表示可寫權(quán)限。write。
- x 表示可執(zhí)行權(quán)限。execute。
- - 權(quán)限占位符,表示沒有當(dāng)前權(quán)限。
注意:一個用戶擁有文件的w權(quán)限,并不代表就可以刪除文件。w僅僅針對于文件內(nèi)容來說的。
一個文件,有3類用戶,每類用戶,有3種權(quán)限。使用最簡單的小學(xué)乘法,我們能夠得出,一個文件的權(quán)限位,需要3x3=9個標(biāo)志位表示。
我們的文件名稱,叫做confirm777.sh,這個名字是隨便起的么?當(dāng)然不是,777在linux代表特殊的含義,它代表文件對所有用戶具有可讀、可寫、可執(zhí)行的權(quán)限??梢韵胂?,如果每個文件都有這樣的權(quán)限,系統(tǒng)將無安全可言。那這一串?dāng)?shù)字是怎么來的呢?可以看下面的對照表。
- r 4 讀
- w 2 寫
- x 1 執(zhí)行
對以上三個屬性進(jìn)行任意組合,可以得到:
- 4 r-- 4+0+0
- 6 rw- 4+2+0
- 5 r-x 4+0+1
- 2 -w- 0+2+0
- 3 -wx 0+2+1
- 1 --x 0+0+1
- 7 rwx 4+2+1
3、文件權(quán)限更改
下面介紹三個文件權(quán)限相關(guān)的命令。一般常用的,就是chown和chmod。
chown 更改文件的所有者。chgrp 更改文件的組。chmod 更改文件權(quán)限。
接下來,我們把confirm777.sh的所有者和組,修改成剛剛創(chuàng)建的用戶zhang3。
- cd /tmp
- [root@localhost tmp]# chown zhang3:zhang3 confirm777.sh
- [root@localhost tmp]# ll confirm777.sh
- -rw-r--r--. 1 zhang3 zhang3 13 Nov 7 04:25 confirm777.sh
給文件所有者增加執(zhí)行權(quán)限。然后分別切換到zhang3,li4用戶執(zhí)行一下。
通過su 命令,可以切換到其他用戶,一般使用su -進(jìn)行環(huán)境變量的清理;而命令id,能夠看到當(dāng)前正在執(zhí)行的用戶信息。
- [root@localhost tmp]# chmod u+x confirm777.sh
- [root@localhost tmp]# su li4
- [li4@localhost tmp]$ ./confirm777.sh
- bash: ./confirm777.sh: Permission denied
- [li4@localhost tmp]$ exit
- exit
- [root@localhost tmp]# su zhang3
- [zhang3@localhost tmp]$ ./confirm777.sh
- root
- uid=1000(zhang3) gid=1000(zhang3) groups=1000(zhang3) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
可以看到,文件所有者zhang3可以執(zhí)行文件,但不相關(guān)的li4,提示沒有權(quán)限。接下來,我們驗(yàn)證用戶組相關(guān)的權(quán)限位。
- # 去掉zhang3的執(zhí)行權(quán)限
- root@localhost tmp]# chmod u-x confirm777.sh
- [root@localhost tmp]# ll confirm777.sh
- -rw-r--r--. 1 zhang3 zhang3 13 Nov 7 04:25 confirm777.sh
- # 增加zhang3組的執(zhí)行權(quán)限,由于li4在zhang3組里,它擁有權(quán)限
- [root@localhost tmp]# chmod g+x confirm777.sh
- [root@localhost tmp]# ll confirm777.sh
- -rw-r-xr--. 1 zhang3 zhang3 13 Nov 7 04:25 confirm777.sh
- # 切換到zhang3進(jìn)行執(zhí)行
- [root@localhost tmp]# su - zhang3
- [zhang3@localhost tmp]$ ./confirm777.sh
- bash: ./confirm777.sh: Permission denied
- [zhang3@localhost tmp]$ exit
- exit
- # 切換到li4進(jìn)行執(zhí)行
- [root@localhost tmp]# su - li4
- [li4@localhost tmp]$ ./confirm777.sh
- root
- uid=1001(li4) gid=1001(li4) groups=1001(li4),1000(zhang3) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
從命令的執(zhí)行結(jié)果可以看出。這次,li4能夠執(zhí)行文件,相反的,zhang3卻不能。
我們使用chmod命令來修改文件權(quán)限,使用的是類似于a+x這樣的英文字母。拿第一個腳本來說,初始的權(quán)限是rw-r--r--,也就是644,在這種情況下,下面的兩個腳本等效。
- chmod u+x confirm777.sh
- chmod 744 confirm777.sh
可以看到,第二個命令,使用的是數(shù)字樣式的權(quán)限位,多了一步人腦轉(zhuǎn)換過程。這在日常的使用中,是非常不方便的。所以,使用符號法的表示方式,能夠更加直觀,非常推薦。
為了更直觀的表現(xiàn)這個過程,我專門制作了一張圖。
4、目錄權(quán)限
這里有一個非常有意思的地方。把文件設(shè)置成可執(zhí)行,可以把普通文件變成腳本,目錄文件的可執(zhí)行權(quán)限是什么鬼?有什么意義?對文件夾來說:
- r 表示允許讀取目錄中的文件名,但不能進(jìn)入該目錄
- w 表示允許用戶修改目錄,可以創(chuàng)建、遷移、刪除、更名目錄下的文件
- x 可以獲得目錄下文件的列表,以及進(jìn)入目錄,執(zhí)行cd命令
關(guān)于r和x的區(qū)別,可以看下面的命令結(jié)果,仔細(xì)感受一下它們的區(qū)別。一般的,幾乎所有的目錄,都擁有執(zhí)行權(quán)限,不要隨意對其進(jìn)行設(shè)置。
- [root@localhost tmp]# su - li4
- [li4@localhost ~]$ cd /tmp
- [li4@localhost tmp]$ mkdir nox
- [li4@localhost tmp]$ touch nox/{a,b,c,d}
- [li4@localhost tmp]$ chmod a-x nox
- [li4@localhost tmp]$ ls nox
- ls: cannot access nox/a: Permission denied
- ls: cannot access nox/b: Permission denied
- ls: cannot access nox/c: Permission denied
- ls: cannot access nox/d: Permission denied
- a b c d
- [li4@localhost tmp]$ cat nox/a
- cat: nox/a: Permission denied
- [li4@localhost tmp]$ chmod a+x nox
- [li4@localhost tmp]$ chmod a-r nox
- [li4@localhost tmp]$ ls nox
- ls: cannot open directory nox: Permission denied
5、sticky bit
接下來,我們介紹一個比較燒腦的粘貼位。
假如你要刪除一個文件,你可以沒有這個文件的寫權(quán)限,但是你必須要擁有這個文件上級目錄的寫權(quán)限。如何創(chuàng)建一個目錄,可以讓任何人些人文件,但是又不能刪除其他用戶的文件?這就是stick bit的作用。粘貼位一般只用于目錄上,對文件來說并沒有什么用處。粘貼位一般使用t表示。
我們可以看一個典型的目錄/tmp
- [root@localhost tmp]# ls -dl /tmp
- drwxrwxrwt. 9 root root 4096 Nov 7 06:27 /tmp
可以看到,最后一位,顯示的是t,而不是x,意思是普通用戶不能刪除其他用戶的文件。所有用戶在/tmp目錄中,都可以隨意創(chuàng)建文件,但是卻刪除不了其他人的文件,即使文件的權(quán)限是777。
- [root@localhost tmp]# touch /tmp/stick
- [root@localhost tmp]# chown li4:li4 /tmp/stick
- [root@localhost tmp]# chmod 777 /tmp/stick
- [root@localhost tmp]# su - zhang3
- [zhang3@localhost ~]$ rm /tmp/stick
- rm: cannot remove ‘/tmp/stick’: Operation not permitted
6、小結(jié)
本小節(jié)創(chuàng)建了兩個用戶zhang3和li4,并拿它們測試了chown和chmod命令,最后介紹了粘貼位。linux比較安全的原因,就是因?yàn)橛斜容^詳盡的權(quán)限劃分。但權(quán)限是枚雙刃劍,超權(quán)用戶一個命令就可以搞垮系統(tǒng),許多隱藏的木馬,通過提權(quán)運(yùn)行在不為人知的地方。
權(quán)限相關(guān)的幾個命令會經(jīng)常被使用,下面舉幾個例子。
- # 設(shè)置/var/lib/mysql的用戶和組為mysql
- chown -R mysql:mysql /var/lib/mysql
- # 設(shè)置目錄可讀可寫,能夠上傳文件
- chmod 777 /var/www/uploads
- # 增加本目錄下所有sh的執(zhí)行權(quán)限
- chomd a+x *.sh
- # 變更file為可讀可寫可執(zhí)行
- chmod u=rwx,g=rwx,o=rwx file
7、思考&擴(kuò)展
1、下面這個命令,執(zhí)行以后,會發(fā)生什么情況?警告:不要執(zhí)行,哪怕把000改成其他數(shù)字。
- # R遍歷子目錄的意思
- chmod -R 000 /
2、有一天,我看到一個命令chmod u+s file,文中并沒有介紹s是什么意思,這是什么意思?
3、如何刪除一個用戶的組?
EndLinux系統(tǒng)的命令是十分枯燥的。本系列不知不覺已經(jīng)持續(xù)了8個周。和預(yù)想的一樣,它并未取得廣泛的歡迎,從它和其他文章迥然的閱讀量就可以看出--標(biāo)題就讓人失去了點(diǎn)擊的欲望。
技術(shù)類文章完全不同于扯淡型的天馬行空,耗費(fèi)的精力也是巨大的,尤其對我一個對正確性有強(qiáng)迫癥的人來說。有時候,我會產(chǎn)生迷茫。不知道這依靠興趣支撐的輸出,能夠持續(xù)多久。
能夠翻到結(jié)尾,翻到這里的朋友,xjjdog非常感謝。還有幾篇就要結(jié)束了,加上以前關(guān)于Linux的一些文章,已經(jīng)可以成為一個體系了。如果你跟蹤至此,至少已經(jīng)可以在平常的工作中游刃有余了。
xjjdog接下來會找一些讓人歡迎的主題,而不是這么枯燥的知識點(diǎn)。畢竟,有的時候,人家畢竟還是個可愛的女孩紙嘛。
作者簡介:小姐姐味道 (xjjdog),一個不允許程序員走彎路的公眾號。聚焦基礎(chǔ)架構(gòu)和Linux。十年架構(gòu),日百億流量,與你探討高并發(fā)世界,給你不一樣的味道。我的個人微信xjjdog0,歡迎添加好友,進(jìn)一步交流。